Разбить предыдущий коммит на несколько коммитов - PullRequest
1038 голосов
/ 02 июня 2011

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

Ответы [ 12 ]

1 голос
/ 08 февраля 2017

Если у вас есть это:

A - B <- mybranch

Где вы зафиксировали некоторый контент в коммите B:

/modules/a/file1
/modules/a/file2
/modules/b/file3
/modules/b/file4

Но вы хотите разделить B на C - D и получить такой результат:

A - C - D <-mybranch

Вы можете, например, разделить контент (контент из разных каталогов в разных коммитах) ...

Сбросить ветку до коммита до того, как разделить:

git checkout mybranch
git reset --hard A

Создать первый коммит (C):

git checkout B /modules/a
git add -u
git commit -m "content of /modules/a"

Создать второй коммит (D):

git checkout B /modules/b
git add -u
git commit -m "content of /modules/b"
0 голосов
/ 05 июля 2019

Прошло уже более 8 лет, но, возможно, кто-то найдет это полезным в любом случае.Я смог сделать трюк без rebase -i.Идея состоит в том, чтобы привести git в то же состояние, в котором он находился до того, как вы сделали git commit:

# first rewind back (mind the dot,
# though it can be any valid path,
# for instance if you want to apply only a subset of the commit)
git reset --hard <previous-commit> .

# apply the changes
git checkout <commit-you-want-to-split>

# we're almost there, but the changes are in the index at the moment,
# hence one more step (exactly as git gently suggests):
# (use "git reset HEAD <file>..." to unstage)
git reset

После этого вы увидите этот блестящий Unstaged changes after reset: и ваш репо находится в состоянии, как высобирается зафиксировать все эти файлы.Отныне вы можете легко совершить это снова, как обычно.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...