繁体   English   中英

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

[英]How to roll back (reset) a committed change in git on a single file

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

我想:

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

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

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

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

您可以使用git checkout从另一个提交中获取单个文件 ,如下所示:

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

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


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

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

这里的问题是概念性的:你正在接受适用于提交的命令,并尝试将它们应用于文件,这就是你如何解决手头问题的原因。

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

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

因此,如果您使用reset等内容回滚,则撤消所有更改。 如果你rebase以得到改变master ,你得到所有的从主的变化。

这并不意味着你无法到达你想去的地方; 你只需要稍微改变它。

最简单的(和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

完成合并。

暂无
暂无

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

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