我有一个破坏的合并,我想恢复工作目录中的更改,以找出它被破坏的地方。我想保留索引,以便我可以添加修复程序并最终检入它们。实际上,我希望工作目录与HEAD相同但不修改索引。这基本上会将基于索引的反向补丁应用于工作目录。看起来这与git reset
相反。
你是如何用git做的?
答案 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)
可以为现有提交生成反向修补程序,而不是为索引中的更改生成。
git revert -n <commit>
它将在您的工作目录中为您的提交生成反向补丁。
答案 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 区别开来。