Git репозиторий не синхронизирован после перебазирования - PullRequest
2 голосов
/ 07 января 2011

Я раздавил 2 коммита (A и B) в один новый коммит (C). Предыдущие два коммита (A и B) были удалены. Я перенес эти коммиты из моего репозитория разработки в центральное (голое) хранилище. git-log в обоих репо подтверждает, что коммиты A и B были удалены. Проблема в том, что когда я делаю тягу к третьему репозиторию, который уже имел (A и B), теперь у него есть все три коммита (A, B и C).

Я бы подумал, что тяга синхронизирует эти изменения. Нужно ли мне оформить заказ A ~ 1, а затем включить новые изменения? Это похоже на хлопоты, особенно в производственной среде.

1 Ответ

8 голосов
/ 07 января 2011

В основном это рассматривается в «Восстановление после восходящего повтора» , но это немного запутано для моих вкусов.

Вы должны знать, что git pull origin master точно равно git fetch master; git merge origin/master,Другими словами, вы попросили git объединить B и C вместе.Есть причина, по которой нецелесообразно перебазировать изменения, которые уже были опубликованы: потому что довольно легко воскресить старые коммиты.

Так как это был простой сквош, git pull --rebase сможет понять этоиз.Вернитесь туда, где вы были до ошибочного слияния, и скажите git pull --rebase origin master (или git rebase origin/master, поскольку вы уже получили).Это волшебным образом перенесет A, B и любые последующие коммиты на C, и он заметит, что A + B = C.

Вы можете сделать это по умолчанию, так как это позволит вам избежать подобных беспорядков -установить для конфигурации branch.<name>.rebase значение true.

...