Git: почему я вижу конфликт слияния для правильного сравнения? - PullRequest
0 голосов
/ 16 ноября 2018

Учитывая две ветви, "target" и "source", которые указывают на один и тот же коммит.

git checkout target
git checkout -b source

И учитывая, что «источник» имеет следующие дополнительные коммиты:

#source
a
b

Когда я выбираю ша "a" для "target"

#target
git cherry-pick a #sha a1

Слияние вызывает конфликт.

git checkout target
git merge source
# conflicts!

Sha b все еще является действительным патчем для применения к a с другой точки зрения.

git checkout target
git cherry-pick b #sha b1
# no conflicts

git log graph

$ git log --oneline --graph target source
* 8fb4695 (HEAD -> target) a
| * af785b5 (source) b
| * 7c102f6 a
|/  
* ad8680a (master) initial commit

Единственный конфликт должен заключаться в том, что a1 новее. Что тут происходит? Зачем это нужно?

1 Ответ

0 голосов
/ 17 ноября 2018

Вы, похоже, неправильно понимаете, что git merge и git cherry-pick делают.

Вы начинаете со следующей истории:

Init --- A'        : target
     \
      \-- A --- B  : source

Что происходит, когда вы объединяете source в target, это то, что git берет две подсказки ветви и сравнивает их. Здесь две ветви четко различаются (и A 'не является предком источника, следовательно, нет слияния в ускоренном режиме), поэтому git объединяет две подсказки ветви и записывает новый коммит слияния.

Init --- A' ---------- C  : target, source
     \                /
      \-- A --- B -- / 

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


Если вы хотите избежать слияния, вы должны применить коммиты в исходной ветке к вашей целевой ветке. Для этого вы обычно используете git rebase, а не git merge. Тот факт, что при выполнении двух cherry-pick не возникает конфликта, объясняется тем, что выполнение здесь дважды cherry-pick аналогично выполнению ребазирования (но с сохранением исходной ветви)

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