1

我有一个 git 存储库,其中包含一些提交。我想重现工作目录的确切状态,因为它是在特定提交之后(这里我想我已经提交了所有所做的更改)。

我尝试使用git checkout,但此命令不会删除工作目录中的现有文件(在所需提交后添加)。

一个简单的例子来说明我的问题。我使用以下命令准备了存储库

u@u-desktop:/tmp/git$ git init
Initialized empty Git repository in /tmp/git/.git/

u@u-desktop:/tmp/git$ echo 'ffff' > first.file
u@u-desktop:/tmp/git$ git add first.file
u@u-desktop:/tmp/git$ git commit -m "Important file was added"
[master (root-commit) fb05f7e] Important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 first.file

u@u-desktop:/tmp/git$ echo 'Second line' >> first.file 
u@u-desktop:/tmp/git$ git commit -m "Important data was added" -a
[master df93d04] Important data was added
 1 files changed, 1 insertions(+), 0 deletions(-)

u@u-desktop:/tmp/git$ echo 'ssss' > second.file
u@u-desktop:/tmp/git$ git add second.file
u@u-desktop:/tmp/git$ git commit -m "Second important file was added"
[master b6c106a] Second important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 second.file

u@u-desktop:/tmp/git$ echo 'tttt' > third.file
u@u-desktop:/tmp/git$ git add third.file
u@u-desktop:/tmp/git$ git commit -m "Third important file was added"
[master 33fce06] Third important file was added
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 third.file

现在目录看起来像这样

u@u-desktop:/tmp/git$ ls
first.file  second.file  third.file

first.file有以下内容

u@u-desktop:/tmp/git$ cat first.file 
ffff
Second line

现在我想恢复工作目录,因为它在第一次提交之后看起来就正确(fb05f7e

u@u-desktop:/tmp/git$ git checkout fb05f7e .
u@u-desktop:/tmp/git$ cat first.file 
ffff

但是second.file并且third.file仍在目录中

u@u-desktop:/tmp/git$ ls
first.file  second.file  third.file
4

2 回答 2

3

做就是了:

git checkout fb05f7e

... 即没有指定当前目录 ( .) 作为结帐的路径。您会发现它second.file并按third.file您的预期被删除。

原因是它git checkout有两种非常不同的操作模式,具体取决于您是否提供路径。如果您确实提供了一条路径,它根本不会改变HEAD,它只是

...从索引文件或命名的 <tree-ish> (通常是提交)更新工作树中的命名路径

(这是来自git checkout文档)。这只会更新其他提交中实际存在的路径。

于 2011-08-02T15:15:20.367 回答
3

删除.你的git 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.

       (...)

   git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
       When <paths> or --patch are given, git checkout does not switch
       branches. It updates the named paths in the working tree from the
       index file or from a named <tree-ish> (most often a commit).

此外,如果您想删除在索引中检查的文件,请使用git clean(阅读手册页,有一个“anti-oops”选项,您必须在命令行上传递它才能工作)。

于 2011-08-02T15:17:34.797 回答