GIT學習筆記(2)-分支、還原、協作
前言
在看工作的時候,發現很多公司都希望擁有git的經驗,雖然有過使用Github Desktop的經驗,但是還是想知道背後的原理,所以就開始上網查資料學習了。
可以參考這位六角學院的老師文章還有YT影片,實在是免費又大碗(淚。
HEAD指標
HEAD就是目前指向的版本狀態,他可以指向到分支或是commit
所以要回到先前的commit的話:
查詢commit版本
1.透過 git log
來看所有commit
在每個 commit 旁邊的亂數就是SHA-1 值
移動HEAD
要回到最初始的時後,使用git checkout <SHA-1值>
,
這時候到本地目錄查看,其實檔案都回到了該HEAD移動的commit版本。
接著可以到sourcetree查看,可以看到HEAD移動到了剛剛指定的commit版本
Sourcetree移動HEAD
如果想要sourcetrr移動HEAD的話,在想要過去的commit點擊兩下就可以了
按下ok之後就可以看到檔案被加進去、HEAD也跟著移動了
回到最新的版本
如果想要回到最新的commit,使用
git checkout master
就可以了
分支
分支可以說是git的重頭戲了,分支的好處,就是每一條線都各司其職,做完事後,再將兩條線的功能合併,並部署上線。
舉個分支個例子,例如公司在遠端伺服器上傳了主線(origin master),在做beta但是不想污染上線的程式碼,這時候就需要分支做beta測試等等。
大概是這些概念
建立分支(git branch)
git branch <分支名稱>
在終端機輸入git branch dev
後,就可以從sourcetree的commit也多了一個dev
接下來再
把HEAD移到分支(git checkout)
git checkout <分支名稱>
可以用git branch
查看
可以看到下面圖片sourcetree(左),終端機(右)的*號都移到了dev的位置。
圈圈、*號所代表的是目前git checkout位置(HEAD)
接著新增檔案index2.html並直接commit來看看變化:
➜ gitTest git:(dev) touch index2.html
➜ gitTest git:(dev) ✗ git add .
➜ gitTest git:(dev) ✗ git commit -m "新增index2"
[dev 0549389] 新增index2
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index2.html
這時候HEAD的位置在dev分支,如果想要
回到主支(git checkout master)
master的話,使用git checkout master
移動
分支合併(git merge)
快轉模式(fast-forward)
如果我們想要commit分支的紀錄,要先讓HEAD移動到master之後,在使用
git merge <分支名稱>
來合併master還有我們想要的分支
所以輸入git merge dev
,所以此時此刻
本地master、head、dev就會在相同的地方,而因為還沒上傳到遠端數據庫,所以origin master自然而然會停留在先前的commit上,如下圖
這個合併過程,就稱為快轉模式(fast-forward),簡單說就是當 HEAD
位置是某個要被 merge branch(dev)
上的初始 commit,就會觸發快轉模式。
master沒有更新,且分支最初始的commit是從這個master出來的時候就會觸發。
反之:
非快轉模式
先做準備,移動到分支,上傳檔案,commit, 回到主支
➜ gitTest git:(master) git checkout dev
切換到分支 'dev'
➜ gitTest git:(dev) touch index3.html
➜ gitTest git:(dev) ✗ git add .
gitTest git:(dev) ✗ git commit -m "新增index4"
[dev 278b024] 新增index4
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index4.html
➜ gitTest git:(dev) ✗ git checkout master
A index3.html
切換到分支 'master'
您的分支領先 'origin/master' 共 1 個提交。
(使用 "git push" 來發布您的本機提交)
然後輸入
git merge <分支名稱> --no-ff
git merge dev–no-ff後,會出現
這邊的意思,就等同於輸入git commit -m ""
中“”裡面的內容,也就是commit名稱,當覺得沒問題就關掉,這個開啟的vim編輯器是可以修改vscode或是sublime的,參考這邊。
所以快轉模式跟非快轉模式其實就merge的結果而言其實是一樣的,但非快轉模式可以讓我們知道,在這段merge之前做了哪些事情。
語法回顧
- 建立分支:
git branch <分支名稱>
- 切換分支:
git checkout <分支名稱>
- 合併分支:
git merge <分支名稱>
版本還原(git reset)
有些時候,總是會手殘操作錯誤,例如把不該加入索引的檔案加入,或者是檔案儲存後發現自己寫錯內容,想還原整個檔案。
所以檔案還原大致上分兩種方案
修改commit內容,或是連整個commit都不要,
修改commit內容
如果要修改commit內容的話,使用git reset HEAD^
相關指令(HEAD後面的「^」代表要幾個版本),這時候從sourcetree會看到原本的commit名稱變成了「Uncommitted changes」,這時候還是會保留先前的修改紀錄,更改程式之後再重新透過git add .
還有git commit -m <修改過的標題名稱>
重新commit
放棄commit
這跟上面的差別在於連先前的紀錄都不會保留,也就是不會有「Uncommitted changes」,方法如下:
git reset HEAD --hard
還原遠端倉庫commit
在一般的情況下,是沒有需要還原先前的版本的,只有誤傳或是非必要的情況才會使用,在下面的例子,我們先輸入git reset HEAD^^ --hard
讓本地commit回到先前兩個版本,在使用git push
,可以看到終端機並不允許這樣的操作。
但也可以看到,本地檔案確實回到先前的commit,
這時候,我們只需要
git push -f
-f就代表了強制的意思,所以會變成
git reset 以及checkout觀念
總結來說,git reset <shl-1>
的功能就是將HEAD到指定的commit點去,所以可以將HEAD跟Master 做連結,在一起移動。
所以要注意HEAD的地方,git checkout <>
,可以是分支的名稱,也可以是commit的名稱,利用移動HEAD,來決定分支的移動,還是HEAD的移動。
查看歷史紀錄git reflog
如果不小心刪除掉commit的話,可以透過git reflog
來查看編號,
並救回來,查看完編號之後,再透過git reset <refolg編號>
來還原
分支練習網站
GITHUB
如果需要文章中的檔案,可以到https://github.com/yen0304/test來下載。