在提交中将更改还原为文件
我想只将特定提交所做的更改还原为给定的文件。
我可以使用git revert命令吗?
任何其他简单的方法来做到这一点?
这里描述了我所见过的最干净的方法
git show some_commit_sha1 -- some_file.c | git apply -R
类似于VonC的回应,但使用git show
和git 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
该文件不见了,提交哈希,消息等是一样的。