Переключение веток, не касаясь рабочего дерева? - PullRequest
40 голосов
/ 20 мая 2011

Я в настоящее время нахожусь в ветви отладки, и хотел бы переключиться на главную ветку, не изменяя рабочее дерево (оставьте это, как это находится в ветви отладки), таким образом я могу передать некоторые изменения в главную ветку филиал.

Есть ли способ сделать это?

Ответы [ 5 ]

47 голосов
/ 14 апреля 2013

Вы можете сделать следующее:

git checkout --detach
git reset --soft master
git checkout master

Объяснение:

Если вы находитесь на ветке debug и сделаете git reset --soft master, вы бы покинули свое рабочее деревои индекс не тронут и перейти к фиксации master указывает на.Проблема в том, что debug также будет сброшен в этот коммит.Таким образом, ваши коммиты на debug «потеряны» (ну, не совсем, но они больше не доступны напрямую), и вы все еще находитесь на ветке debug.

Чтобы предотвратить перемещение git reset debug но все же устанавливая HEAD для коммита master, вы сначала git checkout --detach указываете HEAD непосредственно на ваш текущий коммит (см. man git-checkout, раздел «DETACHED HEAD»),Затем вы можете выполнить сброс, не касаясь ветви debug.

Теперь HEAD указывает непосредственно на коммит, на который указывает master, т.е. он все еще отсоединен.Вы можете просто git checkout master присоединиться к master и теперь готовы к фиксации в ветке master.

46 голосов
/ 20 мая 2011

В этом ответе используются низкоуровневые «слесарные» команды.Быть осторожен.Если вы предпочитаете команды фарфор , используйте этот ответ , который дает те же результаты.индекс или рабочее дерево с:

git symbolic-ref HEAD refs/heads/master

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

git reset

Как только вы сделали коммит, который хотите сделать, вы можете вернуться в свою ветку отладки с помощью:

git symbolic-ref HEAD refs/heads/debug-branch
git reset
9 голосов
/ 20 мая 2011

Вы можете хранить (git stash) свои изменения, переключать ветки, отменять (git stash pop) свои изменения, добавлять и фиксировать изменения.

Если вы хотите точное состояние отладки, просто объедините debug с master (или сбросьте master для отладки).

3 голосов
/ 20 мая 2011

Вот необработанный рабочий процесс

 git stash
 git checkout otherbranch
 git stash apply
 git reset
 git add # interactively? just add the hunks/changes you want to commit
 git commit

И чтобы вернуться назад

 git reset --hard # watch it here! make sure you haven't added more changes that you wanted to keep
 git checkout debug
 git stash pop

В качестве альтернативы, вы можете просто зафиксировать соответствующие изменения «здесь» и нажать / cherry-pick намастер ветка.

0 голосов
/ 20 мая 2011

Насколько я знаю, ты не можешь.Переключение веток означает получение в рабочей копии версии кода, которая находится в HEAD этой ветки.

Вы хотите merge своих ветвей.Do

git checkout master
git merge devel

Теперь ветви будут синхронизированы.Если вы хотите объединить подмножество изменений, вы можете указать коммит или диапазон коммитов.Также взгляните на cherry-pick Например:

git checkout master
git cherry-pick devel

Объединит последний коммит в devel обратно в master.

Если вам нужно объединить две ветвикоторые сидят на разных хостах, посмотрите на git pull и git push.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...