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

问题描述 投票:79回答:7

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

我可以使用git revert命令吗?

还有其他简单的方法吗?

git version-control revert
7个回答
153
投票

here描述了我所见过的最干净的方式

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

与VonC的反应类似,但使用git showgit apply


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

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

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


5
投票
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

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

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


4
投票

更简单:

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

然后

git commit --amend   

然后

git push -f

文件已经消失,提交哈希,消息等是相同的。


0
投票

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

  1. git revert -n <*commit*>-n恢复所有更改,但不会提交它们)
  2. git add <*filename*>(您想要还原和提交的文件的名称)
  3. git commit -m 'reverted message'(添加回复消息)
  4. 提交丢弃后,其他文件会发生更改,因此文件会在还原之前保持更新
© www.soinside.com 2019 - 2024. All rights reserved.