【发布时间】:2013-03-11 01:55:29
【问题描述】:
如何撤消一段时间内对文件所做的部分更改。
我有以下提交并且在A 和B 之间发生了对'file.txt'的意外更改
...--A--B--...
我在file.txt-B-A.patch 中有一个文件的差异补丁,它可以恢复所有 更改。
但是我只想撤消file.txt 中的某些更改,就像在合并冲突中手动选择更改一样。有没有办法在不修改补丁文件的情况下做到这一点?
【问题讨论】:
如何撤消一段时间内对文件所做的部分更改。
我有以下提交并且在A 和B 之间发生了对'file.txt'的意外更改
...--A--B--...
我在file.txt-B-A.patch 中有一个文件的差异补丁,它可以恢复所有 更改。
但是我只想撤消file.txt 中的某些更改,就像在合并冲突中手动选择更改一样。有没有办法在不修改补丁文件的情况下做到这一点?
【问题讨论】:
许多 git 命令都有-p 选项(“补丁”)或-i(“交互式”)来做部分事情。对于任意差异,我认为不支持此功能,但您可以应用补丁,然后使用 git checkout -p -- <path(s)> 选择性地撤消未暂存的更改,例如git checkout -p -- . 如果你在 repo 的顶层。
【讨论】:
git checkout -p -- file.txt;最终结果是您已将补丁应用于 file.txt,除了您在第二步中撤消的内容。如果这不是你想要的,我误解了你的问题。
还有另一种完全不需要补丁文件的方法。
问题发生在从A 到B,所以首先恢复B 中的更改,但不要自动提交。
$ git revert --no-commit <commit hash of B>
git revert 所做的更改是分阶段进行的。取消暂存它们。
$ git reset HEAD
接下来,以交互方式浏览 file.txt 并仅暂存您想要保留的更改。
$ git add --patch file.txt
现在仅上演您选择的还原。提交它们。
$ git commit
最后,清理git revert 中未暂存的剩余部分。
$ git reset --hard
【讨论】: