Featured image of post GIT學習筆記(2)-分支、還原

GIT學習筆記(2)-分支、還原

如何使用git分支、還原來進行版本控制

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編號>來還原

分支練習網站

git learn

GITHUB

如果需要文章中的檔案,可以到https://github.com/yen0304/test來下載。

comments powered by Disqus