有选择地还原或签出对Git中文件的更改?

有选择地还原或签出对Git中文件的更改?,git,Git,是否有允许您部分撤消对工作目录中的一个或多个文件所做更改的命令 假设您对一个文件进行了大量编辑,但您意识到您希望将某些更改恢复到提交状态,而不是其他更改 我设想了一个git签出选项,它的工作原理与git add-p非常相似,即它逐个检查文件,并询问您是否要保留它。git checkout$file将文件$file的状态还原为上次提交的状态。我认为您可以使用git checkout SHA-1-$file将文件还原为由SHA-1标识的提交。您需要返回多少个提交并从中选择?如果它只是一个分支,那么可

是否有允许您部分撤消对工作目录中的一个或多个文件所做更改的命令

假设您对一个文件进行了大量编辑,但您意识到您希望将某些更改恢复到提交状态,而不是其他更改


我设想了一个git签出选项,它的工作原理与git add-p非常相似,即它逐个检查文件,并询问您是否要保留它。

git checkout$file将文件$file的状态还原为上次提交的状态。我认为您可以使用git checkout SHA-1-$file将文件还原为由SHA-1标识的提交。

您需要返回多少个提交并从中选择?如果它只是一个分支,那么可以在它前面取一个分支,签出您提交的文件,然后使用git add-p按照您的需要添加它。然后,您可以返回您所在的位置,并从临时分支签出文件

即:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp
其他替代方法包括返回并使用git rebase编辑提交-我将提交标记为edit,然后执行git重置头^

如果您需要从中选择的更改分布在一系列提交中,那么最好将它们提取为补丁或覆盖所有补丁,然后手动编辑补丁,取出您想要保留的更改,并将剩余内容输入git apply-reverse。

您可以使用

git add -p <path>
要将要保留在特定文件中的块暂存,请执行以下操作:

git checkout -- <path>
要放弃不希望保留的工作树更改,请签出文件的暂存版本

最后,您可以使用

git reset -- <path>

将文件的暂存版本还原为文件的最新提交版本,使您的更改保持未暂存状态。

如果git version>=1.7.1,我可以

git checkout -p

我不确定这项功能是什么时候引入的。

是的,这不完全是我想要的,因为我想保留我在文件中所做的一些更改,并还原其他更改。我实际上不想还原已提交的任何内容,我想撤销仅在我的工作副本中的更改。对于这个简单的用例,其他版本控制系统只调用revert,为什么Git命令如此晦涩?@Jan其他版本控制系统的revert命令允许您选择文件中的哪些更改被还原?真诚地问,因为我只有CVS和Git方面的经验。在Git中,Git checkout-path/to/file是一个命令,用于还原该文件中的所有更改,但这与上面的不同。还有Git checkout-patch和Git reset-patch,它们与最新Git中的Git add-patch类似。@Rudie,-通常表示选项解析的结束,之后的任何论点都要逐字解释。这意味着您不必在任何以减号开头的文件名之前添加.,如果该文件名位于-。当我使用git checkout-patch时,差异似乎是向后的。减号将文本添加到我的工作副本中,加号将从我的工作副本中删除行。值得一提的是,您还可以执行git reset-p以有选择地取消暂存区域/索引中的更改。我也不知道这是在哪个版本的Git中引入的。这是正确的答案,为什么不被接受。@wukong,因为这个答案是在问题提出两年后发布的。2009年此时此刻,查尔斯的答案是最好的解决方案