Git反向合并子树

Posted

技术标签:

【中文标题】Git反向合并子树【英文标题】:Git reverse merge of subtree 【发布时间】:2011-04-03 23:18:18 【问题描述】:

我发现了一些其他关于 Git 中的反向合并的问题,但这些问题是在询问如何反向合并整个提交。我想反向合并树中的一个目录。这在 Git 中可行吗?

在颠覆中,你可以这样做:

$ cd /workingcopy/some/subtree
$ svn merge -r802:801 .

这会计算修订版 801 和 802 之间的反向差异,并且仅将其应用于当前目录。

我能想到的最好的是

$ cd /gitrepo/some/subtree
$ git diff <commit-sha1> <commit-sha1>^ . > patchfile
$ patch -p1 < patchfile

虽然我还没有实际测试过。 git 能不能做得更好?

【问题讨论】:

***.com/questions/642264/… 有帮助吗?不是一个明确的答案,但仍然是。 读完之后,我想我的问题的答案是,“不,git 做起来并不比补丁容易。” 【参考方案1】:

您可以使用git checkout 来签出指定修订版的整个目录。例如,要将目录src 恢复为提交五次提交:

$ git checkout HEAD~5 -- src
$ git status           # See what files changes
$ git diff --cached    # Review the changes
$ git commit

【讨论】:

你想要git diff --cached。路径上的git checkout 通过将其加载到索引中,然后将其复制到工作树中来工作。这意味着git diff 不会显示任何内容,因为索引和工作树匹配。 不过,这会吹走我之前 4 次提交的所有更改。

以上是关于Git反向合并子树的主要内容,如果未能解决你的问题,请参考以下文章

撤消(反向合并)Subversion中的更改/版本

SVN反向合并?

在不使用反向补丁的情况下从分支中删除旧的 Git 提交? [复制]

如何配置系统通过 ssh 反向隧道/代理使用 git?

什么是SVN中的反向合并(Revert Merge),简单的解释和从头到尾的逐步过程

使用 gogs 搭建私人 git 服务器 | nginx 添加反向代理到二级域名