Как применить разницу между фиксациями к текущей голове в git?

Я работал над какой-то тематической веткой в ​​проекте, в котором я участвую. Обычно я переустанавливаю свои ветки перед тем, как сделать запрос на включение. На этот раз, однако, из-за изменений в мастере, перебазирование - большая проблема. Много конфликтов и, что еще хуже, после ручного слияния коммиты выглядят просто некрасиво и теряют смысл. Я определенно предпочел бы получить разницу между головой моей ветки и последней фиксацией, присутствующей в обеих ветвях, затем применить эту разницу к голове мастера и, наконец, создать совершенно новые блестящие коммиты с помощью git add -p. Итак, мой вопрос: как этого достичь? Одной из возможностей было бы просто объединить мастер с моей веткой темы, но есть ли более элегантное решение? Я верю, что да.

Спасибо за вашу помощь.

ИЗМЕНИТЬ:

Один файл был перемещен в основную ветку, и мои коммиты изменяют этот файл (используя его старое имя).


person skalee    schedule 26.11.2012    source источник


Ответы (2)


Используйте git cherry-pick --no-commit <commit>...

Затем вы получите все изменения в перечисленных коммитах, примененных к верхней части вашей ветки, и вы сможете делать коммиты на досуге.


Если у вас есть более сложный вариант использования, вы можете попробовать git imerge

Его создатель сделал вводную запись в блоге и презентация об этом. Оба немного старые, к сожалению.

person Christoffer Hammarström    schedule 26.11.2012
comment
Отличный ответ! Я проверил ваше решение на некоторых других коммитах, и оно правильное. Жаль, что в моем случае один файл был перемещен за это время, и на этом этапе выбор вишни не работает. Я соглашусь, если никто не предложит что-то более применимое в моем случае. - person skalee; 26.11.2012
comment
Похоже, вы могли бы сделать это с помощью интерактивной перебазировки, git rebase -i? - person Christoffer Hammarström; 26.11.2012
comment
Если у вас есть изменения в перемещенных файлах, см. этот ответ: stackoverflow.com/a/15137607/233014 - person Christoffer Hammarström; 03.07.2019

уже данный ответ подходит, когда вы хотите получить последовательные коммиты.

Однако, если вам нужен общий ответ на способ применить разницу между ЛЮБЫМИ двумя выбранными фиксациями (как я сделал, когда нашел эту страницу), то это не так полезно.

В моем случае я сделал следующее:

Чтобы дать имена вещам, скажем, я хотел применить diff от commit1 до commit2 к branch1 как один коммит.

Обратите внимание, что commit1 может быть предком или "потомком" commit2 или ни тем, ни другим.

So I do:

git status     # Ensure working directory is clean, preferably no untracked files
git checkout -b temp-branch commit2
git reset --soft commit1
git commit -m "Everything from commit1 to commit2 as one commit"
git checkout branch1
git cherry-pick temp-branch
    # Confirm result is what you expect
git branch -D temp-branch
person Wildcard    schedule 02.03.2018
comment
Если commit1 является предком commit2, это то же самое, что и git cherry-pick --no-commit <commit1>..<commit2>, git commit. - person Christoffer Hammarström; 28.06.2019
comment
@ChristofferHammarström, да, но, как я уже писал, commit1 может быть предком или потомком commit2, или ни тем, ни другим. Этот подход работает независимо. - person Wildcard; 04.09.2019