在之前的章節我們介紹過使用 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