在提交中将更改还原为文件

我想只将特定提交所做的更改还原为给定的文件。

我可以使用git revert命令吗?

任何其他简单的方法来做到这一点?

这里描述了我所见过的最干净的方法

git show some_commit_sha1 -- some_file.c | git apply -R 

类似于VonC的回应,但使用git showgit apply

git revert是提交中的所有文件内容。

对于单个文件,您可以编写脚本 :

 #!/bin/bash function output_help { echo "usage: git-revert-single-file <sha1> <file>" } sha1=$1 file=$2 if [[ $sha1 ]]; then git diff $sha1..$sha1^ -- $file | patch -p1 else output_help fi 

(来自smtlaissezfaire的git-shell-scripts工具)


注意:

如果您尚未提交当前的修改,则在此处介绍另一种方法。

 git checkout -- filename 

git checkout有一些文件的选项,从HEAD修改文件,覆盖你的更改。


Dropped.on.Caprica 在评论中提到:

你可以给git添加一个别名,这样你可以执行git revert-file <hash> <file-loc>并且恢复这个特定的文件。
看到这个要点 。

 [alias] revert-file = !sh /home/some-user/git-file-revert.sh 

我会简单地使用--no-commit选项来进行git-revert ,然后在最终提交之前删除不希望从索引中恢复的文件。 下面是一个例子,展示了如何在最近的第二次提交中轻松恢复对foo.c的更改:

 $ git revert --no-commit HEAD~1 $ git reset HEAD $ git add foo.c $ git commit -m "Reverting recent change to foo.c" $ git reset --hard HEAD 

第一个git-reset “unstages”所有文件,以便我们可以添加一个我们想要恢复的文件。 最后的git-reset --hard摆脱了剩余的文件恢复,我们不想保留。

基于mgalgs的响应,下面是一个工作stream程,用于在早期提交中恢复单个文件中的更改:

例如,您想要在提交aaa222恢复1个文件( badfile.txt )中的aaa222

 aaa333 Good commit aaa222 Problem commit containing badfile.txt aaa111 Base commit 

重新提交基础提交,修改问题提交,并继续。

1)开始交互式重新分配:

 git rebase -i aaa111 

2)通过改变pick e (用于编辑),在编辑器中标记提交编辑的问题:

 e aaa222 pick aaa333 

3)恢复对不良文件的更改:

 git show -- badfile.txt | git apply -R 

4)添加更改并修改提交:

 git add badfile.txt git commit --amend 

5)完成rebase:

 git rebase --continue 

更简单:

 git reset HEAD^ path/to/file/to/revert 

然后

 git commit --amend 

接着

 git push -f 

该文件不见了,提交哈希,消息等是一样的。