Я единственный в своей организации, кто совершает коммиты со следующим сообщением:
Объединить ветку удаленного отслеживания origin / develop с develop
Не уверен, что делаю, чтобы вызвать их, но я бы хотел остановиться.
Какую команду я использую для создания этой фиксации и какую команду я должен использовать, чтобы ее не создавать?
git
branching-and-merging
git-merge
git-remote
Джордан Фельдштейн
источник
источник
git pull --autostash --rebase
вас работает @Johnjohn?Ответы:
git pull
вероятно создает фиксацию. Если вы делаете локальную фиксацию, а затем запускаетеgit pull
после того, как кто-то другой отправляет фиксацию в репозиторий, Git загружает фиксацию другого разработчика, а затем объединяет ее в вашу локальную ветвь.Как избежать этих коммитов слияния в будущем
Вы можете использовать,
git pull --rebase
чтобы этого не произошло в будущем, но у перенастройки есть свои опасности, и я рекомендую избегать этогоpull
вообще .Вместо этого я рекомендую вам следовать этой схеме использования:
объяснение
git remote update -p
загружает все коммиты в удаленные репозитории и обновляет ветки удаленного отслеживания (например,origin/master
). Он НЕ касается вашего рабочего каталога, индекса или локальных ветвей.В
-p
аргументе чернослив удаляется вверх по течению ветви. Таким образом, еслиfoo
ветка будет удалена вorigin
репозитории,git remote update -p
автоматически будет удалена вашаorigin/foo
ссылка.git merge --ff-only @{u}
указывает Git объединить ветвь восходящего потока (@{u}
аргумент) с вашей локальной ветвью, но только если ваша локальная ветвь может быть «быстро перенаправлена» в восходящую ветвь (другими словами, если она не разошлась).git rebase -p @{u}
эффективно перемещает коммиты, которые вы сделали, но еще не отправили поверх ветки восходящего потока, что избавляет от необходимости создавать глупые коммиты слияния, которых вы пытаетесь избежать. Это улучшает линейность истории разработки, облегчая просмотр.Эта
-p
опция указывает Git сохранять слияния. Это предотвращает линеаризацию Git перемещаемых коммитов. Это важно, если, например, вы объединили ветку функции вmaster
. В противном случае-p
каждая фиксация в функциональной ветке будет дублироватьсяmaster
как часть линеаризации, выполняемойgit rebase
. Это затруднит, а не облегчит просмотр истории разработки.Остерегайтесь :
git rebase
может не получиться то, что вы ожидаете, поэтому просмотрите результаты, прежде чем нажимать. Например:Я предпочитаю этот подход по
git pull --rebase
следующим причинам:-p
(--preserve-merges
)git rebase
в случае, если вам нужно переустановить намеренное слияние (например, слияние уже размещенной ветки функцииmaster
).Сокращение:
git up
вместоgit pull
Чтобы упростить выполнение описанного выше, я рекомендую создать псевдоним с именем
up
:Теперь все, что вам нужно сделать, чтобы обновить ветку, - это запустить:
вместо
git pull
. Если вы получаете сообщение об ошибке из-за того, что ваша локальная ветка отошла от восходящей ветки, это ваш сигнал для перебазирования.А почему бы и нет
git pull --rebase
?Бег
git pull --rebase
эквивалентен бегу сgit fetch
последующимgit rebase
. Это пытается перемотать вперед к новым коммитам восходящего потока, но если это невозможно, он перебазирует ваши локальные коммиты на новые коммиты восходящего потока. Обычно это нормально, но будьте осторожны:git pull --rebase
не дает вам возможности изучить коммиты перед их включением. В зависимости от того, что изменилось вверх по течению, то вполне возможно , что перебазироваться неправильная операция-аrebase --onto
,merge
,reset
илиpush -f
может быть более подходящим , чем равниныrebase
.--preserve-merges
к операции rebase, поэтому любое намеренное слияние ветки функции будет линеаризовано, воспроизводя (и, таким образом, дублируя) все коммиты ветки функции.«Исправление» существующей фиксации слияния, созданной
git pull
Если вы еще не отправили коммит слияния, созданный с помощью
git pull
, вы можете переустановить коммит слияния. Предполагая, что вы не сделали никаких намеренных слияний (например, слияния уже загруженной функциональной ветки с вашей текущей веткой), следующее должно сделать это:Вышеупомянутая команда указывает Git выбрать все коммиты без слияния, доступные из
HEAD
(текущий коммит), за вычетом всех коммитов, доступных из@{u}
(что является сокращением для «восходящей ветки», то есть,origin/master
еслиHEAD
естьmaster
), воспроизведение (вишневый выбор ) их поверх восходящей ветки, а затем переместите ссылку на текущую ветвь так, чтобы она указывала на результат воспроизведения коммитов. Это эффективно перемещает коммиты без слияния на самую последнюю фиксацию восходящего потока, что устраняет слияние, созданное с помощьюgit pull
.Если у вас есть намеренная фиксация слияния, вы не хотите запускать,
git rebase @{u}
потому что она будет воспроизводить все из другой ветки. Разобраться с этим случаем значительно сложнее, поэтому его хорошо использоватьgit up
иgit pull
вообще избегать . Вероятно, вам придется использоватьreset
для отмены слияния, созданного,pull
а затем сделатьgit rebase -p @{u}
.-p
Аргументgit rebase
надежно не работает для меня, так что вы могли бы в конечном итоге, чтобы использовать ,reset
чтобы отменить преднамеренное слияние, обновить локальную ветвь@{u}
, а затем повторить намеренное слияние (который является болью , если там было много волосатого слияние конфликты).источник
-p
. Я избегал рекомендовать его раньше, потому что он не нужен очень часто и его поведение плохо документировано.git remote update -p
иgit fetch
?git remote update -p
то же самое, что иgit fetch --all -p
. Я привык использоватьgit remote update -p
обратно, когдаfetch
не было-p
возможности.Это должно сработать. Или, если вы хотите продолжать использовать pull
Вы также можете настроить эту ветвь в своей конфигурации для автоматической переустановки или настроить ее автоматически для любых других будущих веток отслеживания, которые вы создадите. Затем вы можете вернуться к использованию
Подробнее об этом в разделе «Вытягивание с перебазированием вместо слияния» на этой странице:
http://mislav.uniqpath.com/2010/07/git-tips/
источник