Git 課程學習筆記-ep5
第五堂課就是這次 git 課程的最終了😭
最後主要講 git rebase、git cherry-pick、git reset 三項,用於整理與更複雜的使用情況。
git rebase
上課時,老師用一個例子與我們分享。
之前學習的開發流程是把功能拆出來開發,開發完成後再 merge 到 dev 開發主機上(如下圖):
但可能有些公司會不喜歡方式,因這樣等於 c5 這個commit 中其實沒啥新東西,只是用來 merge 而已,這時候就可使用到 rebase拉!
怎麼做呢?先回到合併前,然後 →
git checkout f/js
git rebase dev
這樣線圖就會比較乾淨了!而且合併後,其實兩種方式效果是一樣的!!
git rebase 時,發生衝突怎麼辦?
不只merge,rebase 時也會發生衝突,如下圖:
大致上的解決方式其實也是跟一般的解決衝突流程差不多:
- 選擇保留哪個分支內容
- 存擋,關閉視窗,這時候尚未合併
- 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
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。
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 reset:是把分支標籤移動到某個commit 位置(如:c1)
做自己的樣板
在工作時,要讓自己的速度變快,因為平常開發其實大概都會有固定常使用套件(scss、bs4…等),就可以把這些的初始包上傳到github,然後設定自己的捷徑 code ,自動 clone 下來。
在 .gitconfig 檔案中設定:
如上圖設定,這樣只要打 git new → 就取代要上 github 找那段網址複製下來的時間或是設定半天套件。
完成後,因為這是已經上傳到github的套件包,所以本身就是有 git 資料夾,所以可能就會有一些 commit 紀錄。
如果一些大專案不想要有那些紀錄,就直接把這個資料夾刪除再重新 git init 即可。
補充:node_modules絕對不能加入到索引中,因為modules實在太佔空間了。
所以要用. gitignore 這個來,寫入一些不要加入到 git 版控中的檔案。
終於充實的上完了:)要在未來中好好使用 git 唷!!
感謝六角老師、助教的教導