[教學] git-21 救回分支 - 討論區

[教學] git-21 救回分支

文章瀏覽次數 1863 文章回覆數 0

特種兵

特種兵圖像(預設)

2020-04-04 12:15:51

From:1.161.134.13

在之前的章節我們介紹過使用 reset 來回到之前的版本,也就是所謂回到過去的美好時光。

對分支而言也是一樣的道理,其實這些都是在不同的 commit 貼標籤的概念而已,

因此很容易切換且速度快又不占多大空間,可以說 git 是很靈活又小巧好用的版控工具。

刪除分支並不會影響到其他分支的相同檔案,因為開分支並不是把檔案複製或搬移一份到新分支去,

我們已經知道修改衝突的檔案想切換分支時會發生錯誤,當分支還沒有被合併時想刪除也會有提示訊息,

這算是一種保護機制,現在我在 test 分支修改了 abc.txt 也提交了,但還沒有跟 master 主幹道合併就想刪除 test 分支

# 確認現在處在哪個分支
$ git branch                                                                    
   master                                                                        
 * test                                                                          

# 刪除 test 分支                                                                             
$ git branch -d test                                                            
 error: Cannot delete branch 'test' checked out at 'D:/practice'                 

# 我們犯了一個根本上的錯誤,就是無法刪除現在所在的分支,必須切換到其他分支才行
$ git checkout  master                                                          
 Switched to branch 'master'                                                     

# 刪除 test 分支  
$ git branch -d test                                                            
 error: The branch 'test' is not fully merged.                                   
 If you are sure you want to delete it, run 'git branch -D test'.                

# 因為還沒 merge 所以不給刪,但使用大寫 D 還是可以硬刪
$ git branch -D test                                                            
 Deleted branch test (was fa03700).                                              

# 記一下上面的版號
# 確認一下現在的分支狀況
$ git branch                                                                    
 * master                                                                        

# test 被刪了

刪掉分支後,其實那些分支的 commit 還在,只是暫時隱藏起來而已。

如果當時沒有記下那個版號的話,別忘了之前介紹的 reflog 可以查,他會保留 30 天的紀錄。

讓我們救回分支:

# 因為 reflog 內容有點多,我們列出最近的 3 筆就好
$ git reflog -3                                                                 
 f0230ed (HEAD -> master) HEAD@{0}: checkout: moving from test to master         
 fa03700 HEAD@{1}: checkout: moving from master to test                          
 f0230ed (HEAD -> master) HEAD@{2}: checkout: moving from test to master         

# 我們要找的是最後切換到 test 的身影,那就是 fa03700
$ git branch new_test fa03700                                                   

# 確認一下分支狀況
$ git branch                                                                    
 * master                                                                        
   new_test                                                                      

# 新分支出現了,但其實是原本 test 分支的內容,想要用原本的名字也可以
$ git checkout new_test                                                         
 Switched to branch 'new_test'                                                   

# 切換成功,看一下紀錄
$ git log --oneline -3                                                          
 fa03700 (HEAD -> new_test) 在 abc.txt 加了一行                                  
 6c5b3f7 把 ooqq.txt 的第一行改成我是第一行                                      
 40ff865 新增 ooqq.txt 並寫了一行字                                              

# 切換到 master
$ git checkout master                                                           
 Switched to branch 'master'                                                     

# 看一下 master 的紀錄                                                                                 
$ git log --oneline -3                                                          
 f0230ed (HEAD -> master) 將 ooqq.txt 改成我想要的                               
 6c5b3f7 把 ooqq.txt 的第一行改成我是第一行                                      
 71188bf 在 ooqq.txt 新增第二與三行                                              

# 他們的第二個 commit 是一樣的,從這個版號以後是還沒 merge 的部分

發現了吧,分支的名字其實不重要,我們實際上是給這個版號一個新名字而已。

最後補充一個合併 commit 的例子:

$ git merge fa03700                                                             
 Merge made by the 'recursive' strategy.                                         
  abc.txt | 1 +                                                                  
  1 file changed, 1 insertion(+)                                                 

其實分支本身不能被合併,我們合併的都是分支的 commit 因此直接指定 commit 版號來合併也沒問題。

特別是不想合併整個分支的情況就可以自己指定想合併的 commit