Git переставить корневой коммит и второй коммит - PullRequest
0 голосов
/ 26 декабря 2018

Я учусь использовать GIT и Bitbucket.Администратор Bitbucket (не я) создал удаленный репозиторий.

В этом репозитории я зафиксировал свои изменения 'A' в ветке Master (теперь это root / parent / first commit в репозитории).

Теперь я совершил еще одно изменение 'B' в ветке Master.Как я могу изменить порядок коммитов в удаленном и локальном репозитории и стереть всю предыдущую историю начального коммита?

В Bitbucket это должно выглядеть следующим образом:

До: В ветке Master

B «Новый коммит»

A «Первоначальный коммит»


После: В ветке Master

A «Первоначальный коммит»

B«Новый коммит»

Фиксация «B» должна была быть первой / начальной фиксацией, но я случайно толкнул свои изменения в неправильном направлении.

Можно ли исправить это с помощью команд git?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я решил эту проблему, используя сиротскую ветку.Я использовал следующие команды:

Из вашего локального репозитория (основная ветка) создайте потерянную ветку

git checkout --orphan orphan_name

Удалитьвсе файлы

git rm -rf.

Добавить новые изменения

git add.

Commitизменение

git commit -a -m "Initial Commit"

Push-изменение

git push origin orphan_name

Снова извлеките основную ветвь

мастер проверки git

Перезапишите "master" именем "orphan_name":

gitсбросить --hard orphan_name

Принудительно отправить push-сообщение в удаленный репозиторий:

git push -f origin master

Удалить потерянную ветвь

git push --delete origin orphan_name

Я знаю, что делать это в опубликованном ветке / публичном репо - это риск.Но было полезно изменить порядок корневого коммита с помощью сиротского ветвления.

0 голосов
/ 26 декабря 2018

Лучший общий ответ здесь, вероятно, заключается в том, что вы должны сделать git revert для функциональной отмены первого коммита A:

git revert <SHA-1 of A commit>

Чтобы узнать хеш коммита для A, просто введитеgit log и ищите хэш самого первого коммита.Это будет выглядеть примерно так: 3kd983ngl74ok.

Это добавит новый коммит к вашей ветке master, который функционально отменяет все, что добавлено A коммит.Таким образом, ваша ветвь master теперь будет выглядеть так:

master: A -- B -- R

, где R - это новая фиксация возврата.Но ветка master будет вести себя так, как если бы A никогда не происходило.

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

Другая возможность здесьсделать интерактивную перебазировку и хирургическим путем удалить коммит A из истории.Но это будет более трудоемким, более сложным, а также откроет возможность того, что плохие вещи могут случиться, когда вы принудительно нажмете master на пульте.

...