Git выводит результат посторонним сообщениям "Объединить ветвь" в журнале фиксации

Я работаю с другим разработчиком проекта, и мы используем Github в качестве нашего удаленного репо. Я нахожусь на Mac, используя git 1.7.7.3, он в Windows, используя git 1.7.6.

Это то, что происходит

  • Один из нас (позвоните ему разработчиком A, но неважно, какой из них) подталкивает набор коммитов к GitHub.
  • Другой (разработчик B) делает некоторые локальные коммиты.
  • B делает a git pull.
  • B делает a git push.
  • Глядя на журнал истории фиксации, я вижу Объединить ветку "gigub.com:foo/bar

Журнал фиксации с течением времени заполняется сообщениями "Объединить филиал", а также показывает разработчику B как совершение изменений, внесенных разработчиком A. Единственный способ, который мы обнаружили для предотвращения этой проблемы, заключался в том, чтобы сделать git pull --rebase на шаге 3, но я не знаю, какие побочные эффекты будут использоваться. Это мой первый опыт работы с многопользовательским репо git, так это просто нормальное поведение? Любые мысли о том, как решить эту проблему?

Ответ 1

Конец, который вы видите, отлично. A pull эффективно работает git fetch, а затем git merge, поэтому слияние обычно происходит при запуске git pull.

Альтернатива использованию переустановки вместо слияния возможна, но обычно вам следует избегать ее. Rebasing позволяет сохранить линейную историю, но также удаляет любую информацию о ветвлении, которое изначально произошло. Это также приведет к перезаписи истории текущей ветки, воссоздающей все коммиты, которые не содержатся в целевой ветке (в вашем случае, удаленной). Поскольку воссозданные коммиты - это разные коммиты, это может вызвать много путаницы при разработке вместе с другими, особенно когда люди уже проверили части этих коммитов, прежде чем они будут переписаны (например, с ветвями функций). Таким образом, как правило, вы никогда не должны переписывать любую фиксацию, которая уже была нажата.

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

Итак, длинный рассказ: Да, слияния совершаются отлично, и вы не должны беспокоиться о них.

Ответ 2

Этот ответ был пересмотрен, поскольку мое понимание, диаграммы и выводы были неверными.


git pull вызывает слияние, потому что git объединяется. Это можно изменить, установив ветки для использования rebase вместо merge. Использование rebase вместо merge на pull обеспечивает более линейную историю для общего хранилища. С другой стороны, фиксации слияния показывают параллельные усилия по развитию отрасли.

Например, два человека работают над одной ветвью. Филиал начинается с:

...->C1

Первый человек заканчивает свою работу и подталкивает к ветке:

...->C1->C2

Второй человек заканчивает свою работу и хочет нажать, но не может, потому что ему нужно обновить. Локальный репозиторий для второго лица выглядит следующим образом:

...->C1->C3

Если для параметра pull установлено значение merge, будет отображаться второй репозиторий лиц.

...->C1->C3->M1
      \      /
       ->C2->

Где M1 - фиксация слияния. Эта новая история веток будет перенесена на репо. Если вместо этого вытащить значение для переадресации, то местное репо будет выглядеть так:

...->C1->C2->C3

Нет коммита слияния. История была сделана более линейной.

Оба варианта отражают историю отрасли. git позволяет выбрать, какую историю вы предпочитаете.

Есть действительно места, где rebase может вызвать проблему с удаленными ветвями. Это не один из этих случаев. Мы предпочитаем использовать rebase, поскольку он упрощает уже сложную историю ветвей, а также показывает версию истории относительно общего хранилища.

Вы можете установить branch.autosetuprebase = всегда, чтобы git автоматически устанавливал ваши удаленные ветки как rebase вместо master.

git config --global branch.autosetuprebase always

Этот параметр заставляет git автоматически создавать настройки для каждой удаленной ветки:

branch.<branchname>.rebase=true

Вы можете установить это самостоятельно для своих удаленных веток, которые уже настроены.

git config branch.<branchname>.rebase true

Я хотел бы поблагодарить @LaurensHolst за допрос и преследование моих предыдущих заявлений. Я, конечно, узнал больше о том, как git работает с фиксацией pull и merge.

Для получения дополнительной информации о коммандах слияния вы можете прочитать вклад в проект в ProGit книга. В разделе "Частная небольшая команда" показаны транзакции слияния.

Ответ 3

Выполнение тэга git будет вставлять сообщения "Объединить ветвь", что именно оно делает. Выполняя растягивание git, вы объединили удаленную ветвь в свою локальную ветвь.

Когда вы выполняете git pull и возникают конфликты, журнал git будет показывать обновления конфликтующим файлам, исходящие от пользователя, разрешающего конфликты. Я предполагаю, что это происходит потому, что человек, который исправляет конфликт, повторно фиксирует файл.

Насколько я знаю, как работает git, и вокруг него нет пути.

Rebasing сдует историю git, поэтому вы не сможете увидеть, когда произошли слияния.

Ответ 4

Вы можете сделать:

git pull --rebase

Однако это всегда будет помещать ваши изменения поверх ваших сотрудников. Но вы не получите сообщение о загрязнении слияния.

Ответ 5

На самом деле существует гораздо более простой ответ. Просто попросите разработчика B сделать это, прежде чем совершить его совершение. Это предотвратит эти коммитные коммиты, поскольку они вызваны историей, созданной вами на локальном репо, из локальной коммита, пытающейся объединиться с историей коммитов на удаленном репо. Если вы получите сообщение, говорящее что-то вроде строки "изменения будут перезаписаны" при выполнении pull, это просто означает, что вы оба коснулись одного и того же файла, так что:

git stash
git pull
git stash pop

тогда вы можете разрешить любые конфликты слияния, если они есть.