丢弃所有未分阶段的更改而不提交?

时间:2013-03-09 00:17:52

标签: git

是否有一种简单的方法可以放弃所有尚未暂时未提交的变更?

例如,假设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在工作目录和索引中结束的状态。

3 个答案:

答案 0 :(得分:2)

假设这是您的工作流程:

  1. 您提交了一个文件
  2. 你做了一些改变并上演了
  3. 您进行了一些更改,但是您希望在步骤2中恢复为包含分阶段更改的版本。
  4. 您只需要运行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
    #
    

答案 1 :(得分:1)

你必须要做

git checkout -- .

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

git checkout -- myfile

如果已添加文件,则必须通过执行

取消暂存
git reset HEAD myfile

答案 2 :(得分:0)

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

在原始问题中给出的序列之后,执行:

% git stash -q -k
% git stash drop -q
% cat A
state 2