Можно ли «удалить» коммит слияния, просто удалив один из родительских указателей? - PullRequest
2 голосов
/ 22 марта 2019

Я бы хотел "удалить" ветку "A" из ветки "B".

https://i.stack.imgur.com/y4GOu.png

На изображении выше это означало бы просто удаление пунктирной линии между коммитом "095195e" и "A".

Я не хочу использовать возврат, потому что позже я могу объединить ветвь «B» с ответвлением «А», и мне придется вернуться назад.

Кроме того, допустим, что эти две ветви продолжаются, и A объединяется с B еще несколько раз. Будет ли способ использовать эту операцию «unmerge» для удаления всех слияний A в B.

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Можете ли вы просто удалить родителя из ревизии? Нету. Это потребовало бы переписать историю ветви B:

git checkout e137e9b # go back to the revision before A was merged into B
git cherry-pick B~2..B # apply all changes past the point where the branches where merged
# if everything looks fine, move B pointer
git branch -f B
git checkout B

Теперь A и B разделены

То же самое можно сделать с помощью rebase:

git rebase --onto e137e9b B~2 B

Но это не так полезно с точки зрения объяснения происходящего (точно так же, как я делал в своем первом рецепте).

0 голосов
/ 23 марта 2019

Есть две причины, почему это не работает:

1) Родительские ссылки идут на вычисление хеш-кода коммита.Так что вы бы переписали историю, которая обычно не рекомендуется для публичных веток.

2) Однажды Линус сказал, что Git - тупой трекер контента.Это означает: Git хранит снимки, а не различия.В вашем случае это означает, что простое удаление второго родительского указателя не "отменит" изменения файлов, связанных с фиксацией слияния.

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