Ответ 1
Правило с Git заключается в том, что вы никогда не должны пытаться изменить историю после того, как она была опубликована, опубликована или отправлена. Конечно, вы можете сделать это, если вы действительно хотите и имеете достаточные разрешения, но это следует делать с большой осторожностью, поскольку это может испортить других людей.
К счастью, теперь, когда у вас есть типичное развертывание Git с единственным вышестоящим репозиторием (источником), который является источником всего хорошего и верного во вселенной, вы можете использовать git pull --rebase
для своего сердца, и это будет совершенно безопасно и на мой взгляд, даст вам гораздо более вменяемые (то есть линейные) истории. Я и моя команда используем это постоянно.
Однако, если вы начинаете использовать несколько пультов и начинаете выполнять git pull --rebase <arguments>
чтобы вы больше не перебирались на одну и ту же цель каждый раз, или начинаете подталкивать свою ветвь в альтернативные репозитории перед запуском git pull --rebase
с вашим первичный по течению - тогда вы можете начать сталкиваться с неприятностями.
В любое время, когда вы делитесь своими изменениями с другим удаленным/репозитарием, а затем изменяете эти изменения (для значений изменения, равных изменению SHA, родителя и т.д., Даже если сообщение/контент фиксации не изменились), вы можете испортить человека у кого были старые изменения.
Пока вы не git pull --rebase
здравого смысла, git pull --rebase
будет очень полезен для вас.
Это не дает ответа на вопрос о разнице между git pull --rebase
и git fetch && git rebase @{u}
. Я просто продолжу и скажу, что я не знаю о какой-либо разнице, и если она есть, она достаточно тонкая, чтобы я не замечал ее в те годы, когда использовал Git. Возможно в том, что система определяет правильный репозиторий, который должна получить ваша ветвь, если у вас есть несколько репозиториев, а "origin" не является последним потоком этой ветки?
И даже если вы действительно сильно ошибаетесь с git-rebase, вы, конечно, можете легко вернуться к своей исходной среде предварительной перебазировки с помощью git log -g
и/или git reset --hard ORIG_HEAD
. Просто не делайте принудительных нажатий (по умолчанию запрещено почти на всех серверах Git), и вы будете счастливы.
РЕДАКТИРОВАНИЕ
Со временем мое понимание расширилось. git pull --rebase
вызывает git rebase
для выполнения работы rebase, так что в этом смысле между ними нет никакой разницы. Однако git-pull фактически вызывает git rebase --onto @{u} $(git merge-base HEAD @{u}@{1})
Хорошо, этот синтаксис ("@{u} @{1}"), возможно, немного непрозрачен и упрощает загрузку, но суть в том, что он выясняет, какой была база слияния для восходящего потока ДО того, как он запустил команду fetch. Вы спрашиваете, какая разница
Ну, в обычном случае нет. Однако, если вы меняете, куда указывает восходящий поток или если сам восходящий поток был перебазирован, довольно много. Если апстрим был переписан, а затем вы сделали git rebase @{u}
вы можете быть очень несчастны и можете получить двойные коммиты или конфликты в зависимости от того, насколько старые коммиты были переписаны.
Однако, благодаря магии git pull --rebase
только коммиты, которые принадлежат вам и только вам, будут применены поверх @{u}.
ОК, это тоже упрощение. Если восходящий поток выполнил ребаз, начиная с 100 коммитов назад (но на самом деле в истории есть коммиты 101+), и вы сделали git fetch
перед выполнением git pull --rebase
то Git не сможет точно определить, что именно является историческим база слияния должна была выяснить, каковы ваши локальные коммиты.
В результате git fetch
считается вредоносным (когда у вас есть локальные коммиты, а апстрим переписан). Однако настоящее эмпирическое правило - "никогда не пытайтесь изменить историю после того, как она была опубликована, опубликована или отправлена", именно с этого я и начал.
TL; DR:
git fetch
считается вредным (поэтому используйте git pull --rebase
); и никогда не пытайтесь изменить историю после того, как она будет опубликована, опубликована или отправлена (потому что, среди прочего, это будет вредно для git fetch
).