我想仅将特定提交所做的更改还原到给定文件。
我可以使用git revert命令吗?
还有其他简单的方法吗?
here描述了我所见过的最干净的方式
git show some_commit_sha1 -- some_file.c | git apply -R
与VonC的反应类似,但使用git show
和git apply
。
假设可以更改提交历史记录,这里是一个工作流,用于在先前的提交中还原单个文件中的更改:
例如,您想要在提交badfile.txt
中还原1个文件(aaa222
)中的更改:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
重新基础提交,修改问题提交,继续。
1)启动交互式rebase:
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 revert
用于提交中的所有文件内容。
对于单个文件,您可以script it:
#!/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
(来自git-shell-scripts的smtlaissezfaire公用事业)
注意:
另一种方式是described here,如果你还没有提交你当前的修改。
git checkout -- filename
git checkout
有一些文件选项,从HEAD修改文件,覆盖你的更改。
Dropped.on.Caprica提到in the comments:
您可以为git添加别名,这样您就可以执行
git revert-file <hash> <file-loc>
并恢复该特定文件。 见this gist。
[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
摆脱了我们不想保留的剩余文件还原。
git reset HEAD^ path/to/file/to/revert/in/commit
上面的命令将把文件从提交中取出,但它将反映在git status
中。
git checkout path/to/file/to/revert/in/commit
上面的命令将恢复更改(因此您获得与HEAD相同的文件)。
git commit
(通过--amend
修改提交。)
git push
这样,删除并恢复已在提交中的文件。
应该从提交提交的分支执行上述步骤。
更简单:
git reset HEAD^ path/to/file/to/revert
然后
git commit --amend
然后
git push -f
文件已经消失,提交哈希,消息等是相同的。
您可以按照以下步骤操作:
git revert -n <*commit*>
(-n
恢复所有更改,但不会提交它们)git add <*filename*>
(您想要还原和提交的文件的名称)git commit -m 'reverted message'
(添加回复消息)