Другие ответы, предлагающие проверить другую ветвь, а затем совершить ее, работать, только если проверка возможна с учетом локальных изменений. Если нет, то вы в самом общем случае использования для git stash
:
git stash
git checkout other-branch
git stash pop
Первый stash
прячет свои изменения (в основном делает временной фиксации), и последующее stash pop
повторно применяет их. Это позволяет git использовать возможности слияния.
Если при попытке вскрыть тайник вы столкнетесь с конфликтами слияния ... следующие шаги зависят от того, что это за конфликты. Если все спрятанные изменения действительно принадлежат к этой другой ветке, вам просто придется их сортировать - это следствие внесения изменений в неправильную ветку.
С другой стороны, если вы действительно перепутались, и ваше дерево работ содержит сочетание изменений для двух ветвей, а конфликты - только те, которые вы хотите зафиксировать на исходной ветке, вы может сэкономить некоторую работу. Как обычно, есть много способов сделать это. Вот один, начиная с после того, как вы поп и увидеть конфликты:
# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset
# Add the things you *do* want to commit here
git add -p # or maybe git add -i
git commit
# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop
# Add the changes meant for this branch
git add -p
git commit
# And throw away the rest
git reset --hard
В качестве альтернативы, если вы понимаете, до того времени, что это будет происходить, просто совершать вещи, которые принадлежат на текущей ветке. Вы всегда можете вернуться и изменить этот коммит:
git add -p
git commit
git stash
git checkout other-branch
git stash pop
И, конечно, помните, что все это занимает немного работы, и избежать его в следующий раз, возможно, наложив свое текущее имя ветки в вашей строке путем добавления $(__git_ps1)
к вашему PS1 в вашем bashrc. (См. Например, документы Git in Bash.)
Когда вы сказали: 'Проверка ветви, а затем фиксация будет работать, только если проверка возможна с учетом локальных изменений'. Что вы имеете в виду? Не могли бы вы дать или обсудить один простой пример, если это не удастся? –
@ user815423426 Если у вас есть незафиксированные изменения, вы можете проверить другую ветку, если и только если набор файлов, которые вы изменили, и набор файлов, которые отличаются между двумя ветвями, не пересекаются. То есть, если вы изменили файл A, вы можете проверить другую ветку, только если файл A в обеих ветвях одинаковый. – Cascabel
Спасибо! Когда вы сказали, что «A» одинаково в обеих ветвях, вы имеете в виду «A» перед моими изменениями (т. Е. 'A' в HEAD каждой ветви). Верный? –