在切换分支时,Git不会恢复工作分支

时间:2010-01-02 17:02:23

标签: git

我有一个问题,我想从旧版本中分支出来,但是检出该分支并不会删除仅在修订历史记录中的该分支之后添加的文件和文件夹。

为什么会这样,我怎样才能回到修订历史记录中的某一点,并检查整个项目是否完全恢复该修订版中显示的状态?

以下是我目前的做法:

[add new folder lib/newlib to project, put some files in it]
> git add *
> git commit -a -m "new revision with folder lib/newlib/ and some new files"
> git tag old_version_tag {older revision hash}
> git branch old_version old_version_tag
> git co old_version
> ls lib
newlib
> git status
nothing to commit (working directory clean)
> rm -rf lib/newlib
> git status
nothing to commit (working directory clean)

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

如果没有本地更改,

git checkout会使工作树与指定的分支完全相同。

在结帐前检查是否已提交lib/newlib。如果有未跟踪的文件与git add *匹配,则.gitignore会失败:请改用git add --all

顺便说一下,这三行

git tag old_version_tag {older revision hash}
git branch old_version old_version_tag
git co old_version

可以替换为

git co -b old_version {older revision hash}

答案 1 :(得分:1)

'co'别名是做什么的?它运作正常吗?

这是我从shell脚本输出的跟踪 - 我碰巧在当前目录中潜伏着一对lu.c和lg.c文件:

+ rm -fr git-exp
+ mkdir git-exp
+ cd git-exp
+ git init
Initialized empty Git repository in /Users/jleffler/tmp/git-exp/.git/
+ cp ../lg.c .
+ git add lg.c
+ git commit -m 'Initial revision - lg.c'
[master (root-commit) 4d904fe] Initial revision - lg.c
 1 files changed, 20 insertions(+), 0 deletions(-)
 create mode 100644 lg.c
+ git tag base
+ mkdir lib
+ cp ../lu.c lib
+ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   lib/
nothing added to commit but untracked files present (use "git add" to track)
+ git add lg.c lib
+ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   lib/lu.c
#
+ git commit -m 'Add lib/lu.c'
[master e1bc008] Add lib/lu.c
 1 files changed, 12 insertions(+), 0 deletions(-)
 create mode 100644 lib/lu.c
+ ls -lR lg.c lib
-rw-r--r--@ 1 jleffler  staff  393 Jan  2 09:43 lg.c

lib:
total 8
-rw-r--r--  1 jleffler  staff  237 Jan  2 09:43 lu.c
+ git branch base-branch base
+ git status
# On branch master
nothing to commit (working directory clean)
+ git checkout base-branch
Switched to branch 'base-branch'
+ ls -lR lg.c
-rw-r--r--@ 1 jleffler  staff  393 Jan  2 09:43 lg.c

最后一行显示使用'git checkout'检出分支确实从工作目录中删除了lib / lu.c文件。

答案 2 :(得分:1)

在您的原始示例中,您显示了libl目录中仍然存在newlib。切换分支后newlib中存在哪些文件以及.gitignore的内容是什么?到目前为止,你还没有真正清楚这些。

我认为其他人正在考虑的例子是,如果你有.gitignore忽略的文件,它们仍然存在(比如编译后的.o文件),不会显示在git状态,并强制newlib即使目录中没有已提交/未跟踪的文件,该目录仍然存在。如果是这种情况,您可以使用git clean newlib从该目录中删除任何未跟踪/忽略的文件(也可能是目录)。

答案 3 :(得分:1)

使用git add。代替:

current=`git rev-parse HEAD`
git add .
git commit -m "blah"
git checkout -b old_revision $current

在签出old_revision分支之前确保lib / newlib确实包含文件,以便您知道提交不为空。如果lib / newlib为空,即使切换到另一个分支,该文件夹仍会保留。