Как я могу сделать следующее в Git?
Моя текущая ветвь - это branch1, и я сделал некоторые локальные изменения. Однако теперь я понимаю, что на самом деле я хотел применить эти изменения к branch2. Есть ли способ применить / объединить эти изменения, чтобы они стали локальными изменениями на branch2, не фиксируя их на branch1?
Ответы:
Поскольку ваши файлы еще не зафиксированы в
branch1
:или
Как отметила по benjohn (см справочной
git stash
странице ):источник
-u
, так:git stash -u
.Скопирование, временные коммиты и перебазирование могут быть излишними. Если вы еще не добавили измененные файлы в индекс, то вы можете просто извлечь другую ветку.
Это будет работать до тех пор, пока файлы, которые вы редактируете, не различаются между branch1 и branch2. Он оставит вас на branch2 с сохраненными рабочими изменениями. Если они отличаются, вы можете указать, что хотите объединить свои локальные изменения с изменениями, внесенными путем переключения ветвей с
-m
возможностью оформления заказа.Если вы добавили изменения в индекс, то сначала вам нужно отменить эти изменения, сбросив их. (Это сохранит вашу рабочую копию, она просто удалит поэтапные изменения.)
источник
checkout -m
в некоторых ситуациях «небезопасно» (возможно, это приведет к конфликту слияния), предоставит ли stash какое-либо преимущество (например, можете ли вы открыть поп-шоп)?.orig
?Более короткая альтернатива ранее упоминавшемуся подходу тайника:
git stash
git stash branch new_branch_name
Тогда как раз
add
иcommit
вносятся изменения в эту новую ветку.источник
ВНИМАНИЕ: Не для мерзавцев-новичков.
Этого достаточно в моем рабочем процессе, и я почти попытался написать для него новую команду git. Обычный
git stash
поток - это путь, но он немного неловкий. Обычно я сначала делаю новый коммит, так как, если я смотрю на изменения, вся информация свежа в моих мыслях, и лучше просто начатьgit commit
то, что я нашел (обычно это исправление, принадлежащее мастеру, которое я обнаруживаю, работая над функция ветка) сразу.Итак, как я этого добиваюсь, выглядит так:
git commit
изменения сразу с хорошим сообщением фиксации.git reset HEAD~1
отменить коммит из текущей ветки.Иногда позже (асинхронно) или сразу в другом окне терминала:
cd my-project-master
который является другим WD, разделяющим то же самое.git
git reflog
чтобы найти исправление, которое я только что сделал.git cherry-pick SHA1
из коммита.При желании (все еще асинхронном) вы можете затем перебазировать (или объединить) вашу функциональную ветку, чтобы получить исправление, обычно, когда вы собираетесь отправить PR и уже очистили свою функциональную ветку и WD:
cd my-project
который является основным WD, над которым я работаю.git rebase master
чтобы получить исправления.Таким образом, я могу продолжать работать над функцией непрерывно и не беспокоиться о
git stash
чем-либо или о необходимости чистить мой WD передgit checkout
(и затем снова проверять ветку функции), и все равно иметь все свои исправления ошибокmaster
вместо спрятан в моей веткеIMO
git stash
иgit checkout
настоящая PIA, когда вы находитесь в середине работы над какой-то большой функцией.источник
my-project-master
Разделяя те же.git
делает звук , как он. Почему бы неgit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, то позже (асинхронно) , а наmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (или даже, чтобы избежать необходимости выяснять SHA1,git rebase --onto master feature bugfixABC
из того места, где вы в данный момент находитесь. Это означает, что вы можете сделать это сразу послеgit reset
вышеперечисленного,feature
checkout -m
лучше.Если бы речь шла о совершенных изменениях, вы должны взглянуть на git-rebase, но, как указано в комментарии VonC, когда вы говорите о локальных изменениях, git-stash, безусловно, будет хорошим способом сделать это.
источник
Ответы, данные до сих пор, не идеальны, потому что они требуют много ненужной работы по разрешению конфликтов слияния, или они делают слишком много предположений, которые часто бывают ложными. Вот как это сделать отлично. Ссылка на мой собственный сайт.
Как перейти на другую ветку в git
У вас есть незафиксированные изменения,
my_branch
которые вы хотите зафиксироватьmaster
, не фиксируя все измененияmy_branch
.пример
объяснение
Начните с слияния
master
с вашей веткой, так как вам все равно придется это делать, и сейчас самое подходящее время для разрешения любых конфликтов.-u
Вариант (он же--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
.источник