К сожалению, я думаю, что по умолчанию git log
, по моему мнению, не покажет вам все, что вам может понадобиться, чтобы узнать, что здесь происходит.
Я бы предложил использовать такой инструмент, как gitk, или создать псевдоним bash, например:
alias glog="git log --all --graph --pretty=oneline --decorate=short --abbrev-commit"
А затем используйте это, чтобы лучше понять, что на самом деле делает push / pull / merge / fetch.
Помните, происхождение / мастер это ветка remote . Ветвь, которую увидит любой, кто делает git clone
. master
является локальной веткой. Только вы действительно увидите, что происходит в вашей ветке master
. Когда вы нажимаете master
на origin
, origin/master
будет обновляться с вашим коммитом.
Однако, git push origin master
будет успешным, только если у вас уже есть последняя origin/master
, которая была нажата. В этом случае я думаю, что кто-то выдвинул коммит на origin/master
между вашим последним git pull
и вашим git commit
, что означает, что ваш master
не синхронизировался с origin/master
, когда вы сделали свой коммит. Это будет выглядеть так:
master origin/master
| /
B-----/
|
A
Здесь A
и B
- это коммиты, которые вы оба видите, потому что и вы, и ваш коллега сделали git pull
и получили A
и B
. Затем ваш коллега выдвинул новый коммит на origin/master
, который вы не получили до того, как сделали свой коммит. Следовательно, и ваши master
, и origin/master
основаны непосредственно на B.
Когда вы выполните git pull
, git увидит это и попытается объединить два коммита. В вашем случае это удалось (ура, иначе у нас был бы совершенно другой вопрос). Результат вашего git pull
будет тогда:
master
| \
C origin/master
| /
B-----/
|
A
Здесь C
- ваш предыдущий мастер. Поскольку C
и origin/master
не в последовательности, git должен был выполнить слияние и создать коммит слияния для этого. Вот что вы видите в своем git log
.
Почему вы не видели этого в своих предыдущих git pull
с? Что ж. Если master
и origin/master
не расходятся, например, если ваш коллега что-то нажал, и вы сделали git pull
перед тем, как сделать свой собственный коммит, то ваша ситуация (до вытягивания) будет выглядеть примерно так:
origin/master
|
master
|
B
|
A
В этой ситуации вам не нужно слияние, и никакое слияние не будет создано, потому что git увидит, что можно выполнить «ускоренную перемотку вперед». Быстрая перемотка вперед означает, что git переместится на master
вперед без слияния, потому что ветви не расходятся. Это может быть то, что вы видели ранее.
В общем, я думаю, что эти вещи легче увидеть, если использовать лучшие инструменты визуализации (например, gitk или псевдоним), а также я предпочитаю делать git fetch
, затем посмотреть на это, затем сделать git merge origin/master
. Лично я просто думаю, что намного легче понять, что происходит.