Как объединить мои локальные незафиксированные изменения в другую ветку Git?

Как я могу сделать это в Git:

моя текущая ветвь-branch1, и я внес некоторые локальные изменения. Однако теперь я понимаю, что на самом деле я хотел применить эти изменения к branch2. Есть ли способ применить / объединить эти изменения, чтобы они стали локальными изменениями на branch2 без их фиксации на branch1?

6 ответов


так как ваши файлы еще не зафиксированы в branch1:

git stash
git checkout branch2
git stash pop

или

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

как прокомментировал by benjohn (см. git stash man page):

чтобы также заначить в настоящее время неотслеженные (недавно добавленные) файлы, добавьте аргумент -u, так:

git stash -u

Stashing, временные коммиты и перебазирование могут быть излишними. Если вы еще не добавили измененные файлы в индекс, вы можете просто проверить другую ветку.

git checkout branch2

это будет работать до тех пор, пока файлы, которые вы редактируете, не отличаются между branch1 и branch2. Он оставит вас на branch2 с сохраненными рабочими изменениями. Если они отличаются, Вы можете указать, что хотите объединить локальные изменения с изменениями, введенными переключение ветвей с помощью для оформления заказа.

git checkout -m branch2

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

git reset

вот более короткая альтернатива ранее упомянутому подходу к тайнику:

временно переместите изменения в тайник.

git stash

создать и переключиться на новую ветку, а затем поп тайник к нему всего за один шаг.

git stash branch new_branch_name

затем add и commit изменения в этой новой отрасли.


предупреждение: не для новичков git.

этого достаточно в моем рабочем процессе, что я почти попытался написать для него новую команду git. Обычный git stash поток-это путь но немного неловко. Я обычно делаю новую фиксацию сначала с если я смотрел на изменения, вся информация свежа в моем уме и лучше просто начать git commit - ing, что я нашел (обычно исправление, принадлежащее мастеру, что я обнаружите, работая на отдельную ветку) сразу.

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

Итак, как я достигаю этого, выглядит так:

  1. git commit изменения сразу же с хорошим сообщением фиксации.
  2. git reset HEAD~1 чтобы отменить фиксацию текущих отделение.
  3. (необязательно) продолжить работу над функцией.

иногда позже (асинхронно), или сразу в другом окне терминала:

  1. cd my-project-master который является еще одним WD, разделяющим то же самое .git
  2. git reflog чтобы найти исправление, которое я только что сделал.
  3. git cherry-pick SHA1 коммита.

дополнительно (все еще асинхронный) вы можете затем перебазировать (или объединить) ветвь функции, чтобы получить исправление, обычно, когда вы собираетесь отправить PR и уже очистили свою ветку функций и WD:

  1. cd my-project который является основным WD, над которым я работаю.
  2. git rebase master чтобы получить исправления.

таким образом, я могу продолжать работать над функцией бесперебойно и не беспокоиться о git stash - ing что-нибудь или необходимость очистки моего WD перед git checkout (а затем снова проверить функцию ветви backout.) и все еще есть все мои исправления к master вместо скрытого в моей ветви функции.

ИМО git stash и git checkout реальная Пиа, когда вы находитесь в середине работы над какой-то большой объект.


Если бы речь шла о зафиксированных изменениях, вы должны взглянуть на git-rebase, но, как указано в комментарии VonC, поскольку вы говорите о локальных изменениях, git-stash, безусловно, был бы хорошим способом сделать это.


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

как совершить другую ветвь в git

у вас есть незафиксированные изменения на my_branch что вы хотите совершить master, без фиксации всех изменений от my_branch.

пример

git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop

объяснение

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

на (Он же --include-untracked) в git stash -u предотвращает потерю неотслеженных файлов, когда вы позже делаете git clean -f -d внутри master.

после git checkout master важно, чтобы вы не git stash pop, потому что вам это понадобится заначка позже. Если вы поп-тайник, созданный в my_branch и затем сделать git stash на master, вы вызовете ненужные конфликты слияния, когда позже примените этот тайник в my_branch.

git reset unstages все в результате git stash apply. Например, файлы, которые были изменены в тайнике, но не существуют в master получить постановку как" удаленные нами " конфликты.

git checkout . и git clean -f -d отбросить все, что не зафиксировано: все изменения в отслеживаемых файлах и все неотслеживаемые файлы и каталоги. Они уже сохранены в тайнике, а если остались в master вызовет ненужные конфликты слияния при переключении обратно в my_branch.

последние git stash pop будет основано на оригинале my_branch, и поэтому не будет вызывать конфликтов слияния. Однако, если ваш тайник содержит неотслеженные файлы, которые вы передали мастеру, git будет жаловаться, что он "не смог восстановить неотслеженные файлы из тайника". Чтобы разрешить этот конфликт, удалите эти файлы из рабочее дерево, тогда git stash pop, git add . и git reset.