【问题标题】:Git undo partial changes to a fileGit 撤消对文件的部分更改
【发布时间】:2013-03-11 01:55:29
【问题描述】:

如何撤消一段时间内对文件所做的部分更改。 我有以下提交并且在AB 之间发生了对'file.txt'的意外更改

...--A--B--...

我在file.txt-B-A.patch 中有一个文件的差异补丁,它可以恢复所有 更改。 但是我只想撤消file.txt 中的某些更改,就像在合并冲突中手动选择更改一样。有没有办法在不修改补丁文件的情况下做到这一点?

【问题讨论】:

标签: git merge undo


【解决方案1】:

许多 git 命令都有-p 选项(“补丁”)或-i(“交互式”)来做部分事情。对于任意差异,我认为不支持此功能,但您可以应用补丁,然后使用 git checkout -p -- <path(s)> 选择性地撤消未暂存的更改,例如git checkout -p -- . 如果你在 repo 的顶层。

【讨论】:

  • 但这是基于每个文件的,但是我想撤消单个文件中的特定更改(也许这本身与 git 无关)。
  • 所以,应用补丁然后git checkout -p -- file.txt;最终结果是您已将补丁应用于 file.txt,除了您在第二步中撤消的内容。如果这不是你想要的,我误解了你的问题。
  • 补丁将包括文件之间的所有更改,而不仅仅是其中的一部分。假设我只想撤消文件中第 500 行之后发生的更改。
  • 是的,这就是第二步“修复”的内容。您可以选择毕竟不想进行的更改。该命令会提示您是否要撤消补丁的每个大块。
【解决方案2】:

还有另一种完全不需要补丁文件的方法。

问题发生在从AB,所以首先恢复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

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2016-12-07
    • 2015-01-30
    • 2021-02-17
    相关资源
    最近更新 更多