Это часто случается со мной: я пишу некоторый код, проверяю свои изменения, а затем понимаю, что я не в соответствующей ветке для проверки этих изменений. Однако я не могу переключиться на другую ветку без возврата изменений. Есть ли способ перенести изменения в другую ветку для проверки там?
422
C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
Если вы еще не зафиксировали свои изменения , просто используйте,
git checkout
чтобы перейти к новой ветви, а затем зафиксировать их как обычно - изменения в файлах не привязаны к определенной ветви, пока вы не подтвердите их.Если бы уже зафиксировали изменения:
git log
и запомните SHA коммита, который вы хотите переместить.git cherry-pick SHA
заменив SHA сверху.git reset HEAD~1
для сброса назад перед фиксацией неправильной ветки.cherry-pick
берет данный коммит и применяет его к текущему извлеченному заголовку, что позволяет вам копировать коммит в новую ветку.источник
git reset HEAD~N --soft
а затемgit checkout -b
переместить весь теперь незафиксированный код в новую ветку.К сожалению, это происходит со мной довольно регулярно, и я использую,
git stash
если я понял свою ошибку раньше,git commit
и используюgit cherry-pick
иначе, обе команды объяснены довольно хорошо в других ответахЯ хочу добавить пояснение для
git checkout targetBranch
: эта команда сохранит только ваш рабочий каталог и промежуточный снимок, если targetBranch имеет ту же историю, что и ваша текущая ветка.Заявление @Amber не является ложным, когда вы переходите в newBranch ,
git checkout -b newBranch
создается новый указатель, который указывает на тот же коммит, что и ваша текущая ветвь.На самом деле, если у вас есть другая ветка, которая делится историей с вашей текущей веткой (обе указывают на один и тот же коммит), вы можете «переместить свои изменения»
git checkout targetBranch
Однако обычно разные ветви означают разную историю, и Git не позволит вам переключаться между этими ветками с грязным рабочим каталогом или промежуточной областью. в этом случае вы можете сделать
git checkout -f targetBranch
(очистить и выбросить изменения) илиgit stage
+git checkout targetBranch
(очистить и сохранить изменения), простой запускgit checkout targetBranch
выдаст ошибку:источник
Мягкий сброс мерзавец поместит зафиксированные изменения обратно в свой индекс. Затем проверьте ветку, которую вы намеревались зафиксировать. Затем git commit с новым сообщением commit.
git reset --soft <commit>
git checkout <branch>
git commit -m "Commit message goes here"
Из git docs :
источник