как сделать Git Merge правильный путь - PullRequest
0 голосов
/ 05 января 2019

У меня есть две ветви: master и branch2.

Они отличаются только на 1 строку для комментария:

Мастер имеет комментарий: // test 00

branch2 имеет комментарий: // test 99

при условии, что я начну с branch2 и сливаюсь с master, будет ли эта строка

// тест 00 или // тест 99? когда я попробовал это git bash, он вернул сообщение «Слияние сделано с помощью« рекурсивной »стратегии». но на самом деле это не показывало мне изменения.

PS C:\Node\projects\n-5-10-workflow-test> git checkout branch2
 Switched to branch 'branch2'
PS C:\Node\projects\n-5-10-workflow-test> git status
 On branch branch2
 nothing to commit, working tree clean
PS C:\Node\projects\n-5-10-workflow-test> git remote show origin
 * remote origin
 Fetch URL: https://github.com/masterinex/workflow.git
 Push URL: https://github.com/masterinex/workflow.git
 HEAD branch: master
 Remote branches:
  branch2 tracked
  master tracked
 Local branch configured for 'git pull':
  master merges with remote master
 Local refs configured for 'git push':
  branch2 pushes to branch2 (fast-forwardable)
  master pushes to master (up to date)
PS C:\Node\projects\n-5-10-workflow-test> git status
 On branch branch2
 nothing to commit, working tree clean
PS C:\Node\projects\n-5-10-workflow-test> git branch -a
 * branch2
 master
 remotes/heroku/master
 remotes/origin/branch2
 remotes/origin/master
PS C:\Node\projects\n-5-10-workflow-test> git merge master
 Merge made by the 'recursive' strategy.
PS C:\Node\projects\n-5-10-workflow-test>

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Короткий ответ на ваш вопрос, "при условии, что я начинаю с branch2 и вливаюсь в master, будет ли эта строка" // test 00 "или" // test 99 ":

Если вы объединяете branch2 в master и branch2 был разветвлен от master, тогда ответ "// test 99".

Но если эта строка кода была изменена в master по сравнению с исходным значением "// test 00" в тот момент, когда был создан branch2, то у вас будет конфликт слияния.

Если branch2 был создан из другой ветки без корня обратно в master, тогда ожидается конфликт. Но по умолчанию в git все ответвления ведут к ответвлению, помеченному master ..., если только в этом репо не было какой-то особенной истории ветвлений.

0 голосов
/ 05 января 2019

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

|
* (master)         // test 99
|\
| * (branch2)      // test 99
* | (master)       // test 00
|\|
| * (branch2)      // test 00

Это означает, что файл в вашей текущей ветке должен содержать текст // test 00.

Кажется, это ваш вопрос, но простой grep '// test' <the file> ответил бы на ваш вопрос ...

0 голосов
/ 05 января 2019

[Филиалы master и branch2] отличаются только на 1 строку для комментария:

Мастер имеет комментарий: // test 00

branch2 имеет комментарий: // test 99

Это ... не бесполезно, но также не совсем используется ful информация. Когда вам интересно, что будет делать git merge, содержание подсказок каждой ветви не является ключом к ответу. Точнее, они необходимы, но крайне недостаточны.

Во-первых, помните, что коммиты содержат файлы. Я предполагаю, что когда вы говорите «master имеет X, а branch2 имеет Y», вы действительно имеете в виду: Все файлы в коммитах с подсказками, обозначенные master и branch2 соответственно, идентичны, за исключением некоторых файлов F , у которого есть какая-то строка L , текст которой отличается: эта строка читает //test 00 в master и //test 99 в branch2.

То есть, если бы мы нарисовали график коммитов, он мог бы выглядеть так:

          o--o--X   <-- master
         /
...--o--*
         \
          o--Y   <-- branch2 (HEAD)

(Существуют и другие возможные фигуры, но вывод из git merge предполагает, что это было очень похоже на это. Имя HEAD прикреплено к branch2, потому что это то, что вы извлекли.)

Здесь я использовал X и Y для обозначения фактических хеш-идентификаторов коммитов подсказок ветвей master и branch2. Поскольку каждый коммит содержит хэш-идентификатор своего непосредственного родительского коммита, мы можем работать в обратном направлении от последнего коммита master к предыдущему коммиту master, а оттуда предыдущего коммита , и так далее. Мы также можем начать с коммита Y и двигаться назад. Когда мы двинемся назад одновременно с обоих коммитов, мы в конечном итоге достигнем некоторой точки соединения: коммит *, а не один из раундов o коммитов.

Первая такая точка соединения очень особенная для git merge, потому что это база слияния . База слияния - это ключ к пониманию того, что git merge собирается делать.

Цель объединения - объединить работу , а не просто сделать две одинаковые ветви. Чтобы объединить проделанную работу, Git должен выяснить что за работа была . Работа состоит из всех изменений, сделанных с общей отправной точки . База слияния является той общей отправной точкой.

Git теперь будет выполнять две отдельные команды git diff. Можно сравнить коммит * с коммитом X, чтобы увидеть, что «они» - кем бы они ни были - делали на ветке master. Другой сравнит коммит * с коммитом Y, чтобы увидеть, что вы сделали в вашей ветке branch2. То есть:

git diff --find-renames <hash-of-*> <hash-of-Y>   # what did we change, on branch2?
git diff --find-renames <hash-of-*> <hash-of-X>   # what did they change, on master?

Git затем объединяет два набора изменений и применяет объединенные изменения к содержимому commit *.

Поскольку вы, в branch2, очевидно, сделали все то же, что и они, в master, , за исключением для изменения строки L файла F , объединенные изменения будут такими же, за исключением этой строки. Вопрос теперь: кто изменил линию?

Допустим, что в * строка читается как //test 00. Затем вы изменили строку, поэтому Git примет ваше изменение, и в результате получится, что строка L файла F будет читать //test 99.

Но, скажем, вместо этого в * строка читается как //test 99. Затем они изменили строку, поэтому Git примет их изменение, и в результате получится, что строка L файла F будет читать //test 00.

Наконец, возможно, что в * строка прочитала что-то еще полностью. В этом случае вы и они изменили одну и ту же строку 1132 * файла того же самого файла , но на две разные вещи. В этом случае git merge объявит, что существует конфликт, и остановится и оставит беспорядок, который вы должны устранить. Поскольку этого не произошло, очевидно, что это не так.

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

0 голосов
/ 05 января 2019

когда вы делаете git merge , вы переводите основную ветвь в настоящую.

//on branch branch2
git merge master

весь контент от MASTER переходит на BRANCH2

ФИЛИАЛ2 <--------- МАСТЕР </p>

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