Git checkout ничего не меняет
Мне очень нравится git. По крайней мере, мне нравится идея ЖКТ. Возможность проверить мой мастер-проект как отдельную ветку, где я могу изменить все, что хочу, без риска испортить все остальное, потрясающе. Но это не работает.
в принципе, мой рабочий процесс выглядит так:
- проверка стабильной версии в новую ветку, чтобы поэкспериментировать с новым кодом
- сделайте кучу изменений - у меня нет намерения держать что-либо из этого, я просто экспериментирующий.
- смотреть на все вещи, которые я изменил
- добавить все изменения, которые будут отслеживаться
- зафиксируйте ветку и нажмите ветку в origin (если это сработало, в противном случае пропустите этот шаг)
- решите попробовать другой метод, вернитесь к master
- наблюдайте за артефактами из экспериментальной ветви, в которой я работал, хотя я нахожусь в главной ветви.
каждый раз, когда я проверяю ветку на другую ветку, сделайте изменения в одной ветви, а затем проверка исходной ветви, у меня все еще есть все файлы и изменения, которые произошли в другой ветви. Это становится чрезвычайно сложно. Я читал, что это может произойти, когда у вас есть файлы, открытые в IDE при этом, но я был довольно осторожен в этом, и оба закрыли файлы в IDE, закрыли IDE и выключили мой сервер rails перед переключением ветвей, и это все еще происходит. Кроме того, запуск "git clean-f" либо удаляет все это произошло после некоторой произвольной фиксации (и случайным образом), или, как в последнем случае, ничего не изменило обратно в исходное состояние.
Я думал, что правильно использую git, но на данный момент я нахожусь в тупике. Я пытаюсь работать с кучей экспериментальный код, используя стабильную версию моего проекта, но мне приходится вручную отслеживать и фиксировать все изменения, которые я сделал. Есть идеи или предложения?
git checkout -b photo_tagging
git branch # to make sure it's right
# make a bunch of changes, creations, etc
git status # see what's changed since before
git add . # approve of the changes, I guess, since if I do git commit after this, it says no changes
git commit -m 'these are changes I made'
git checkout master
git branch #=> *master
# look at files, tags_controller is still there, added in photo_tagging
# and code added in photo_tagging branch are still there in *master
это, кажется, происходит, делаю ли я фиксация или нет на ветке.
3 ответов
вот пример того, как использовать Git и ветви.
$ git branch
* master
organize
$ git branch networking
$ git checkout networking
$ git branch
master
* networking
organize
теперь Мастер был обновлен много раз, так как кто-нибудь сделал что-нибудь в сети
$ git pull origin networking
From github.com:dlundquist/Asteroids
* branch networking -> FETCH_HEAD
CONFLICT (rename/delete): Rename src/ServerClientThread.java->src/ServerConnectionThread.java in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 and deleted in HEAD
Auto-merging src/Actor.java
Auto-merging src/Asteroids.java
CONFLICT (content): Merge conflict in src/Asteroids.java
Auto-merging src/BasicWeapon.java
CONFLICT (content): Merge conflict in src/BasicWeapon.java
CONFLICT (delete/modify): src/DedicatedServer.java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/DedicatedServer.java left in tree.
Auto-merging src/MainMenu.java
CONFLICT (content): Merge conflict in src/MainMenu.java
CONFLICT (delete/modify): src/NetworkClientThread.java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkClientThread.java left in tree.
CONFLICT (delete/modify): src/NetworkUpdate.java deleted in HEAD and modified in 92d5b7c4e7c4110803eabf5d5152e7f2a337d722. Version 92d5b7c4e7c4110803eabf5d5152e7f2a337d722 of src/NetworkUpdate.java left in tree.
Auto-merging src/ScenePanel.java
CONFLICT (content): Merge conflict in src/ScenePanel.java
Auto-merging src/Shield.java
CONFLICT (content): Merge conflict in src/Shield.java
Auto-merging src/Sprite.java
Auto-merging src/TripleShotWeapon.java
Auto-merging src/Weapon.java
Automatic merge failed; fix conflicts and then commit the result.
mjolnir:Asteroids Durandal$ git status
# On branch networking
# Changes to be committed:
#
# modified: src/Actor.java
# modified: src/Sprite.java
# modified: src/TripleShotWeapon.java
# modified: src/Weapon.java
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: src/Asteroids.java
# both modified: src/BasicWeapon.java
# deleted by us: src/DedicatedServer.java
# both modified: src/MainMenu.java
# deleted by us: src/NetworkClientThread.java
# deleted by us: src/NetworkUpdate.java
# both modified: src/ScenePanel.java
# added by them: src/ServerConnectionThread.java
# both modified: src/Shield.java
ого, ГИТ действительно сумасшедший. Похоже, мастер слишком далеко опережает сеть для git, чтобы делать ВСЮ работу за меня.
$ git reset --hard networking
HEAD is now at 20d6ee8 done tweaking game on the main branch. Fixed a few bugs with the TripleShotWeapon. Rebalanced the gameMechanics() in Asteroids to increase the difficulty as the levels increase.
mjolnir:Asteroids Durandal$ git status
# On branch networking
nothing to commit (working directory clean)
хорошо, теперь я "назад во времени", когда сеть в последний раз толкнул к origin. Но я действительно должен вернуться и слиться с мастером сейчас, прежде чем делать какую-либо работу. Другие мудрые это будет даже трудно слиться.
время, потраченное на объединение файлов
$ git add (insert conflict resolved files here)
$ git commit -a -m "Merged networking with master"
$ git checkout master
$ git branch
* master
networking
organize
теперь применяем наши изменения.
$ git merge networking
Already up-to-date.
вы можете сделать это, если вам нравится "да!"
$ git merge origin networking
Already up-to-date. Yeeah!
нажмите наши изменения в мире
$ git push origin master
У меня была эта проблема, когда я попытался переключить temp на другую ветку из главной ветви, и когда я бы что-то изменил на этой странице temp и без фиксации изменений я бы снова проверил главную ветвь, он фактически объединил все изменения из временной ветви в MASTER.
ответ:
всякий раз, когда вы оформляете заказ на ветку TEMP, зафиксируйте свои изменения. Таким образом, если вы зафиксируете их на ветке TEMP и checkout MASTER снова, он будет работать как предполагаемый.
Мне нравится объяснять git на общем языке. Ответ: это из-за предположения, что изменение ветвей (checkout) приведет вас к другому "рабочему пространству". Git этого не делает (хотя это кажется более естественным, и у многих есть это недоразумение).
вместо этого ветви похожи на теги, так сказать. Таким образом, вы можете танцевать вокруг ветвей, делать какую-то работу, изменять вещи, снова танцевать, а затем совершать. Тогда коммит будет съеден последней веткой, на которую вы пошли! Кассе только изменения "тег" / ветка, которую вы будете использовать, точка.
обновление после комментария Мартаса
Это относится к тому, когда ваша ветка и ваш мастер синхронизируются (относительно отслеживаемых файлов) или с неотслеживаемыми файлами. Если на самом деле они находятся в разных состояниях, при проверке файлы и папки фактически исчезнут и снова появятся. Если у вас есть изменения, отслеживаемые, но не комментируемые, то git фактически отменит проверку, и вам нужно либо зафиксировать, либо спрятать их.