Git: повторяющиеся коммиты после локальной переадресации, затем нажмите

Фон:

У меня есть ветвь признаков A, которая является одной фиксацией впереди моей ветки разработки:

3   (develop, origin/develop)
| 2 (A, origin/A) some feature branch commit
|/
1   some commit

Затем я переустанавливаю A на develop (git checkout A, git rebase develop), поэтому я получаю:

2'  (A) some feature branch commit
|
3   (develop, origin/develop)
| 2 (origin/A) some feature branch commit
|/
1   some commit

Теперь я больше не могу нажимать A на origin, так как Git отклонит непродолжительное форвардное коммит. Он говорит мне, что сначала удаляю удаленные изменения.

Когда я это сделаю, а затем нажмите, я получаю следующую историю:

4   (A, origin/A) merged origin/A into A
|\
2'| some feature branch commit
| |
3 | (develop, origin/develop)
| 2 (origin/A) some feature branch commit
|/
1   some commit

Я заканчиваю историю, содержащую бит 2 дважды - технически разные коммиты, хотя они делают то же самое.

Вопросы

  • Как я могу предотвратить это? Как я могу зеркалировать свою локальную операцию переадресации на удаленном репо?
  • Как я могу исправить эту ситуацию? Какой будет самый элегантный способ очистить историю и показать только одну фиксацию?

Ответ 1

  • Ребайка переписывает историю - чтобы избежать проблем, не переустанавливайте вещи, которые нажимаются.

  • Вы можете push --force, пока A будет извлечен. origin/A история будет перезаписана вашей версией A. Обратите внимание, что это потребует ручного вмешательства других разработчиков в свои репозиции после этого.

Ответ 2

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

Как я могу исправить эту ситуацию? Какой был бы самый элегантный способ очистить историю, покажет только одну фиксацию?

Удалите удаленную ветку и отпустите новую ветвь с переустановленной. Если другие члены вашей команды, возможно, вытащили ваш филиал "А", сообщите им, чтобы удалить эту ветку и отменить новую версию.