还原对提交中的文件的更改

时间:2010-04-12 08:44:20

标签: git version-control revert

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

我可以使用git revert命令吗?

还有其他简单方法吗?

8 个答案:

答案 0 :(得分:141)

我所见过的最简洁的方法是here

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

与VonC的回复相似,但使用git showgit apply

答案 1 :(得分:24)

假设可以更改提交历史记录,这里是一个工作流程,可以在之前的提交中恢复单个文件中的更改:

例如,您希望在提交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

答案 2 :(得分:19)

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-scriptssmtlaissezfaire实用程序)


注意:

另一种方式是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

答案 3 :(得分:12)

我只需使用--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摆脱了我们不想保留的剩余文件还原。

答案 4 :(得分:4)

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

这样,已删除并恢复已提交的文件。

应该从提交提交的分支开始执行上述步骤。

答案 5 :(得分:3)

更简单:

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

然后

git commit --amend   

然后

git push -f

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

答案 6 :(得分:1)

如果您想重置上次提交时对文件所做的更改,这就是我通常使用的方法。我认为这是最简单的解决方案。

请注意,该文件将被添加到暂存区域。

git checkout <prev_commit_hash> -- <path_to_your_file>

希望它会有所帮助:)

答案 7 :(得分:0)

您可以按照以下步骤操作:

  1. git revert -n <*commit*>-n还原所有更改,但不会 提交他们)
  2. git add <*filename*>(您要还原并提交的文件的名称)
  3. git commit -m 'reverted message'(添加要还原的消息)
  4. 在提交后丢弃其他文件更改,以便文件保留 使用您在还原之前提交的更改进行更新