Git:恢复单个文件的旧提交

Posted

技术标签:

【中文标题】Git:恢复单个文件的旧提交【英文标题】:Git: Revert old commit on single file 【发布时间】:2015-10-08 05:04:21 【问题描述】:

我对在 git 中使用 revert 很陌生,我想知道是否可以执行以下操作。假设我已经做了一些提交,并且我有一个(不言自明的)文本文件,如下所示:

This line was added at commit AAAAA
This line was added at commit BBBBB
This line was added at commit CCCCC

我想使用 revert 来移除提交 BBBBB 所做的更改,以获得如下所示的文件:

This line was added at commit AAAAA
This line was added at commit CCCCC

但是,恢复提交 BBBBB 会导致合并冲突。有什么办法可以避免冲突吗?

【问题讨论】:

你试过这个 -> ***.com/questions/2318777/… ? @unrealsoul007 说要使用git revert @unrealsoul007 是的。我能够恢复提交,但它总是会导致冲突。我可以手动或使用工具解决冲突,但这很不方便(特别是对于大文件)。如果这可以自动完成,那对我来说会很有用。 合并冲突在发生时几乎是不可避免的。 git 真的没有什么神奇的方法可以知道你想要什么 @Retsam 我不太了解提交在 git 中的存储方式,所以我不确定。如果这是真的,那我就硬着头皮去处理。谢谢! 【参考方案1】:

但是,恢复提交 BBBBB 会导致合并冲突。有什么办法可以避免冲突吗?

要找出导致冲突的确切原因,请执行以下操作

git checkout --merge --conflict=diff3 -- path/to/file

这将向您显示 git 不愿意自动合并的文本的原始版本和两个更改版本。

归结为,git 正在合并从恢复提交到其父级的更改与从恢复提交到当前版本的更改:

 bbbbb verson -> aaaaa version,

 bbbbb version -> cccccc version (+ whatever else)

并且更改块重叠,所以,git 不会自动合并。

实际上,鉴于在几个大型项目中进行的合并量很大,您可以肯定任何自动合并的 git 拒绝执行会经常产生无法容忍的不良结果。

【讨论】:

【参考方案2】:

如果您只想恢复单个文件的更改,假设您想恢复上次提交的部分内容,您可以从上一次提交中签出文件的版本

git checkout HEAD~1 directory/path/file.txt
git add directory/path/file.txt
git commit -m "directory/path/file.txt reverted"

基本上git checkout HEAD . 将所有文件从工作目录或仅指定目录或仅单个文件重置为给定提交的指定状态。

此外,如果您想将一个目录恢复到 3 次提交前的状态,您可以:

git checkout HEAD~3 some/directory/

【讨论】:

以上是关于Git:恢复单个文件的旧提交的主要内容,如果未能解决你的问题,请参考以下文章

在 git 中,如何将文件恢复到 3 次提交前?

git revert 某一个文件

git 恢复单个文件的历史版本

更改 Git 中的旧提交 [重复]

Git:恢复一个已经在提交中被删除的文件

git如何获取单个文件的提交时间