Подтвердить что ты не робот

Применение изменений из ветки b в a, без слияния или добавления коммитов

Мой сценарий состоит в том, что у меня есть одна ветвь, в которой я сделал большие улучшения процесса сборки (ветвь A), а в другой я работаю над несвязанной функцией (ветвь B). Итак, теперь, когда я взламываю ветку B, я хочу использовать материал, который я написал в ветке A, потому что мне нужны более быстрые и простые сборки. Тем не менее, я не хочу "загрязнять" свою ветку B, просто добавляю изменения от branchA к неустановленным изменениям.

Что я пробовал (когда стоял на ветке Б):

git merge --no-commit branchA

Не работает, потому что он помещает вас в слияние. Если бы это не так, это было бы прекрасно.

git checkout branchA -- .

Не работает, потому что он применяет изменения между branchA..branchB, а не изменения master..branchA.

Что-нибудь еще?

Изменить: Да, изменения в ветки А завершены. В этом примере есть только одна ветка с улучшением сборки, но может быть до N веток с улучшениями сборки, которые я хочу применить, работая в ветке функций.

4b9b3361

Ответ 1

Мне просто нужно было сделать что-то подобное, и я смог его исправить, добавив --squash в команду слияния

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

Ответ 2

Вы должны иметь возможность вишни-выбирать коммиты (с помощью -n, чтобы избежать фиксации сразу).

Ответ 3

cherry-pick -n должен делать то, что вы хотите, но я не уверен, почему вы хотите, чтобы улучшения сборки были как неустановленные изменения - это просто делает несколько вещей сложнее (например, слияние других изменений с измененными файлами или перезагрузка чего-либо).

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

В этом случае я создам новую ветвь C, которую вы объедините как из A, так и B (и любых других ветвей с улучшениями сборки). Зафиксируйте изменения в ветки свойств, B, затем объедините их в ветвь C, которая теперь содержит улучшения сборки и изменения ветки Feature, поэтому вы можете протестировать их вместе. Если вам нужно сделать больше изменений, сделайте это в соответствующей ветке, а не в C, а затем слейте в C. Так что никогда не изменяйте ничего в ветки C, просто используйте его для интеграции изменений из других ветвей.

Это означает, что вы можете использовать все функции Git в ветке C, вместо того, чтобы жонглировать незафиксированными изменениями в грязном дереве.

Ответ 4

Я не уверен, что понимаю ваши требования.

Вы можете запустить слияние, а затем вызвать 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