Git объединить один и тот же и внешне измененный файл - PullRequest
3 голосов
/ 26 марта 2010

Я унаследовал некоторый код (из zip-файла) от разработчика и git инициализированы, внесены изменения и набор проверок постепенно.

Теперь тот же разработчик выпустил тот же код со своими изменениями и дал мне другой почтовый файл.

Как мне объединить мои изменения, которые у меня есть, мое git-репо и его последние изменения из содержимого второго zip-файла?

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

Я попытался создать ветку b1 из моей основной ветки и применил содержимое второго zip-файла поверх этого. зафиксировал эти файлы в ветке и сделал 'git checkout master; git merge b1 '- но я не получаю свои изменения, только его изменения в моей основной ветке.

Ответы [ 2 ]

5 голосов
/ 26 марта 2010

Похоже, что и вы, и другие основали свою работу на коде, который вы используете в качестве корневого коммита в вашем хранилище. Итак, сейчас у вас есть это:

A - B - C - D (master)

Работа другого разработчика также основана на коммите A. Таким образом, правильное место для этого - A.

Начните с создания и проверки ветки там: git checkout -b his_work <SHA1 of A> (или в gitk, просто щелкните правой кнопкой мыши на коммите и выберите создать ветку).

Затем бросьте его работу и передайте ее. Чтобы быть милым, вы можете сделать это с git commit --author="His Name <his.email@somewhere>", чтобы показать, что это была его работа.

Теперь проверьте вашего мастера (git checkout master) и объедините его ветку (git merge his_work).

Вы должны получить следующее:

A - B - C - D - E (master)
 \             /
  X -----------
  (his_work)

Просто для пояснения, вот что вы сделали:

A - B - C - D      -      X (his_work)
         (master) ----> 

Вы совершили его работу поверх вашей последней, а затем слили ее; слияние было ускоренным: поскольку мастер был предком ветви, которую вы слили, вы просто переместили мастера вперед к этому новому коммиту.

1 голос
/ 26 марта 2010

Причина, по которой вы получили только его изменения, заключается в том, что ваша ветка основана на вашем последнем коммите. Затем вы заменили все свои файлы на его и зафиксировали. Git рассматривает это как массовое редактирование, заменяющее ваши файлы его, а не слияние.

Чтобы получить то, что вы хотите, вам нужно перейти в точку, где изменения отделяются от ваших. Похоже, это ваш первый коммит. Так что вы можете сделать:

git checkout <first-commit>
git checkout -b b1        // This just names the branch for the later merge
<copy his files from the zip in>
git checkout master
git merge b1

Отсюда, git видит, что b1 основан на первом коммите, поэтому он рассматривает все изменения от master с тех пор как «одновременные» изменения, что и нужно

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