Почему git объединяет ветвь в себя?

Я проснулся сегодня утром и посмотрел историю фиксации одного из моих личных коллекций Dev Team на BitBucket. Я видел это:

Anonymous совершили fcde879 MERGE

Объединить ветвь "разработать" https://bitbucket.org/abc/xyz в разработку

Это несколько необычно. Я предполагал, что это было нажато с новой машины, у которой не было настроено git. Тем не менее, я не был уверен, почему он это делал. В BitBucket он отображает два отдельных хэша в качестве родителя-фиксатора, но у него нет опции "просмотр raw commit" других коммитов.

Я проверил эту ветку, потянул ее и посмотрел на журнал вручную.

[email protected]:/path/to/repo$ git log -1 --format=raw
tree 2931d14f48e61eaf0bbe0660af5b5dd76c07f063
parent 6bb38dee681df7620ffa42b6790641a7873166f2
parent f59c82e19e3e79310a53e273bab78139c49ff063
author root <[email protected]> 1437069530 +0000
committer root <[email protected]> 1437069530 +0000

Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

Насколько я могу судить, родитель 6bb находится на ветке разработки, а родитель f59 - из другой ветки. Трудно сказать, что происходит.

Я искал, но не смог найти ответ, и мне нужно вернуться к размалыванию, поэтому я задаю свой вопрос здесь: почему git объединяет ветвь в себя? Или, скорее, почему эта номенклатура используется в качестве сообщения коммита?

Ответ 1

Этот сценарий не является чем-то необычным.

Ключевым моментом здесь является то, что слияния веток различны: его удаленный репозиторий develop ветвь, которая объединяется в локальную (рабочую) develop.

В локальном репозитории разработчика есть две разные ветки:

  • develop= ветвь, в которой он/она сейчас работает. Новые коммиты идут сюда.
  • origin/develop= Это, по существу, моментальный снимок, который текущий хранилище содержит состояние ветки develop на удаленном сервере. Он обновляется с помощью удаленных изменений, когда вы fetch или pull, и с локальными изменениями после успешного push.

Теперь, когда вы делаете git pull, происходят две вещи. Это связано с тем, что git pull по существу является псевдонимом для других двух операций git: fetch и merge:

  • fetch - выводит все новые коммиты (если они есть) из удаленного репозитория в ветвь local origin/develop.
  • merge - принимает новые коммиты и применяет их к локальной рабочей develop branch. Это может произойти одним из двух способов:
    • если локальная рабочая ветвь не содержит расходящуюся историю (новое обязательство, что пульт не знает), то он просто продвигает develop указателя ветки вперед, сделать что указует на последнюю коммят в origin/develop. Это называется быстрым слиянием.
    • если у разработчика есть свои новые собственные коммиты, которые не присутствуют в удаленном репо и, следовательно, не в ветке origin/develop, то выполняется регулярное слияние, что означает, что существует новое коммитирование, содержащее изменения с обеих ветвей, По умолчанию git присваивает такие сообщения таким коммитам: Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop htps: Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop.

Итак, сценарий довольно распространенный.

Теперь, если это происходит очень часто, и вам не нравится видеть очень сложные графики истории фиксации, содержащие коммиты, подобные тому, о котором мы говорим, попробуйте rebase использование rebase вместо merge.

Вы можете сделать это двумя способами (при получении изменений с удаленного сервера):

  • git fetch; git rebase
  • git pull --rebase

Ответ 2

У владельца были некоторые обязательства по разработке, которые они не подтолкнули, затем запустили git pull и взяли/объединили в новые коммиты от разработки, которые были в удаленном репо.

Ответ 3

Я получил сообщение такого же типа. Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop и она ничего не сломала, но LOL... так что не паникуйте. Это только объединение ветки удаленного развития в вашу локальную ветвь развития. До тех пор, пока не возникнут конфликты, вам должно быть хорошо идти :)

Ответ 4

Если вы хотите избежать этого типа слияния, прежде чем потянуть, вот так:

git stash
git pull
git stash pop