繁体   English   中英

git checkout删除文件

[英]git checkout deletes files

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

这是我的工作:

我有两个目录:

$ 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

如果我创建一个新分支,然后返回到master分支,这两个文件都会丢失。 因此,让我展示一下:

在创建新分支之前,让我们检查是否要提交的内容:

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

我们还要检查一下是否位于master分支中,并且最后一次提交是从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

现在我回到master分支:

$ 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
[...]

这是怎么回事,为什么我会丢失源文件?

您没有(丢失任何文件,也没有提交)。

您的最初要求的这一部分是错误的:

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

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

这表明您一开始就不在分支机构master上。 相反,您有一个“分离的HEAD”。 原始哈希ID或等效项(例如标签名称或远程跟踪分支名称)的最新显式git checkout commit 2617e8a 您的git log输出显示当前提交可能是1 3484261bdd585671bf7c74568542a62610c2deaf ,并且“与...分离”的措辞表明您可能自己进行了此提交(当您尚未移动HEAD时,Git使用“ detached at”,而当您未移动HEAD时,则“与...分离”)有)。

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

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

因此,这仅表示master (分支名称)指向2015年以来的提交。一旦HEAD指向master ,则git log (不带其他参数)从其最近的提交开始,并从此处进行向后工作。

大概如果master已经过时,那么所有实际工作都在其他分支上进行了。

该文件消失,当你从切换3484261...6347411... (这可能是通过提交确定master ),因为他们在以前的承诺并没有后者。 因此,Git在切换提交时将它们从索引和工作树中删除。 切换回3484261... (通过按ID或您给它的新名称签出)会将它们放回到索引和工作树中。


1 git log默认情况下按日期对输出进行排序,首先显示具有较晚日期的提交。 这段代码在我遗漏的某个点上有所更改,因为以前可以将提交“后置日期”到2038年左右,因此,如果要显示,它总是显示在git log输出的顶部完全没有 当我最近对其进行测试时,它已经停止工作。

2请参见脚注1,并注意您可以更改排序顺序和/或限制排序顺序,例如,使用--topo-order 添加--graph--topo-order 通常,提交的日期或多或少与它们的图拓扑一致,因此,这些标志不会在排序顺序中进行重大更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM