繁体   English   中英

Git更改父提交rev

[英]Git change parent commit rev

我的一位同事检查了提交correct_parent的基础上做了一些改变correct_parent ,然后以某种方式误用另一个错误的父母承诺提交转wrong_parent而不是correct_parent (我不太确定他是如何做到这一点)。 让我们调用他的提交bad_commit

一大堆新提交基于bad_commit ,包括新的合并提交,因此它不仅仅是一个线性结构,而更像是钻石。 他们最终又被重新合并为一个分支。 我们称之为bad_branch

我想用正确的父提交correct_parent重新创建bad_commit ,以及所有后续提交。

我不确定该怎么做。 可能不知何故有git rebase--strategy ours左右。 请注意,这不仅仅是一个rebase,因为wrong_parentbad_commit之间的差异不是意义上的,所以我不想将其作为补丁应用。

照片:

wrong_parent -> bad_commit (based on correct_parent) -> ...... -> bad_branch HEAD

我想要:

correct_parent -> bad_commit (merge strategy: take bad_commit) -> .... -> fixed_branch

这可以用移植文件修复,使用git filter-branch永久固定。

设置一个糟糕的回购:

git init
echo a > file && git add file && git commit -m "good parent"
echo b > file && git add file && git commit -m "bad parent"
echo c > file && git add file && git commit -m "child" file

这出现在git log --oneline就像

f6e3133 child
4dc60b6 bad parent
7b5da8a good parent

现在假装“好父母”是“孩子”的父母:

echo `git rev-parse @ @~2` > .git/info/grafts

并再次检查git log --oneline

f6e3133 child
7b5da8a good parent

现在让它永久化:

git filter-branch

并第三次检查git log --oneline

87b8fc8 child
7b5da8a good parent

你看到孩子得到了一个新的哈希。 那是因为提交是用适当的父级重写的。 父母没有得到新的哈希,因为它没有改变。 任何“孩子”的孩子也会被改写。

最后,只需清理:

rm .git/info/grafts

correct_parent创建一个新分支,并基于wrong_parent选择在另一个分支上发生的提交:

git checkout -b fix correct_parent
git cherry-pick wrong_parent..other_branch

感谢@poke的建议!

看起来像git rebase

  1. 创建分支以指向正确的父级

git checkout -b ok_branch <correct_parent>

  1. 保留rebase保存合并(参考http://git-scm.com/docs/git-rebase

-p --preserve-merges

通过重放合并提交引入的提交来重新创建合并提交,而不是展平历史记录。 不保留合并冲突解决方案或手动修改合并提交。

这在内部使用--interactive机器,但明确地将它与--interactive选项结合使用通常不是一个好主意,除非你知道你在做什么(见下面的BUGS)。

git checkout -b replaced_branch <bad_branch>

git rebase --preserve-merges ok_branch

  1. 删除临时分支

git branch -D ok_branch

经过这些改变,你将拥有

- correct parent [ok_branch] - bad commit - .... - HEAD [replaced_branch]

更新

你可能会发现usesul flag --onto (参考https://git-scm.com/book/en/v2/Git-Branching-Rebasing#More-Interesting-Rebases

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM