2015-01-02 2 views
0

У меня есть локальный репозиторий Git и я бег следующего:мерзавца: Дублированные Фиксации После местного Rebase Вслед за Тяговыми

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 

После этого все совершает в удаленное хранилище, которые я извлеченный в притяжении-теперь дублируется в журнале.

Log 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 

Log 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 

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

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

+0

возможно дубликат [коммитов Git продублированы в той же ветви после выполнения перебазирования] (http://stackoverflow.com/questions/9264314/git- commits-are-duplicated-in-the-same-branch-after-doing-a-rebase) – Whymarrh

ответ

0

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

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

+0

Спасибо, Роджер. Связанный с этим вопрос, если у меня было 3 коммита, зафиксируйте 3 (новейшие), зафиксируйте 2 (средний) и совершите 1 (самый старый). Я нажал фиксацию 3. Затем я переустановил фиксацию 1 так, чтобы она была самой новой, а затем нажала фиксацию 1. Могу ли я вызвать такую ​​же ошибку для других пользователей? – Samuel

+0

На самом деле Роджер, похоже, что моя локальная перебаза дала удаленным пользователям «фиксировать новые SHA, 9777c56 и a2d7d8b в журнале 2. Это не должно произойти, если это так? И когда я потянул его, он снова создал оригинальные SHA, которые были впервые замечены в log 1, 2fc4fe7 и b7a8656. Вы уверены, что это не моя вина? Если это моя вина, что я сделал не так? – Samuel

+0

Согласно оригинальной публикации, вы не нажимали на другое репо, поэтому ничего, что произошло в вашем местном репо, не могло повлиять на остальной мир. Вы можете обходиться с (новыми) фиксациями, которые вы делаете локально, но как только вы возвращаетесь к исходному состоянию, или вы извлекаете новые коммиты из источника, вы не должны переустанавливать эти коммиты. Хорошее объяснение [здесь] (http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). –

0

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

git pull --rebase 

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

Смотрите здесь для более подробной информации:

git: Pushing Single Commits, Reordering with rebase, Duplicate Commits

Смежные вопросы