2016-11-17 175 views
0

我是新來的混帳,我想嘗試分支功能。我正在使用本地存儲庫。問題是,如果我創建一個新的分支,然後回到主分支,一些文件會丟失。git checkout刪除文件

這是我做的:

我有兩個目錄:

$ 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' 

源文件s爲仍然存在:

$ 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

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

你的出發索賠的這一部分是錯誤的:

我們還要檢查我們在主分支[剪斷]

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

,這說明你是上分支master在開始。相反,你有一個「獨立頭」。原始散列ID或等效項的最新顯式git checkout(例如標記名稱或遠程跟蹤分支名稱)已提交2617e8a。你的git log輸出顯示當前的提交可能是 3484261bdd585671bf7c74568542a62610c2deaf,並且「脫離」措辭表明你可能自己做出了這個提交(當你沒有移動HEAD時Git使用「detached at」,並且當從「detached from」時你有)。

git log命令默認顯示提交從當前(HEAD)開始承諾和向後工作。無論HEAD是否「脫離」,情況都是如此。 (非分離的HEAD是指分支名稱的HEAD,例如master。運行git checkout branchname會爲您提供一個未分離的HEAD,即HEAD現在指向branchname,以便使用指定的分支找到提交。 )

如果你想看更多或其他提交,你可以告訴git log從別的地方開始。無論你告訴它開始,它都會從那裏開始倒退。

因此,這只是意味着master,分行的名稱,指出從後在2015年一旦HEAD點承諾mastergit log(不帶附加參數)開始用其最近提交,並從那裏工作的倒退。

假設如果master已過時,所有真實的工作都發生在其他分支上。

的文件消失,當您切換從3484261...6347411...(這可能是通過提交鑑定master),因爲他們是前提交和不在後者。所以在切換提交時,Git會將它們從索引和工作樹中移除。切換回3484261...(通過按ID或按照您提供的新名稱進行檢查)會將它們放回到索引和工作樹中。


git log排序按日期輸出,默認情況下,呈現出的較後日期先提交。這段代碼在某些我錯過的地方發生了一些變化,因爲它曾經有可能在2038年左右「提交」一次提交,所以它總是顯示在git log輸出的頂部,如果它被顯示在所有。當我最近測試它時,它已停止工作。

請參閱腳註1,並注意您可以更改排序順序和/或限制它,例如,使用--topo-order。添加--graph--topo-order。通常情況下,提交的日期或多或少與它們的圖形拓撲一致,以便這些標記不會在排序順序上發生巨大變化。

+0

感謝您的詳細解答。但是,我怎樣才能解決這個「分離頭部」的問題?據我記得我開始使用git與「git init」,然後我總是使用「git add -A」和「git commit -a」。 – thyme

+0

我不知道你是如何得到分離的HEAD。 Git在「reflogs」中記錄了很多有用的信息(每個分支有一個,'HEAD'本身也有一個),但reflog條目會在一段時間後過期:默認情況下30天有一些,其他90天有效。由於它看起來像你的「主人」是近一年前最後碰到的,HEAD reflog中的痕跡可能早已消失。 [0123] – torek

+0

只要你能找到提交,你所要做的就是給它們一個名字,比如分支名稱。你用'git checkout -b testbranch'完成了這個。如果你運行'git log testbranch',你會看到那些提交。使用'git log --branches',你會看到所有分支都可以訪問的所有提交,在這一點上它只是'master'和'testbranch'。因此使用'git log master testbranch''會做同樣的事情。使用'--all'獲取所有引用(主要是分支和標籤)。將'--oneline --decorate --graph'添加到你的'git log'中以獲得帶有標籤的圖形繪圖(或者嘗試一個GUI--我通常討厭GUI) – torek