Я понимаю сценарий, представленный в Pro Git о рисках git rebase
. Автор в основном говорит вам, как избежать дублированных коммитов:
Не перегружать коммиты, которые вы переместили в общий репозиторий.
Я расскажу вам о своей конкретной ситуации, потому что я думаю, что это не совсем соответствует сценарию Pro Git, и я все равно получаю дублированные коммиты.
Скажем, у меня есть две удаленные ветки с их локальными копиями:
origin/master origin/dev
| |
master dev
Все четыре ветки содержат одни и те же коммиты, и я собираюсь начать разработку в dev
:
origin/master : C1 C2 C3 C4
master : C1 C2 C3 C4
origin/dev : C1 C2 C3 C4
dev : C1 C2 C3 C4
После нескольких коммитов я нажимаю изменения на origin/dev
:
origin/master : C1 C2 C3 C4
master : C1 C2 C3 C4
origin/dev : C1 C2 C3 C4 C5 C6 # (2) git push
dev : C1 C2 C3 C4 C5 C6 # (1) git checkout dev, git commit
Мне нужно вернуться к master
, чтобы быстро исправить:
origin/master : C1 C2 C3 C4 C7 # (2) git push
master : C1 C2 C3 C4 C7 # (1) git checkout master, git commit
origin/dev : C1 C2 C3 C4 C5 C6
dev : C1 C2 C3 C4 C5 C6
И вернемся к dev
Я переустанавливаю изменения, чтобы включить быстрое исправление в моей реальной разработке:
origin/master : C1 C2 C3 C4 C7
master : C1 C2 C3 C4 C7
origin/dev : C1 C2 C3 C4 C5 C6
dev : C1 C2 C3 C4 C7 C5' C6' # git checkout dev, git rebase master
Если я показываю историю коммитов с GitX/gitk, я замечаю, что origin/dev
теперь содержит две идентичные коммиты C5'
и C6'
, которые отличаются от Git. Теперь, если я нажимаю изменения на origin/dev
, это результат:
origin/master : C1 C2 C3 C4 C7
master : C1 C2 C3 C4 C7
origin/dev : C1 C2 C3 C4 C5 C6 C7 C5' C6' # git push
dev : C1 C2 C3 C4 C7 C5' C6'
Возможно, я не полностью понимаю объяснение в Pro Git, поэтому я хотел бы знать две вещи:
- Почему Git дублирует эти коммиты при перезагрузке? Есть ли какая-то особая причина сделать это вместо того, чтобы просто применять
C5
иC6
послеC7
? - Как я могу избежать этого? Было бы разумно это сделать?