如何在git中撤销特定的提交代码块?

45

我想知道有没有一种快速反转提交中特定块的方法。

我可以生成两个提交或HEAD之间的差异。

如何仅反转其中一个块(或更好地说,一组特定的块)?

4个回答

50
git checkout -p $REF -- path/to/file

例如:

git checkout -p HEAD^ myfile

其中 $REF 是一个引用名称或提交ID,它指定了您想要从中获取文件状态的提交。例如,要选择性地还原最后一次提交所做的更改,请使用 HEAD^


7
更准确地说,这将允许您有选择性地检查以前提交的内容版本;您当前提交与工作目录之间的更改也将被舍弃。 - Cascabel
2
是的,我以前做过这个。但是这会还原所有更改吗?我只想还原部分更改。 - dkinzer
2
@DKinzer:不,-p选项将允许您交互式地选择要应用于您的工作树的补丁块。 - cdhowie
4
没问题。请注意,许多git提交命令(例如addcheckoutreset等)可以采用这种方式使用-p选项,并且会让您选择要处理哪些代码块。当同一文件中的两个代码块应该分别提交到不同的提交中时,这非常方便。 - cdhowie
1
我对Git还很陌生,目前只知道在rebase时使用-i选项可以选择性地选择提交。我认为-p选项对我来说会非常有用。 - dkinzer
为了删除 hunks,请在每个 hunk 提示时选择 y。这将在您之前的提交上产生一个暂存的差异,而不会修改它。然后,您可以通过取消暂存 (git reset <file>) 然后使用 git diff 查看差异。最后,您可以通过 git commit --amend <file> 将其合并到您之前的提交中。 - Nick Desaulniers

3
要从特定的提交中还原一个或多个代码块,请按如下方式执行 - 使用 add -p 命令即可:
git revert --no-commit <commit>…​ 
git reset                              # unstage things
git add -p [OPTIONS] [<pathspec>…​]     # choose hunks interactively
git restore .                          # wipe the rest (in root directory)
... maybe further changes ...
git commit [--fixup] ...

未来的git版本可能会直接支持git revert -p...
注意:像git checkout/restore -p ...这样的方法不能一致地从特定提交中还原hunk,而是去选择某个文件状态的部分内容——可能会丢失其他后续提交中的更改。

2
git difftool $REF -- /path/to/file

其中$REF是一个ref名称或提交ID,用于指定您想要从中获取文件状态的提交。例如,要选择性地还原上次提交所做的更改,请使用HEAD^。

这个问题已经被@cdhowie回答过了,但我发现使用交互式差异工具(如meld)来选择性地恢复旧的块/代码行会更好,特别是如果代码中有新引入的难以找到的错误。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接