Что у меня есть:
---A----B-----C-----D--------*-----E-------> (master)
\ /
1----2 (foo)
Что мне нужно:
---A---------------D--------*-----E-------> (master)
\ /
1----2 (foo)
Некоторое время назад я сделал два коммита, которые хотел бы удалить из репозитория git. Я попробовал множество различных «руководств» по перебазированию, и все они закончились странными историями git, поэтому я создал пример репозитория, и результат оказался не таким, как я ожидал. Может ли кто-нибудь помочь мне понять, что мне не хватает?
У меня есть две ветки, master
и foo
. Я сделал коммит B с одним файлом, который хотел бы удалить, и коммит C, в котором я изменил этот файл. Среди других коммитов я больше никогда не прикасался к этому файлу.
Идентификаторы фиксации:
A: f0e0796
B: 5ccb371
C: a46df1c
D: 8eb025b
E: b763a46
1: f5b0116
2: 175e01f
Итак, я использую rebase -i f0e0796
и удаляю B 5ccb371
и C a46df1c
, правильно? Если я правильно интерпретирую результат, это то, что gitk
показывает мне для моего репо, хотя git branches
по-прежнему перечисляет вторую ветвь.
---A-----1----2---E------> (master)
Кто-нибудь может сказать мне, что здесь произошло?
Редактировать. Вот как воссоздать репозиторий из первого графика:
git init foo
cd foo
touch A
git add A
git commit -m "add A"
touch B
git add B
git commit -m "add B"
echo "modify" > B
git add B
git commit -m "modify B"
touch C
git add C
git commit -m "add C"
git checkout -b foo
touch 1
git add 1
git commit -m "add 1"
touch 2
git add 2
git commit -m "add 2"
git switch master
git merge foo --no-ff
touch E
git add E
git commit -m "add E"
git rebase
или вручную (мой ответ показывает и то, и другое), является способом переписать, а не изменить историю . - person Inigo   schedule 24.04.2020