git checkout删除文件

时间:2016-11-17 10:44:47

标签: git git-checkout

我是git的新手,我想尝试分支功能。我正在使用本地存储库。问题是,如果我创建一个新分支然后返回主分支,则会丢失一些文件。

这就是我的所作所为:

我有两个目录:

$ ls
g_LT  LT

和LT目录中的源代码文件lt_mp2.F:

$ ls LT/ | grep lt_mp2.F
lt_mp2.F

另一个目录包含此文件的相对符号链接:

$ ls -l g_LT/ | grep lt_mp2.F
lt_mp2.F -> ../LT/lt_mp2.F

如果我创建一个新分支然后返回主分支,则两个文件都将丢失。所以,让我说明一下:

在创建新分支之前,让我们检查一下什么都没有提交:

$ git status
HEAD detached from 2617e8a
nothing to commit, working directory clean here

让我们检查一下我们是否在主分支中,最后一次提交是从2016年10月13日开始的

$ git branch -a
* (detached from 2617e8a)
master

$ git log
commit 3484261bdd585671bf7c74568542a62610c2deaf
Author: [...]
Date:   Thu Oct 13 09:25:06 2016 +0200
[...]

现在我创建一个新分支:

$ git checkout -b testbranch
Switched to a new branch 'testbranch'

源文件仍然存在:

$ ls LT/ | grep lt_mp2.F
lt_mp2.F
$ ls -l g_LT/ | grep lt_mp2.F
lt_mp2.F -> ../LT/lt_mp2.F

现在我回到主分支:

$ git checkout master
Switched to branch 'master'

但是现在源文件已经消失了:

$ ls LT/ | grep lt_mp2.F
(no output)
$ ls -l g_LT/ | grep lt_mp2.F
(no output)

此外,最后一次提交是从2015年12月突然而不是2016年10月13日:

$ git log
commit 634741172ed34cd687fd91f14da45004b3328f8b
Author: [...]
Date:   Tue Dec 1 18:54:57 2015 +0100
[...]

这里发生了什么以及为什么我丢失了我的源文件?

1 个答案:

答案 0 :(得分:1)

你不是(丢失任何文件,也没有任何提交)。

这部分起始要求是错误的:

  

我们还要检查我们是否在主分支[snip]

$ git branch -a
* (detached from 2617e8a)
master

这表明您在开始时在分支master。相反,你有一个“独立的HEAD”。原始哈希ID的最新显式git checkout或等效项(例如标记名称或远程跟踪分支名称)已签出提交2617e8a。您的git log输出显示当前提交可能是 1 3484261bdd585671bf7c74568542a62610c2deaf,并且“脱离”措辞表明您可能自己做了这个提交(Git使用“detached at”当你没有移动HEAD,并且当你有了“脱离”时。)

git log命令默认显示从当前(HEAD)提交 2 开始的提交并向后工作。无论HEAD是否“脱离”,都是如此。 (非分离的HEAD是引用分支名称的HEAD,例如master。运行git checkout branchname会给你一个非分离的HEAD,即HEAD现在指向 branchname ,以便使用命名分支找到提交。)

如果您想查看更多或其他提交,可以告诉git log从其他地方开始。无论你在哪里开始,它都会从那里开始向后工作。

因此,这只意味着master(分支名称)指向2015年的提交。一旦HEAD指向mastergit log(没有)其他参数)从最近的提交开始,然后从那里开始工作。

大概如果master过时,所有实际工作都在其他一些分支上发生。

当您从3484261...切换到6347411...时,文件会消失(这可能是master标识的提交),因为他们在前一次提交中 在后者中不是。因此,当切换提交时,Git会将它们从索引和工作树中删除。切换回3484261...(通过ID或您给出的新名称检出)将把它们放回到索引和工作树中。

1 git log按日期对其输出进行排序,默认情况下,首先显示具有较晚日期的提交。这个代码在某些方面有所改变,我错过了,因为它曾经可以将提交“约会”到2038左右,所以它总是显示在git log输出的顶部,如果它是完全显示。我最近测试时停止了工作。

2 请参阅脚注1,并注意您可以更改排序顺序和/或约束它,例如使用--topo-order。添加--graph--topo-order。通常,提交的日期或多或少与它们的图形拓扑一致,因此这些标记不会对排序顺序做出巨大改变。