Как git обрабатывает коммиты в слиянии? - PullRequest
6 голосов
/ 18 июня 2011

Мне трудно понять, как работает git merge с точки зрения коммитов, созданных процессом слияния. Я прочитал соответствующие разделы в pro git и книге сообщества git, но все еще в замешательстве.

Рассмотрим этот сценарий: у меня есть git repo "origin":

          master
            |
a0--a1--a2--a3
  \
   -b0--b1
         |
      branch2

Я клонирую этот репо в локальный репо, а затем работаю только с локальным репо. В branch2 я сделал "git merge master". Теперь мой локальный репо выглядит так:

     master / origin/master
            |
a0--a1--a2--a3
  \           \
   -b0--b1-----merge
         |       |
  origin/branch2 |    
              branch2

Таким образом, слияние создало 1 коммит, "слияние", после коммита "b1". «git log» для branch2 показывает ожидаемый график:

> git log branch2 --graph --pretty=oneline --decorate
*   a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2
|\  
| * 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3
| * 8de57bdea2d316073af3b7055f8c28c56004ce94 a2
| * 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1
* | 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1
* | 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0
|/  
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0

Кроме того, если я иду на один коммит до текущего заголовка, я получаю коммит b1, как и ожидалось. (следуйте по линии branch2 на графике и вернитесь на 1 коммит)

> git log branch2~ --graph --pretty=oneline --decorate
* 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1
* 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0

Здесь приходит мое замешательство. Я еще не перенес свои изменения в источник, но когда я делаю «git status», git говорит, что мой локальный branch2 опережает origin / branch2 на 4 коммита. Я думал, что слияние привело только к 1 новой фиксации слияния, как показано на графике / диаграммах выше? Почему 4?

> git status
# On branch branch2
# Your branch is ahead of 'origin/branch2' by 4 commits.
#
nothing to commit (working directory clean)

Кроме того, при выполнении «git log» от origin / branch2 до branch2 показано 4 коммита вместо 1, который я ожидал (переходя от «b1» к «слиянию»).

> git log origin/branch2..branch2 --graph --pretty=oneline --decorate
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2
* 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3
* 8de57bdea2d316073af3b7055f8c28c56004ce94 a2
* 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1

Я понимаю, что 4 коммита - это 3 от мастера (a1, a2, a3), которые слияние должно перенести в ветвь 2, плюс коммит "слияние". Но почему график не показывает это так? Если это так, это будет выглядеть так:

     master / origin/master
            |
a0--a1--a2--a3-----------
  \                      \
   -b0--b1--a1'--a2'--a3'--merge
         |                  |
  origin/branch2            |    
                         branch2

И branch2 ~ приведет меня к a3 'вместо b1.

Заранее спасибо за любую помощь.

1 Ответ

6 голосов
/ 18 июня 2011

Как упомянуто в " Как получить изменения на ветке в git ":

git log origin/branch2..branch2

означает: все коммиты на branch2 (положительная ссылка), которые не 't на origin/branch2 (отрицательная ссылка)
(О положительных и отрицательных ссылках см. " Разница в 'git log origin/master' vs 'git log origin/master..' ")

Вв вашем случае после слияния у вас есть 4 коммита на branch2 (локальный), которых нет на origin/branch2: a1, a2, a3 и merge.

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