Git checkout ничего не меняет - PullRequest
39 голосов
/ 23 декабря 2010

Мне очень нравится Git.По крайней мере, мне нравится идея мерзавца.Возможность извлекать мой главный проект в виде отдельной ветки, где я могу изменить все, что захочу, без риска испортить все остальное, это здорово.Но это не работает.

По сути, мой рабочий процесс выглядит следующим образом:

  1. Извлечение стабильной версии в новую ветку для экспериментов с новым кодом
  2. Создайте кучуизменения - у меня нет намерения сохранять что-либо из этого, я просто экспериментирую.
  3. Посмотрите на все, что я изменил
  4. Добавьте все изменения, которые нужно отслеживать
  5. Зафиксируйте ветвь и отправьте ветку в начало (если это сработало, в противном случае пропустите этот шаг)
  6. Решите попробовать другой метод, вернитесь к мастеру
  7. Наблюдайте артефакты из экспериментальной ветви Iработал, хотя я нахожусь в основной ветке.

Каждый раз, когда я извлекаю ветку в другую ветку, вносим изменения в одну ветку, а затем извлекаю исходную ветку,У меня все еще есть все файлы и изменения, которые произошли в другой ветке.Это становится чрезвычайно разочаровывающим.Я читал, что это может случиться, когда у вас при этом открываются файлы в 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 ]

18 голосов
/ 26 мая 2016

У меня была эта проблема, когда я пытался переключить временную ветку на другую ветку из главной ветви, и когда я что-то изменил на этой временной странице, и без фиксации изменений я снова извлек бы основную ветку, она фактически объединила все изменения ветка ТЕМП в МАСТЕР.

ОТВЕТ:

Всякий раз, когда вы оформляете заказ в филиале TEMP, ПРИНИМАЙТЕ свои изменения. Таким образом, если вы фиксируете их в ветке TEMP и снова проверяете MASTER, все будет работать как положено.

15 голосов
/ 23 декабря 2010

Вот пример того, как использовать 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)

Хорошо, теперь я "вернулся во времени", когда сеть в последний раз была переведена на источник. Но я действительно должен вернуться и слиться с Учителем сейчас, прежде чем я сделаю какую-либо работу. В противном случае будет даже трудно объединиться.

Время, затраченное на объединение файлов

$ 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
3 голосов
/ 24 ноября 2017

Мне нравится объяснять git на общем языке. Ответ: это из-за предположения, что смена ветвей (оформление заказа) приведет вас в другое «рабочее пространство». Git этого не делает (хотя это кажется более естественным, и у многих есть это недоразумение).

Вместо этого ветки, так сказать, похожи на теги. Таким образом, вы можете танцевать вокруг ветвей, делать какую-то работу, изменять вещи, танцевать снова, а затем совершать коммиты. Тогда коммит будет в последней ветке, на которую вы пошли! Оформление заказа только изменяет «тег» / ветку, которую вы будете использовать, точка.

ОБНОВЛЕНИЕ после комментария Мартаса

Это относится к случаям, когда ваша ветка и ваш мастер синхронизируются (относительно отслеживаемых файлов) или с неотслеживаемыми файлами. Если на самом деле они находятся в разных состояниях, то при извлечении файлы и папки фактически исчезают и снова появляются. Если вы отслеживаете изменения, но не фиксируете их, git фактически прервет проверку и вам придется либо зафиксировать, либо спрятать их.

...