Git: Дубликат завершается после локальной ребазы, после которой Pull

У меня есть локальный репозиторий git, и я запускаю следующее:

git.exe pull -v --no-rebase --progress "origin" // pull 1
(make a few local commits)
git.exe pull -v --no-rebase --progress "origin" // pull 2
git log --pretty=format:"%h - %an : %s"         // log 1
git rebase -i HEAD~4
(move local commit 1 down 2 positions)
git log --pretty=format:"%h - %an : %s"         // log 2
git.exe pull -v --no-rebase --progress "origin" // pull 3
git log --pretty=format:"%h - %an : %s"         // log 3

После этого все записи в удаленном репозитории, которые я получил в pull 1, теперь дублируются в журнале.

Журнал 1 выглядит следующим образом:

84e4015 - Me : Local Commit 3
0dbe86a - Me : Local Commit 2
d57ba2a - Me : Merge branch 'master' of remote repository
a86ea35 - Me : Local Commit 1 before reordering
2fc4fe7 - Remote User 2 : Remote Commit 2
b7a8656 - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

Журнал 2 выглядит следующим образом:

cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

И журнал 3 выглядит так:

e8e1a85 - Me : Merge branch 'master' of remote repository
cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
2fc4fe7 - Remote User 2 : Remote Commit 2 // duplicate 2
b7a8656 - Remote User 1 : Remote Commit 1 // duplicate 1
8ce80fc - Me : Merge branch 'master' of remote repository

Чем я ошибся? Как я могу предотвратить? Как я могу исправить?

Обратите внимание, что я никогда не толкал в удаленный репозиторий, а только извлекал из него и делал локальные коммиты. Также обратите внимание, что в этом вопросе есть много похожих тем, но все они немного разные, и ответы там, похоже, здесь не применимы.

Ответ 1

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

Ключ заключается в том, что удаленные пользователи фиксируют изменения с log1 на log2 - они переустанавливают и толкают свою работу. Но ваша работа основана на их предварительных обязательствах. Таким образом, ваше местное репо содержит эти два коммита (2fc4fe7, b7a8656), что их rebase уничтожил их репо и происхождение (предположительно они были нажаты с --force). Поэтому, когда вы затем извлекаете из источника, эти локальные коммиты кажутся реинкарнированными, чтобы обеспечить сохранение истории фиксации, а также скомбинированные транзакции удаленных пользователей (9777c56, a2d7d8b). Следовательно, дубликаты.

Ответ 2

Проблема заключается в git pull. Я должен был использовать:

git pull --rebase

Это уменьшает мои локальные коммиты, чтобы они были сверху, то есть более поздние, чем фиксации в удаленном репо. Поэтому, когда я переустанавливаю свои обязательства по изменению порядка, я не переустанавливаю фиксации, которые были перенесены на удаленное репо. Посредством переустановленных коммитов, которые были перенесены на удаленное репо, я копировал их и назначал им новую SHA, и когда я делал второй git pull, он перетаскивал оригинальные SHA/коммиты, следовательно, дубликаты.

Подробнее см. здесь:

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