標籤(tag)
Git可針對某一項commit打上標籤(tag),通常用來表示該commit的重要性,例如版本的發布,
以下"針對某一特定commit打上標籤"作為範例
git tag -a TAG_NAME [<commit>] -m "msg for tag"
git tag -a v0.1.0 9ea3648 -m "initial version"
TAG_NAME有沒有" "都可以,但須為連續字串
可用git tag
查看所有標籤;git show v0.1.0
查看" tag v0.1.0 "的commit的詳細資料
輕量標籤就是簡化版tag,只需git tag TAG_NAME [<commit>],沒寫[<commit>]就會打在當前HEAD所在的位置
同一commit可以有複數tag,顯示該commit所有tags:git tag --points-at [<commit>]
刪除標籤:git tag -d TAG_NAME
branch建立、切換、刪除
git branch "NEW_BRANCH"
開一個新的分支
git branch
查看當前所在分支及所有分支
PS E:\前端學習\Vue Practice\project-find-a-coach> git branch NewBranch PS E:\前端學習\Vue Practice\project-find-a-coach> git branch NewBranch * master
切換分支:git checkout "TARGET_BRANCH"
(是checkout不是check)
切換後會顯示" Switched to branch '你切換的目標分支' "
創建同時切換:git checkout -b "NEW_BRANCH"
刪除分支:git branch -d "TARGET_BRANCH"
,如果目標分支尚未merged,會跳出error訊息。
(用 -D
可強制硬刪)
練習開分支
開NewBranch後,移到該branch上繼續檔案編輯與提交commit,
該branch就會持續延伸,而原先的master則暫時停滯在v0.1.1開NewBranch(因為尚未針對master做後續的commit)
在NewBranch上一路commit到v0.2.3,在中間v0.2.2的地方又再開一個test分支,
分別git checkout master
、git checkout test
到master和test分支上各自提交一次版本更新
各分支分叉如圖
練習合併分支
在當前branch執行合併其他branch的操作
git merge "想要合併的branch" git merge "checkout的branch" "想要合併的branch"
如果兩分之間的檔案沒有conflict問題,會直接合併;
若有conflict,則編輯造成conflict的檔案後,提交commit完成合併。
假如希望想合併的分支合併過來只保留最後結果的話,可以加上--squash
git merge --squash "想要合併的branch"
只想合併特定幾項commit?
使用git cherry-pick "TARGET_SHA-1"
刪除無用分支
合併後試著刪除test分支,由圖可看出現在只剩master和NewBranch這兩個分支
git branch -d test //執行後的message Deleted branch test (was 6262b84).
誤刪或是後悔合併之類的,都可用git reset --hard還原
多人開發時,取消、撤回某一項commit時,可使用git revert
使用git log
查看merge時的commit內容,範例如下
PS E:\前端學習\Vue Practice\project-find-a-coach> git log -1 commit 3dc2f0ed2c1607dffd31d94e0029fd7e4841007c (HEAD -> master) Merge: 35b9b11 6262b84 Author: Eide <zun620@gmail.com> Date: Tue Dec 1 13:08:04 2020 +0800 Merge branch 'test'
第三行"Merge"有寫兩個commit hash,由於在revert merge commit的時候,
Git不知道哪個commit hash才是你的parent,因此需加上" -m 數字 "標記revert回哪一條線
git revert 3dc2f0e -m 1
版本文件顯示0.1.2,也就是merge前master branch最後的狀態。
如果是改寫成-m 2的話,revert回去會顯示v0.3.0
git revert雖然也是還原,但它是以提交新的commit的方式來還原
也就是說tree會一直長下去
Rebase是什麼?
不同於merge總是向前繼續改寫紀錄,rebase則是改寫歷史紀錄
"base"乃長出branch的那個commit。所以換言之,rebase便是修改A的base至TARGET_BRANCH上
rebase過程如果發現兩個branch的檔案有衝突,需編輯後(看要留哪個版本)再次commit
然後繼續執行rebase流程:git rebase --continue
rebase前
rebase後
與merge方法不同,rebase後沒有所謂"耳朵"(紅色線),會完全合為一條
雖然tree變得簡潔,但可以發現開發過程中,原先NewBranch上曾經有過的v0.2.3、v0.2.4都不見了
這也正是前面所說的"rebase改寫歷史紀錄"
謹慎使用!
(一般你在開發團隊內可能不一定有權限使用rebase指令OuO)
--待續--