Почему некоторые git коммиты теряются после слияния - PullRequest
1 голос
/ 06 марта 2020

В одном проекте есть несколько ветвей (ветвь M является главной ветвью), как показано ниже:

------M1--\------Mm------Merge1-------------Mn--------------Merge2----Mo----Merge3-
           \              /                                  /               /                                         
            \--A1---A2---/                                  /               /                                         
                        \                                  /               / 
                         \                                /               /                                  
                          \------B1---B2-------B3---B4---/               /                                                    
                                            \                           /              
                                             \                         /                                                       
                                              \---------C1------C2----/         

Все B1, B2, B3, B4 связаны с изменением одного файла.

Проблема в том, что после Merge3 , хотя мы можем видеть изменения B1 и B2, но B3 и B4 потерялись в master, мы не можем увидеть журнал изменений, этот файл содержание остается на уровне B2.

Но если мы используем

git log --follow myfile.java

Тогда я смогу увидеть все изменения, включая B3 и B4

Кто-нибудь знает, почему это происходит, как решить эту проблему

1 Ответ

1 голос
/ 06 марта 2020

B3 и B4 были потеряны

Это не так. B3 и B4 присутствуют в истории коммитов, как предполагает git log --follow myfile.java. Дело в том, что B3 и модификация B4 не были сделаны во время слияния.

У меня нет журнала об этом?

Вы не упомянули, какой у вас метод чтобы проверить это, log или show.

Короткий ответ : используйте -m flag

Длинный ответ : Я предлагаю вам прочитать этот очень интересный ответ о log и show в вашем контексте здесь . Часть этого (длинного) ответа, которую вам нужно прочитать:

Как увидеть изменения? Есть решение. И git show, и git log имеют дополнительный флаг -m, который "разделяет" слияния. То есть вместо обработки Merge2 коммитом слияния они разбивают слияние на два "виртуальных коммита". Один будет "Merge2 против An", и вы увидите все различия между этими двумя коммитами, а другой будет "Merge2 против Bn", и вы увидите все различия между этими двумя совершает. Это покажет, что файл f2 был переустановлен в том виде, в котором он находится в Bn, потеряв версию из C2, которая появляется в An, но не в Bn. (Включите --full-history, а также -m, чтобы убедиться, что коммит C2 также отображается.)

Как я могу повторно включить B3 и B4 в master?

В этой конкретной ситуации (уже выдвинутые вещи, уменьшенное количество задействованных коммитов, нет / небольшие дальнейшие изменения) я бы cherry-pick сделал два коммита и поместил их поверх merge3

Как избежать этой ситуации в будущем

  1. Не делайте pu sh свою работу, пока вы не проверили результат объединения, так что вы можете легко удалить и повторить
  2. Rebase C branch поверх B branch до слияния (избегайте ветвлений слияния, которые непосредственно не переходят друг в друга)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...