Как разрешить конфликты слияния "git pull" с одним из моих предыдущих коммитов? - PullRequest
2 голосов
/ 31 мая 2019

Вот как выглядит мое мерзавец:

A   B   C   D   E
o---o---o---o---o master
         \
          o---o---o---o my_branch
          C1  C2  C3  C4

Я пытаюсь перебазировать my_branch с master, и чтобы мое дерево в конце выглядело так, однако, у меня есть конфликты слияния, которые я хочу разрешить как часть моего коммита C2 (или более раннего коммита) вместо верх головы (C4).

A   B   C   D   E
o---o---o---o---o master
                 \
                  o---o---o---o my_branch
                  C1  C2* C3  C4
                       |
                      includes merge conflict resolution with master 

Пробовал: Git rebase и разрешение конфликтов + commit git pull --rebase master Это вызывает конфликт слияния.

Я могу разрешить конфликт и выполнить git commit, но я не хочу создавать новый коммит, C5. Я бы предпочел, чтобы изменения конфликта были сделаны как часть более старого коммита, скажем, C2.

В качестве альтернативы я попытался выполнить git rebase для C2, а затем git pull git rebase -i C1 Пометить С2 как «редактировать». Я надеялся сделать git pull --rebase master и разрешить конфликты + commit + git rebase --continue, чтобы разрешение конфликтов стало частью C2, но это не сработало.

Можете ли вы предложить, как я могу это сделать? Что-нибудь кроме отмены моих изменений и их повторного применения после git rebase?

1 Ответ

2 голосов
/ 31 мая 2019

Вы уже заменяете все свои коммиты

Commit C1 говорит, что его родительский коммит - C. Вам нужен новый и другой коммит - вы можете назвать его E1, например, - который говорит, что его родителем является E.

Этот новый и другой коммит будет иметь новый и другой хэш-идентификатор. В конце, тем не менее, у вас все еще будет четыре коммита - они будут просто от E1 до E4. Ваше имя my_branch будет идентифицировать новый коммит E4; commit C4 будет забыт и со временем уйдет, если кто-то или что-то еще не овладеет им и не отпустит:

                  E1  E2  E3  E4
                  o---o---o---o   <-- my_branch
A   B   C   D   E/
o---o---o---o---o   <-- master
         \
          o---o---o---o   [abandoned]
          C1  C2  C3  C4

Когда git rebase попадает в конфликт, он останавливается в середине перебазирования

Rebase работает, копируя каждый коммит, по одному, превращая снимок в C1 в набор изменений для фиксации C - его родительский - и применяя этот набор изменений для фиксации E. Git делает это, используя внутренний механизм слияния Git, то есть Git также сравнивает C против E, чтобы определить, как применить C против C1.

В этом случае это сравнение и копирование прошло успешно, и Git успешно создал коммит E1. Затем Git попытался построить E2, сравнив C2 с C1, чтобы превратить его в набор изменений, а затем слить его с изменениями от C1 до E1. Вот где произошел конфликт. Итак, на данный момент, у вас есть:

                  E1
                  o   <-- HEAD
A   B   C   D   E/
o---o---o---o---o   <-- master
         \
          o---o---o---o   <-- my_branch
          C1  C2  C3  C4

Фиксация E2 выполняется, но еще не существует. Вы должны разрешить конфликт, git add разрешенные файлы и запустить git rebase --continue, чтобы Git сделал новый коммит E2:

                  E1  E2
                  o---o   <-- HEAD
A   B   C   D   E/
o---o---o---o---o   <-- master
         \
          o---o---o---o   <-- my_branch
          C1  C2  C3  C4

В этот момент Git сможет попытаться скопировать C3. Если все пойдет хорошо, Git сделает E3 самостоятельно. В противном случае он перестанет получать вашу помощь снова, и вы пройдете тот же процесс и в конечном итоге будете использовать git rebase --continue, чтобы заставить Git копировать C4 в E4.

Как только E4 успешно сделан, не осталось копий для выполнения, и git rebase выполняет свой последний трюк: он перемещает имя my_branch так, что оно указывает на E4 вместо C4, повторно -прикрепление специального имени HEAD к имени my_branch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...