我只想恢复特定提交对给定文件所做的更改。
我可以使用git revert命令吗?
还有其他简单的方法吗?
git revert用于提交中的所有文件内容。
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
(从git-shell-scripts实用程序到Smtlaissezfaire)
注意:
如果您还没有提交当前的修改,另一种方法是在这里描述。
git checkout -- filename
git checkout为文件提供了一些选项,从HEAD修改文件,覆盖您的更改。
git checkout
掉在.卡布里卡上提到在评论中:
您可以向Git添加一个别名,这样您就可以执行git revert-file <hash> <file-loc>并恢复该特定文件。 请参见这个要点。
git revert-file <hash> <file-loc>
[alias] revert-file = !sh /home/some-user/git-file-revert.sh
我会简单地使用--no-commit选项来git-revert,然后在最终提交之前从索引中删除您不想还原的文件。下面是一个示例,展示了如何在最近的第二次提交中轻松地恢复对foo.C的更改:
--no-commit
git-revert
$ 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 “取消暂存”所有文件,以便我们可以只添加回我们想要恢复的一个文件。最后的git-reset --hard去掉了我们不想保留的剩余文件和恢复。
git-reset
git-reset --hard
我所见过的最干净的方法是在这里
git show some_commit_sha1 -- some_file.c | git apply -R
类似于VonC的响应,但使用git show和git apply。
git show
git apply
假设可以更改提交历史记录,下面是在早期提交中恢复单个文件中的更改的工作流:
例如,您希望在提交aaa222中恢复1个文件(badfile.txt)中的更改:
aaa222
badfile.txt
aaa333 Good commit aaa222 Problem commit containing badfile.txt aaa111 Base commit
重新基于基本提交,修正问题提交,&;继续。
1)启动交互式重定基址:
git rebase -i aaa111
2)通过将pick更改为e(用于编辑),在编辑器中将问题提交标记为编辑:
pick
e
e aaa222 pick aaa333
3)恢复对错误文件的更改:
git show -- badfile.txt | git apply -R
4)添加更改&;修改提交:
git add badfile.txt git commit --amend
5)完成重基:
git rebase --continue
简单得多:
git reset HEAD^ path/to/file/to/revert
然后
git commit --amend
然后呢
git push -f
文件消失了,提交哈希、消息等是相同的。
git reset HEAD^ path/to/file/to/revert/in/commit
以上命令将使文件退出提交,但它将反映在git status中。
git status
git checkout path/to/file/to/revert/in/commit
上面的命令将恢复更改(因此,您将获得与HEAD相同的文件)。
git commit
(传递--amend以修改提交。)
--amend
git push
这样,已经在提交中的文件将被删除并恢复。
应从进行提交的分支开始执行上述步骤。
您可以按照以下步骤操作:
git revert -n <*commit*>
-n
git add <*filename*>
git commit -m 'reverted message'
如果你想重新设置上次提交的文件,这是我通常使用的。我认为这是最简单的解决办法。
请注意,该文件将被添加到临时区域。
git checkout <prev_commit_hash> -- <path_to_your_file>
希望能有所帮助:)