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

时间:2009-04-21 09:59:11

标签: git

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

假设您已经编辑了很多文件但是您意识到要将某些更改撤消回已提交状态,而不是其他更改。

我正在设想git checkout的一个选项,其工作方式与git add -p非常相似,即它会通过hunk传递文件块,并询问您是否要保留它。

4 个答案:

答案 0 :(得分:110)

使用git版本> = 1.7.1我可以

git checkout -p

我不确定此功能何时推出。

答案 1 :(得分:80)

您可以使用

git add -p <path>

暂存要保留在特定文件中的块,然后

git checkout -- <path>

通过查看文件的暂存版本来放弃您不想保留的工作树更改。

最后,您可以使用

git reset -- <path>

将文件的暂存版本恢复为该文件的最新提交版本,以使您的更改无法停止。

答案 2 :(得分:8)

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

答案 3 :(得分: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 -i编辑提交(将提交标记为edit,然后执行git reset HEAD^并在重新放回shell时重做提交。)< / p>

如果您需要选择的更改分布在一系列提交中,最好将它们作为补丁(或覆盖所有这些补丁的补丁)提取并手动编辑补丁,取出您想要的更改保留,并将残差喂入git apply --reverse