Я знаю некоторых людей, которые используют git pull --rebase
по умолчанию и других, которые настаивают на том, чтобы никогда не использовать его. Мне кажется, я понимаю разницу между слиянием и перебазированием, но я пытаюсь представить это в контексте git pull
. Речь идет о нежелании видеть много сообщений о коммитах слияния или есть другие проблемы?
806
Ответы:
Вы должны использовать
git pull --rebase
когдаДействительно - почему бы и нет? Это более понятно и не накладывает логическую группировку на ваши коммиты.
Хорошо, я полагаю, это нуждается в пояснениях. В Git, как вы, наверное, знаете, вам рекомендуется ветвиться и сливаться. Ваша локальная ветвь, в которую вы вносите изменения, и удаленная ветвь, на самом деле, являются разными ветвями, и
git pull
вот-вот объединятся Это разумно, поскольку вы нажимаете не очень часто и обычно накапливаете ряд изменений, прежде чем они станут законченной функцией.Однако иногда - по какой-либо причине - вы думаете, что на самом деле было бы лучше, если бы эти два - удаленный и локальный - были одной ветвью. Как в SVN. Именно здесь
git pull --rebase
вступает в игру. Вы больше не объединяетесь - вы фактически делаете коммит поверх удаленной ветви . Вот о чем это на самом деле.Опасно ли это или нет - вопрос о том, рассматриваете ли вы локальную и удаленную ветвь как одну неразделимую вещь. Иногда это разумно (когда ваши изменения небольшие, или если вы находитесь в начале активной разработки, когда важные изменения вносятся небольшими коммитами). Иногда это не так (когда вы обычно создаете другую ветку, но вам было лень это делать). Но это другой вопрос.
источник
git config --global pull.rebase preserve
(сохраняйте, помимо включения перебазировки, пытается сохранить слияния, если вы сделали их локально).Я хотел бы представить другой взгляд на то, что на самом деле означает «git pull --rebase», потому что иногда кажется, что он теряется.
Если вы когда-либо использовали Subversion (или CVS), вы можете привыкнуть к поведению «svn update». Если у вас есть изменения для фиксации, и фиксация завершается неудачей, потому что изменения были внесены в апстрим, вы "svn update". Subversion действует путем слияния изменений в верхнем потоке с вашими, что может привести к конфликтам.
То, что только что сделал Subversion, было «pull --rebase». Акт переформулировки ваших локальных изменений в соответствии с более новой версией - это «перебазирование» его части. Если вы выполнили «svn diff» до неудачной попытки коммита и сравнили полученный в результате diff с выводом «svn diff», то разница между этими двумя разностями заключается в том, что сделала операция перебазировки.
Основное различие между Git и Subversion в этом случае состоит в том, что в Subversion «ваши» изменения существуют только как не зафиксированные изменения в вашей рабочей копии, в то время как в Git у вас есть фактические коммиты локально. Другими словами, в Git вы раздвоили историю; Ваша история и история восходящего направления разошлись, но у вас есть общий предок.
На мой взгляд, в обычном случае, когда ваша локальная ветвь просто отражает ветвь вверх по течению и выполняет непрерывную разработку, всегда нужно делать «--rebase», потому что это то, что вы на самом деле делаете семантически . Вы и другие взламываете намеченную линейную историю ветви. Тот факт, что кто-то еще немного толкал до вашей попытки толчка, не имеет значения, и кажется, что каждая такая случайная ошибка не дает результатов в результате слияния в истории.
Если вы действительно чувствуете необходимость того, чтобы что-то было филиалом по какой-либо причине, то, на мой взгляд, это другое дело. Но если у вас нет конкретного и активного желания представлять свои изменения в форме слияния, поведение по умолчанию, на мой взгляд, должно быть «git pull --rebase».
Пожалуйста, рассмотрите других людей, которым необходимо наблюдать и понимать историю вашего проекта. Вы хотите, чтобы история была завалена сотнями слияний повсюду, или вы хотите, чтобы только несколько избранных слияний представляли собой реальные слияния преднамеренных расходящихся усилий по развитию?
источник
git config --global branch.autosetupmerge always
?Возможно, лучший способ объяснить это на примере:
git checkout master && git pull
. Мастер уже в курсе.git checkout master && git pull
. Мастер уже в курсе.git merge topic-branch-A
git merge topic-branch-B
git push origin master
до Алисыgit push origin master
, что отклонено, потому что это не ускоренное слияние.git pull --rebase origin master
git push origin master
, и все рады, что им не нужно читать бесполезный коммит слияния, когда они смотрят журналы в будущем.Обратите внимание, что конкретная ветвь, которая объединяется, не имеет отношения к примеру. Master в этом примере также может быть веткой релиза или веткой разработчика. Ключевым моментом является то, что Алиса и Боб одновременно объединяют свои локальные ветви в общую удаленную ветку.
источник
git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin master
повторять, если чужой толчок к мастеру случился раньше моего. Хотя я вижу краткие преимущества в вашем рецепте.Я думаю, что вы должны использовать
git pull --rebase
при сотрудничестве с другими в той же отрасли. Вы находитесь в цикле работа → фиксация → работа → фиксация, и когда вы решаете отправить свою работу, ваша отправка отклоняется, потому что параллельно выполнялась одна и та же ветка. В этот момент я всегда делаюpull --rebase
. Я не использую сквош (чтобы сгладить коммиты), но я перебазирую, чтобы избежать лишних коммитов слияния.По мере того как ваши знания Git увеличиваются, вы обнаруживаете, что смотрите на историю намного больше, чем на любые другие системы контроля версий, которые я использовал. Если у вас есть тонна небольших коммитов, легко потерять фокус из общей картины, происходящей в вашей истории.
На самом деле это единственный раз, когда я делаю ребазинг (*), и остальная часть моего рабочего процесса основана на слиянии. Но пока ваши самые частые коммиттеры делают это, история в итоге выглядит намного лучше.
(*) Во время преподавания курса Git у меня был студент, арестовавший меня по этому поводу, поскольку я также выступал за перебазирование ветвей функций в определенных обстоятельствах. И он прочитал этот ответ;) Такой перебазирование также возможно, но оно всегда должно быть в соответствии с заранее оговоренной / согласованной системой, и как таковое не должно "всегда" применяться. И в то время я обычно тоже не делаю
pull --rebase
, о чем вопрос;)источник
Я не думаю, что когда-либо есть причина этого не использовать
pull --rebase
- я специально добавил код в Git, чтобы мояgit pull
команда всегда перебазировалась против коммитов вверх по течению.Просматривая историю, просто никогда не бывает интересно узнать, когда парень / девушка, работающий над этой функцией, прекратил синхронизацию. Это может быть полезно парню / девочке, пока он / она это делает, но это то
reflog
, для чего. Это просто добавляет шума для всех остальных.источник
pull --rebase
всегда следует использовать, почему неpull
делает это по умолчанию?.gitconfig
чтобы заставить некоторые варианты делать правильные вещи. Я думаю, что git rebase по умолчанию делает не то, что делает git tag и т. Д. Если вы не согласны, вам не нужно обосновывать свое мнение.master
, и если ветвь, в которую вы входите, еще не стала публичной (пока). Если вы потяните с другой стороны ветвь функции на другую,master
это будет как наоборот: нет никакой причины использовать--rebase
, верно? Это может быть причиной того, что это не по умолчанию. Я обнаружил, что Rebases - это то, как изменения должны проходить от вершины иерархии вниз, а слияния - как они возвращаются вверх. derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebaseПросто помни:
Итак, выберите способ, которым вы хотите управлять своей веткой.
Вы бы лучше знали разницу между слиянием и перебазированием :)
источник
Я думаю, что это сводится к личным предпочтениям.
Вы хотите скрыть свои глупые ошибки перед тем, как вносить изменения? Если это так,
git pull --rebase
идеально. Позволяет позже раздавить ваши коммиты на несколько (или один) коммитов. Если у вас есть слияния в вашей (невыпущенной) истории, это не так легко сделатьgit rebase
позже.Я лично не против опубликовать все свои глупые ошибки, поэтому я склонен сливаться, а не перебазировать.
источник
git pull --rebase
может скрыть переписывание истории от соавтораgit push --force
. Я рекомендую использовать,git pull --rebase
только если вы знаете, что забыли подтолкнуть свои коммиты, прежде чем кто-то другой сделает то же самое.Если вы ничего не совершали, но ваше рабочее пространство не чистое, просто
git stash
перед этимgit pull
. Таким образом, вы не будете молча переписывать свою историю (которая может молча отбросить некоторые ваши работы).источник