Как я могу разделить коммит Git на два, если я могу создать промежуточный коммит? - PullRequest
3 голосов
/ 09 января 2020

Изменение было применено к большой кодовой базе, затем был применен форматер, затрагивающий почти каждый файл.

A --------- B

Один коммит B, объединяющий эти два действия, приводит к гигантскому c diff это боль для обзора, а также трудно разделить вручную с помощью интерактивной перебазировки и выбора фрагментов. Тем не менее, я мог бы легко создать промежуточный коммит I, отметив A и запустив на нем средство форматирования кода.

A --------- B
 \ 
  \
   -- I

Учитывая, что я только что сделал коммит I, как я могу легко генерировать коммит B', который заканчивается тем же самым содержимым дерева, что и B?

A --------- B
 \            
  \           
   -- I --- B' # (has exact same contents as B)

Если я наивно делаю

git checkout B
git rebase I

, я получаю массу конфликтов , Я не хочу быть умным, я просто хочу оказаться в том же каталоге, что и B, с предположением, что I..B diff будет значительно меньше, чем A..B.

Ответы [ 2 ]

7 голосов
/ 09 января 2020

Хорошо, если у вас уже есть I и B, вы можете сделать это:

git checkout --detach B
git reset --soft I # move branch pointer (HEAD pointer, in this case) to I, set all differences in index ready to be committed
git commit -m "blah blah"

Теперь вы можете указать любую ветку, где хотите, если вам нравятся результаты:

git branch -f blah
git checkout blah
1 голос
/ 09 января 2020

Просто упомяните решение commit-tree, на которое намекал Торек в комментарии выше:

git reset --hard $(git commit-tree -m "Did this and that" -p I $(git rev-parse B^{tree}))

git commit-tree принимает 3 параметра для создания нового коммита:

-m "Did this and that", чтобы дать вашему B' сообщение
-p I, чтобы установить его родителя (I)
и, наконец,
$(git rev-parse B^{tree}) (без флага, потому что это основной ( обязательный параметр), чтобы указать дерево, которое должно иметь

Команда reset --hard устанавливает текущую ветвь для этой новой фиксации. Таким образом, вы можете выполнить его либо в вашей текущей ветке, которая будет «восстановлена», либо в новой ветке, созданной для этой цели.

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