如何仅还原工作目录中的更改

时间:2012-10-30 20:14:00

标签: git

我有一个破坏的合并,我想恢复工作目录中的更改,以找出它被破坏的地方。我想保留索引,以便我可以添加修复程序并最终检入它们。实际上,我希望工作目录与HEAD相同但不修改索引。这基本上会将基于索引的反向补丁应用于工作目录。看起来这与git reset相反。

你是如何用git做的?

6 个答案:

答案 0 :(得分:5)

您可以提交索引,重置工作目录,然后重置提交。

$ git commit -m "blah"
$ git reset --hard
$ git reset --soft HEAD^

编辑:我似乎误解了原来的问题。

要在不打扰索引的情况下将工作树重置为HEAD,请执行以下操作:

$ git checkout -- .
$ git diff --cached | git apply --reverse

(看起来@Brice已经给出了这个答案。)

答案 1 :(得分:3)

我正在看一个简单的命令做同样的事情,但没有。 虽然你在问题中说明了正确的方法:

  

这实际上将基于索引的反向补丁应用于工作目录。

所以答案很简单:

git diff --no-color --staged | git apply --reverse

所以不需要提交任何内容,只需应用索引的反向。

请注意,如果工作目录中的某些更改未在索引中暂存/,则不会以这种方式撤消。

如果要还原工作目录中的所有内容(即使是未编入索引的更改和新文件),除索引本身外,请在执行以下操作之前:

git stash save --include-untracked --keep-index

如果您不打算重复使用它,可以在以后删除它:

git stash drop

如果要还原除未跟踪文件以外的所有内容(不在索引中的新文件)
以前做过:

git checkout .

总结一下这里有几个bash函数:

function git-unapply-index {
    git diff --no-color --staged | which git apply --reverse
}

function git-revert-workdir-keep-untracked {
    git checkout .
    git-unapply-index
}

function git-revert-workdir-all {
    git stash save --include-untracked --keep-index
    git stash drop
    git-unapply-index
}

答案 2 :(得分:2)

您是否尝试过git checkout <commit>

git help checkout的片段:

git checkout [<branch>], git checkout -b|-B <new_branch> [<start point>], git checkout [--detach] [<commit>]
       This form switches branches by updating the index, working tree, and HEAD to reflect the specified branch or commit.

       If -b is given, a new branch is created as if git-branch(1) were called and then checked out; in this case you can use the --track or --no-track
       options, which will be passed to git branch. As a convenience, --track without -b implies branch creation; see the description of --track below.

       If -B is given, <new_branch> is created if it doesn’t exist; otherwise, it is reset. This is the transactional equivalent of

           $ git branch -f <branch> [<start point>]
           $ git checkout <branch>

       that is to say, the branch is not reset/created unless "git checkout" is successful.

答案 3 :(得分:2)

可以为现有提交生成反向修补程序,而不是为索引中的更改生成。

  1. 提交索引中的更改[可能位于diff分支]。
  2. 执行git revert -n <commit>
  3. 它将在您的工作目录中为您的提交生成反向补丁。

答案 4 :(得分:1)

也许你期待git stash。使用git stash,您可以使工作目录看起来像HEAD,当您处于该状态时,您可以执行任何其他操作。完成后,您可以git stash pop并获取所有更改。您必须确保不更改被隐藏的文件,否则您将需要解决合并冲突。

答案 5 :(得分:0)

这正是您需要的:

git commit -m "Say thanks to John McClane"
git reset --hard HEAD^
git reset HEAD@{1} -- .

我假设您已执行所有必要的文件,然后再执行此操作。否则,将-a键添加到第一个命令或在其前调用 git-add

请注意,最后一条命令中的--是可选的,仅出于说明目的将其包括在内,以与其他形式的 git-reset 区别开来。