如何在单个文件上回滚(重置)git中的已提交更改

时间:2017-10-25 14:14:34

标签: git git-merge git-rebase git-reset

我在我的功能分支上有一个提交,由3个文件组成,其中一个文件现在与master有合并冲突。

我想:

  • 回滚对冲突文件的提交
  • 从master转到具有冲突的文件
  • 手动重新应用对该文件的回滚更改

我已经尝试恢复,但这适用于整个提交而不是单个文件。

我已经尝试检出单个文件(在我想要回滚的提交之前的修订版本)并提交它(基本上恢复单个文件)。然而,当我改变冲突时,冲突仍然会发生。

我觉得我需要以某种方式对此单个文件进行硬重置,但我看不到重置单个文件的方法。

2 个答案:

答案 0 :(得分:2)

您可以从其他提交中使用git checkoutget a single file,如下所示:

git checkout <commit> -- path/to/file

为了防止冲突,您应该将新提交压缩到之前(冲突的)提交。

rebase将在列表中应用每个提交,一次一个。如果你有冲突,那么你每次重新绑定时都必须重新解决这个冲突。这是我喜欢好的一个原因的一个原因。合并。合并发生在堆栈的顶部(因此您的反冲突提交将适用),并且您遇到的任何冲突只需要解决一次。

如果你真的想要使用rebase,那么你可以git rebase -i HEAD~N(其中N是你需要返回以进行冲突提交的许多提交)然后直接编辑该提交(放置{{1在编辑器中它旁边或者将第二个提交压缩到第一个提交(在新提交旁边放置一个e)。基本上,您需要更改提交历史记录。然后你应该能够重新掌握主人。

答案 1 :(得分:1)

这里的问题是概念性的:您正在接受适用于提交的命令,并尝试将它们应用于文件,这会使您的理由偏向于如何解决手头的问题。

澄清:文件未单独提交。每个提交都有一个TREE,表示整个项目内容的状态。您更改了三个文件,这将创建内容的新状态;您git commit,这会创建一个新的COMMIT对象,其中TREE代表项目的新状态。

也许混淆来自熟悉其他源代码控制工具。 git使用的提交模型与CVS形成对比,后者将更改提交给单个版本化文件,例如。

因此,如果您使用reset之类的内容回滚,则撤消所有更改。如果您rebasemaster获得更改,则会从主服务器获得所有更改。

这并不意味着你无法前往你想去的地方;你只需要采取不同的方法。

最简单的(和IMO最正确的情况)要做的是在合并操作期间解决这个问题。一旦get告诉您存在冲突,您就可以获得一个冲突文件的master版本

git checkout master -- path/to/conflicting/file

然后,您可以使用您正在使用的任何编辑器或IDE手动重新应用更改。 (如果您需要查看最初所做的更改,可以随时git diff HEAD git merge-base HEAD master -- path/to/conflicting/file。)然后

git add path/to/conflicting/file

将冲突标记为已解决,

git commit

完成合并。