Как применить изменения из определенных коммитов в определенном порядке

Cn - родительский коммит.

Cn+1(зеленый) - локальный коммит.

Cn+1(желтый) - еще один коммит в той же ветке, но уже перенесенный на удаленный, но имеющий того же родителя, что и локальный коммит.

Результат: мне нужно сохранить все изменения в локальной фиксации (зеленый), но не отменять изменения в удаленных фиксациях (желтый). Таким образом, это похоже на сохранение изменений в локальной и удаленной фиксации относительно родительского, но зеленого цвета с высоким приоритетом.

Я не могу сделать это с помощью слияния, потому что это требует ручной работы в интерактивном режиме, мне нужно делать это автоматически из bash.

2 ответа

Кажется , это работает

PS я не использую его для объединения кода, только значения в формате yaml

git fetch origin test
PARENT_COMMIT=$(git show --format='format:%H' --no-patch HEAD~1)
LAST_REMOTE_COMMIT=$(git log --all -n 1 --pretty='format:%H' HEAD..origin/test)
git diff --unified=0 $PARENT_COMMIT $LAST_REMOTE_COMMIT | git apply
git add file
git commit --amend --no-edit
LAST_LOCAL_COMMIT=$(git show --format='format:%H' --no-patch HEAD)
git checkout origin/test
git rebase $LAST_LOCAL_COMMIT --strategy recursive -X ours
git push origin test

Предполагая, что у вас есть ветка, допустим, она называется mybranch, которая указывает на C(n+1), и есть еще одна ветвь some_branch который указывает на C(n+3), затем для создания структуры, показанной на вашем изображении, вы можете запустить

git checkout some_branch
git merge mybranch

Другой вариант - пересадить зеленый C(n+1) поверх C(n+3). Вы можете сделать это, запустив

git checkout some_branch
git cherry-pick some_branch..mybranch

После любого из них вы можете запускать такие команды, как git log --graph чтобы изучить историю коммитов, а затем, если она вас устраивает, git push для загрузки изменений на удаленный сервер.

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

Другие вопросы по тегам