Git 課程學習筆記-ep5

Jordan Tseng
JordanTTCDesign
Published in
Oct 4, 2020

第五堂課就是這次 git 課程的最終了😭

最後主要講 git rebase、git cherry-pick、git reset 三項,用於整理與更複雜的使用情況。

git rebase

上課時,老師用一個例子與我們分享。

之前學習的開發流程是把功能拆出來開發,開發完成後再 merge 到 dev 開發主機上(如下圖):

常見開發流程圖

但可能有些公司會不喜歡方式,因這樣等於 c5 這個commit 中其實沒啥新東西,只是用來 merge 而已,這時候就可使用到 rebase拉!

怎麼做呢?先回到合併前,然後 →

git checkout f/js
git rebase dev

這樣線圖就會比較乾淨了!而且合併後,其實兩種方式效果是一樣的!!

rebase合併法示意圖

git rebase 時,發生衝突怎麼辦?

不只merge,rebase 時也會發生衝突,如下圖:

rebase衝突示意圖

大致上的解決方式其實也是跟一般的解決衝突流程差不多:

  1. 選擇保留哪個分支內容
  2. 存擋,關閉視窗,這時候尚未合併
  3. git add .

唯一不同的是 git commit 改成

git rebase — continue

rebase 的缺點

rebase 也不是完美的,如下圖,因為把 commit c2 點移植到 c3 之後,這樣修改了 commit tree 的歷史紀錄。所以有時候可能會有點混亂。

git cherry-pick

git cherry-pick,有點像摘葡萄的概念,把需要的摘下來用。

假設昨天上班已經開發三個功能,但是今天老闆要你先上傳 c2 的功能,這時候怎麼做呢?

這時候就可以用cherry-pick,把需要的摘下來就好:

git cherry-pick c2(記得實際上不會是c2,而會是每次commit的sha-1編號拉!)

摘出來後就可以 git push 拉!

也可以連續摘兩個需要的commit唷~只要在兩個sha-1值中間加入空格即可。

git cherry-pick c2 c4
cherry-pick 兩個 commit 示意圖

git reset 還原

git reset 雖然中文是還原,其實也不算是還原,有點像是帶著分支前往特定commit。

因為我們reset到以前的 commit 點後,如果 reset 錯了,其實只要知道 原本的 sha-1 值,都隨時可以 git reset 回到剛剛位置。

我們用下面一個最基礎的寫法來講解:

git reset HEAD^

HEAD:就是當下HEAD位置,一般來說會綁定在master或其他分支tag上面。

HEAD後面的『^』:看起來像眼睛實際上不是眼睛,是用來說移動幾個,所以HEAD^是往回一個commit,HEAD^^^,是往回三個。

git reset也不是只能一格一格移動,只能這樣的話是要移動到幾點?

可以使用:

git reset HEAD^
git reset sha-1編號 //快速移動到某個commit點

補充:

同時git reset,也不是只能用在這些,有時候我們可能 git add . 後才發現錯了,想反悔就可以:

git rest HEAD

可以看到上面只有使用 HEAD,後面並沒有加上^

→這樣代表只是還原到目前這個 commit 點初始的樣貌,重新開始。

git reset其實有很多參數

一般的「git reset HEAD^」:檔案還會保留在工作目錄中,簡單來說就是沒git add .。

在 sourceTree上面看,也會有看到uncommitted changes,代表剛剛的index4等待commit。

一般的 git reset

hard:代表所有檔案都不保留。

git reset HEAD^ --hard

不想用hard也能使用下面code來清空工作目錄

git clean -f

有hard,就會有soft:

git reset HEAD^ --soft

用soft的話就會像下圖一樣,還原的檔案直接跑到索引的狀態(已 git add .)

老師是說平常他都只使用git reset,不然就是hard。

補充指令:

reset 過後,在路線圖上就會消失找不到嚕,也看不到sha-1值,那這時候要怎麼找回來呢?

git reflog

會顯示過去做過的事情紀錄,在前面就會顯示他們的sha-1值。

是不是很方便呢?

git checkout & git reset 差異

checkout和reset很像,他們是有差異的:

checkout:只移動HEAD,去關注某個commit位置(如:c1)

git checkout

git reset:是把分支標籤移動到某個commit 位置(如:c1)

git reset

做自己的樣板

在工作時,要讓自己的速度變快,因為平常開發其實大概都會有固定常使用套件(scss、bs4…等),就可以把這些的初始包上傳到github,然後設定自己的捷徑 code ,自動 clone 下來。

在 .gitconfig 檔案中設定:

如上圖設定,這樣只要打 git new → 就取代要上 github 找那段網址複製下來的時間或是設定半天套件。

完成後,因為這是已經上傳到github的套件包,所以本身就是有 git 資料夾,所以可能就會有一些 commit 紀錄。

如果一些大專案不想要有那些紀錄,就直接把這個資料夾刪除再重新 git init 即可。

補充:node_modules絕對不能加入到索引中,因為modules實在太佔空間了。

所以要用. gitignore 這個來,寫入一些不要加入到 git 版控中的檔案。

終於充實的上完了:)要在未來中好好使用 git 唷!!

感謝六角老師、助教的教導

--

--