Почему выбор вишни приводит к тому, что git merge удаляет часть моего коммита?

#git #merge #cherry-pick #git-cherry-pick

#git #слияние #выбор вишни #git-выбор вишни

Вопрос:

Итак, я пытаюсь понять, почему, когда я git merge master вхожу в ветку, я теряю некоторые, но не все свои изменения в коммите. Похоже, это связано с фиксацией выбора вишни в моей ветке. Вот как воспроизвести:

  1. инициализируйте репозиторий с начальной фиксацией
  2. Добавьте строку текста в файл и зафиксируйте
  3. Отделите это, назовите это «тест»
  4. В мастере ветки отмените второй коммит
  5. Выбор вишни, который фиксируется в тестовой ветке
  6. Вернитесь к master, создайте новый коммит, который восстановит эту строку текста, а также добавит дополнительные изменения
  7. Вернитесь к тестированию, запустите git merge master
  8. Обратите внимание, что слияние автоматически удалило эту строку текста (!!!), Но сохранило дополнительные изменения. Я ожидаю, что слияние не удалит эту строку, чтобы она соответствовала master .

Я загрузил свои результаты на github: https://github.com/terryttsai/testRevertMerge/commits/test

Если я никогда не выбирал этот коммит в свою test ветку, то git merge master сохраняю эту строку текста. Так почему же, когда у меня есть этот коммит выбора вишни, слияние удаляет его? Как я могу предотвратить это в первую очередь?

Ответ №1:

Я ожидаю, что слияние не удалит эту строку, чтобы она соответствовала master.

Нет. git merge master не означает совпадение с master!

Что такое слияние? Слияние означает использование вклада обеих ветвей, начиная с точки расхождения. Каковы они?

Ну, точка расхождения после добавления этой первой строки. Итак, что произошло после этого в каждой ветке?

  • На master единственным вкладом является дополнительный материал. (Он удалил первую строку, но позже восстановил ее, так что это не вклад; в этом отношении вообще ничего не произошло.)
  • При тестировании единственным вкладом является удаление первой строки (это то, что делает фиксация возврата, выбранная вишней).

Таким образом, слияние выполняет оба из них: дополнительные строки из master и удаление из test.

Но если вы никогда не выполняете выбор вишни, то ни одна из ветвей не вносит вклад, который удаляет эту строку, поэтому очевидно, что она не удаляется слиянием.

Комментарии:

1. Привет, Мэтт, спасибо за ответ. Итак, на master я удаляю эту строку при возврате коммита и добавляю ее в тестовую ветку, но затем добавляю ее обратно позже как часть нового коммита на master, который не переносится, когда я объединяю его в тестовую ветку? Я бы предположил, что если мой коммит для добавления строки обратно появится после выбора вишни, merge вы бы предпочли сохранить строку, а не удалять ее?

2. Ах, но прочитайте именно то, что я сказал. Git не знает / не заботится о том, что вы сделали позже в одной ветке, чем в другой. Он заботится обо всем, что вы сделали для каждого. На master вы удалили строку и восстановили ее. Итак, в итоге вы ничего не сделали.