Ответ 1
Мне просто нужно было сделать что-то подобное, и я смог его исправить, добавив --squash
в команду слияния
git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
Мой сценарий состоит в том, что у меня есть одна ветвь, в которой я сделал большие улучшения процесса сборки (ветвь A), а в другой я работаю над несвязанной функцией (ветвь B). Итак, теперь, когда я взламываю ветку B, я хочу использовать материал, который я написал в ветке A, потому что мне нужны более быстрые и простые сборки. Тем не менее, я не хочу "загрязнять" свою ветку B, просто добавляю изменения от branchA к неустановленным изменениям.
Что я пробовал (когда стоял на ветке Б):
git merge --no-commit branchA
Не работает, потому что он помещает вас в слияние. Если бы это не так, это было бы прекрасно.
git checkout branchA -- .
Не работает, потому что он применяет изменения между branchA..branchB, а не изменения master..branchA.
Что-нибудь еще?
Изменить: Да, изменения в ветки А завершены. В этом примере есть только одна ветка с улучшением сборки, но может быть до N веток с улучшениями сборки, которые я хочу применить, работая в ветке функций.
Мне просто нужно было сделать что-то подобное, и я смог его исправить, добавив --squash
в команду слияния
git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
Вы должны иметь возможность вишни-выбирать коммиты (с помощью -n
, чтобы избежать фиксации сразу).
cherry-pick -n
должен делать то, что вы хотите, но я не уверен, почему вы хотите, чтобы улучшения сборки были как неустановленные изменения - это просто делает несколько вещей сложнее (например, слияние других изменений с измененными файлами или перезагрузка чего-либо).
В этом примере есть только одна ветка с улучшением сборки, но может быть до N ветвей с улучшениями сборки, которые я хочу применить, работая над ветвью функций.
В этом случае я создам новую ветвь C, которую вы объедините как из A, так и B (и любых других ветвей с улучшениями сборки). Зафиксируйте изменения в ветки свойств, B, затем объедините их в ветвь C, которая теперь содержит улучшения сборки и изменения ветки Feature, поэтому вы можете протестировать их вместе. Если вам нужно сделать больше изменений, сделайте это в соответствующей ветке, а не в C, а затем слейте в C. Так что никогда не изменяйте ничего в ветки C, просто используйте его для интеграции изменений из других ветвей.
Это означает, что вы можете использовать все функции Git в ветке C, вместо того, чтобы жонглировать незафиксированными изменениями в грязном дереве.
Я не уверен, что понимаю ваши требования.
Вы можете запустить слияние, а затем вызвать git reset HEAD~1
.
Следующая последовательность должна воспроизводить каждую фиксацию между master
и branchA
поверх branchB
. Записи, которые уже были применены на branchB
, будут пропущены.
# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip
# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB
# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip