Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

Git. Удалить родителя из коммита или отменить слияние

Здравствуйте. Имеется следующая ветка:
* c9ec96c Some Changes in EG proj * 928b5ea Merge branch 'testHDFS' |\ | * 1504e3f Redact Task | * a9dffca Add xmlResult | * 82cd8fb EGp with MetaCode | * db93620 Add EG progect to test * | 536029f Redact Task * | 44cc081 Add xmlResult * | 370584a EGp with MetaCode * | 96c5388 Add EG progect to test |/ * 765ca4c v5HDFS * 5da3f2a v4HDFS * cedc686 v3HDFS * 28d0e1a v2HDFS * a6f9d63 v1HDFS * e5f373a v3 * 708e3b6 v2 * c89f76a First commit
Ответвление от 765ca4c появилось после попытки переписать e-mail автора коммитов. Затем последовало слияние двух одинаковых коммитов (возможно вовремя не слил все изменения с github). Необходимо удалить дублирующую ветку.
Были следующие попытки исправить ситуацию:
git rebase --onto c9ec96c 536029f как посоветовали здесь. Результат:
First, rewinding head to replay your work on top of it... Fast-forwarded HEAD to c9ec96c. git reset --hard 1504e3f дабы удалить коммит вовсе (принимая во внимание, что это может привести к плачевным последствиям)
UPD: Попробовал метод от @alexander barakin, вот что получилось:
git checkout c9ec96с git rebase -i 765ca4c
pick 96c5388 Add EG progect to test pick 370584a EGp with MetaCode pick 44cc081 Add xmlResult pick 536029f Redact Task pick db93620 Add EG progect to test pick 82cd8fb EGp with MetaCode pick a9dffca Add xmlResult pick 1504e3f Redact Task pick c9ec96c Some Changes in EG proj
Затем:
pick 96c5388 Add EG progect to test pick 370584a EGp with MetaCode pick 44cc081 Add xmlResult pick 536029f Redact Task pick c9ec96c Some Changes in EG proj :x
Successfully rebased and updated detached HEAD. git log --oneline --graph
* f647a1b Some Changes in EG proj * 536029f Redact Task * 44cc081 Add xmlResult * 370584a EGp with MetaCode * 96c5388 Add EG progect to test * 765ca4c v5HDFS * 5da3f2a v4HDFS * cedc686 v3HDFS * 28d0e1a v2HDFS * a6f9d63 v1HDFS * e5f373a v3 * 708e3b6 v2 * c89f76a First commit git checkout master
Warning: you are leaving 1 commit behind, not connected to any of your branches: f647a1b Some Changes in EG proj If you want to keep it by creating a new branch, this may be a good time to do so with: git branch f647a1b Switched to branch 'master' Your branch is up-to-date with 'origin/master'. git log --oneline --graph
* c9ec96c Some Changes in EG proj * 928b5ea Merge branch 'testHDFS' |\ | * 1504e3f Redact Task | * a9dffca Add xmlResult | * 82cd8fb EGp with MetaCode | * db93620 Add EG progect to test * | 536029f Redact Task * | 44cc081 Add xmlResult * | 370584a EGp with MetaCode * | 96c5388 Add EG progect to test |/ * 765ca4c v5HDFS * 5da3f2a v4HDFS * cedc686 v3HDFS * 28d0e1a v2HDFS * a6f9d63 v1HDFS
Я понимаю, что создалась новая ветка и я могу по хэшу переключиться на head. Но не понимаю почему не удалились старые коммиты. Пытался дропнуть их и через rebase и через reset. Если ввести команду rebase для f647a1b (пересчитанный коммит), то на него смотрят коммиты, которые "выше" c9ec96c. Видимо не до конца произошло перебазирование и появился конфликт.


Ответ

насколько я понял, вы хотите удалить четыре «продублированных» коммита (и коммит слияния).
для этого можно воспользоваться интерактивным вариантом команды rebase
$ git rebase -i коммит.до.разветвления

пример:
$ git log --oneline --graph * aabf478 7 * 5430d97 6 * 696565e bind |\ | * dff29c3 15 | * 5709144 14 | * 133cf40 13 * | 1807d0e 5 * | f61ce99 4 * | c5c42a9 3 |/ * c521dd2 2 * fd32efc 1
требуется, чтобы история выглядела так: 1 - 2 - 3 - 4 - 5 - 6 - 7, а коммиты с сообщениями 13, 14, 15 и bind — вообще убрать.
в данном случае коммит до разветвления — это коммит с сообщением 2 и хэшем c521dd2
$ git rebase -i c521dd2
откроется редактор со следующими строками (обратите внимания — коммита слияния с сообщением bind в этом списке нет (и не должно быть)):
pick c5c42a9 3 pick f61ce99 4 pick 1807d0e 5 pick 133cf40 13 pick 5709144 14 pick dff29c3 15 pick 5430d97 6 pick aabf478 7
надо просто удалить строки с сообщениями 13, 14, 15, чтобы остался такой список:
pick c5c42a9 3 pick f61ce99 4 pick 1807d0e 5 pick 5430d97 6 pick aabf478 7
сохраняем файл и закрываем редактор. git закончит работу и выдаст примерно следующее:
Successfully rebased and updated refs/heads/master.
теперь история выглядит так, как требовалось:
$ git log --oneline --graph * 894f56f 7 * 305ff84 6 * 1807d0e 5 * f61ce99 4 * c5c42a9 3 * c521dd2 2 * fd32efc 1
естественно, хэши у перезаписанных коммитов (с сообщениями 6 и 7) изменились. но «содержание» у них осталось прежним, и в рабочем каталоге сейчас та же «картина», что и до вызова rebase

Комментариев нет:

Отправить комментарий