Переключение ветвей, не касаясь рабочего дерева?
В настоящее время я нахожусь в ветке отладки и хочу переключиться на главную ветку, не изменяя рабочее дерево (оставьте это так, как оно есть в ветке отладки), поэтому я могу зафиксировать некоторые изменения в главном ветвь.
Есть ли способ сделать это?
Ответы
Ответ 1
Хотя вы должны быть осторожны с этой командой, вы можете reset направить указатель на мастер без изменения индекса или рабочего дерева с помощью:
git symbolic-ref HEAD refs/heads/master
Вероятно, вы должны reset указатель, чтобы вы могли выборочно применять изменения рабочего дерева, иначе вы можете завершить все различия между мастером и веткой отладки, что, вероятно, плохо.
git reset
После того, как вы сделали фиксацию, которую хотите сделать, вы можете вернуться в ветку отладки с помощью:
git symbolic-ref HEAD refs/heads/debug-branch
git reset
Ответ 2
Вы можете сделать следующее:
git checkout --detach
git reset --soft master
git checkout master
Пояснение:
Если вы находитесь в ветке debug
и выполняете git reset --soft master
, вы оставите рабочее дерево и индексируете нетронутым и перейдете к пунктам commit master
. Проблема в том, что debug
будет reset для этого фиксации тоже. Таким образом, ваши фиксации на debug
"потеряны" (ну, не совсем, но они больше не доступны напрямую), и вы все еще находитесь в ветки debug
.
Чтобы предотвратить перемещение git reset
debug
, но все еще установив HEAD
в фиксацию master
, сначала сделайте git checkout --detach
, чтобы указать HEAD
прямо на текущую фиксацию (см. man git-checkout
, раздел "DETACHED HEAD" ). Затем вы можете сделать reset, не касаясь ветки debug
.
Теперь HEAD
указывает непосредственно на точку фиксации master
, т.е. она все еще отсоединена. Вы можете просто git checkout master
подключиться к master
и теперь готовы к фиксации в ветки master
.
Ответ 3
Вы можете зачеркнуть (git stash
) свои изменения, переключить ветки, разблокировать (git stash pop
) свои изменения, добавить и зафиксировать изменения.
Если вам нужно точное состояние отладки, просто слейте debug в master (или reset master для отладки).
Ответ 4
Ниже приведен пример рабочего процесса
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
В качестве альтернативы вы можете просто зафиксировать соответствующие изменения "здесь" и нажать/выбрать вишневый на главной ветке.
Ответ 5
Насколько я знаю, вы не можете. Переключение ветки означает проверку в рабочей копии версии кода, который находится в HEAD этой ветки.
Вы хотите merge
ваши ветки. У
git checkout master
git merge devel
Теперь ветки будут синхронизированы. Если вы хотите объединить подмножество изменений, вы можете указать фиксацию или диапазон коммитов.
Также посмотрите cherry-pick
Например:
git checkout master
git cherry-pick devel
Слияние последнего фиксации в devel обратно в master.
Если вам нужно объединить две ветки, которые сидят на разных хостах, посмотрите на git pull и git push.