0

有没有一种简单的方法可以在不先提交后者的情况下丢弃所有尚未暂存的更改?

例如,假设这A是一个跟踪文件,如

% git init -q
% echo "state 1" > A
% git add A && git commit -q -m 'initial commit'
% cat A
state 1

下一个修改A,并将其分阶段:

% echo "state 2" > A
% git add A
% cat A
state 2

最后,修改A了第三次,但这一次A仍然是未分级的:

% echo "state 3" > A
% cat A
state 3

怎样才能恢复A到它的阶段状态,即状态 2

编辑:我已经稍微改变了代码序列,希望现在更清晰。在发布问题后,我还发布了一个解决方案。这个解决方案让我觉得很迂回(必须有更直接的东西),但至少它清楚地显示了我想要A结束的状态,无论是在工作目录中还是在索引中。

4

3 回答 3

2

假设这是您的工作流程:

  1. 你提交了一个文件
  2. 你做了一些改变并上演了它
  3. 您进行了更多更改,但您希望恢复到第 2 步中的分阶段更改的版本。

你只需要运行git checkout -- A. 这将消除任何未暂存的更改,但会在第 2 步结束时保留更改。

看一下这个示例工作流,它将清除一切:

A的内容只是version1

$ echo "version1" > A

提交更改 $ git add A && git commit -q -m 'initial commit'

$ git log
commit 4fd90642df048ca4beeb29c65c5f7a436e83055a
Author: Tuxdude <foo@bar>
Date:   Fri Mar 8 16:28:36 2013 -0800

    initial commit

A的内容是现在version2

$ echo "version2" > A

$ cat A
version2

暂存文件更改

$ git add A

检查当前的 git 状态

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   A
#

再做一些改变A

$ echo "version3" > A

$ cat A
version3

现在你决定,你想摆脱 `A. 您只需要从 git 的缓存中检出文件,即暂存区。

$ git checkout -- A

$ cat A
version2

您可以git status再次运行,它会让您知道分阶段的更改。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   A
#
于 2013-03-09T00:26:06.350 回答
1

你只需要做

git checkout -- .

如果要还原单个文件,请执行

git checkout -- myfile

如果文件已被添加,您必须通过执行取消暂存它

git reset HEAD myfile
于 2013-03-09T00:18:51.080 回答
0

我想到了一个可能的答案来回答我的问题。它不是特别优雅,我不知道它是否有任何潜在的陷阱,但至少它清楚地显示了我想要A结束的状态。希望有人会知道一条不那么迂回的路线。

在原始问题中给出的顺序之后,执行以下操作:

% git stash -q -k
% git stash drop -q
% cat A
state 2
于 2013-03-09T00:36:51.940 回答