[英]How to roll back (reset) a committed change in git on a single file
我在我的功能分支上有一个提交,由3个文件组成,其中一个文件现在与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.