Git基本操作(3)

Git

標籤(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 mastergit 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)



--待續--


© 2021 Hamsterism. All rights reserved github