聲明
此篇文章內容是本人在 github上尋找到Peter Cottle
的項目 https://github.com/pcottle/learnGitBranching.git 中學習git相關命令時所做的筆記,目的是方便復習時查看相關內容。
大家也可以直接打開下面的鏈接進行學習
鏈接:https://learngitbranching.js.org/?gist_level_id=a84407351f9c9f0cb241&locale=zh_CN
在此致敬大佬!
基礎篇
1:Git Commit
創建一個新的提交記錄
git commit -m "[消息體]"
2:Git Branch
使用分支的意義:我想基於這個提交以及它所有的父提交進行新的工作。
顯示所有分支
git branch
創建新的分支
git branch [branch_name]
創建並切換到新的分支
git checkout -b [branch_name]
3:合並分支
3.1:Git Merge
在 Git 中合並兩個分支時會產生一個特殊的提交記錄,它有兩個父節點。翻譯成自然語言相當於:” 我要把這兩個父節點本身以及他們所有的祖先都包含進來。“
把當前分支與目標分支(branch_name)進行合並,會產生一個新的提交記錄,這個記錄包含合並之前兩個分支的最新記錄,然后當前分支指向這個記錄。
git merge [banch_name]
示例:
git merge bugFix
3.2:Git Rebase
Rebase 實際上就是取出一系列的提交記錄,”復制“他們,然后再另外一個地方逐個的放下去,
特點:更加線性,使代碼庫的提交歷史變得異常清晰。
將當前分支里的工作直接移到目標分支(branch_name)上
git rebase [branch_name]
git rebase master
高級篇
1:在提交樹上移動
HEAD 是一個對當前檢出記錄的符號引用 —— 也就是指向你正在其基礎上進行工作的提交記錄。
HEAD 總是指向當前分支上最近一次提交記錄。
HEAD 通常情況下是指向分支名的。
查看HEAD 指向:cat .git/HEAD (如果HEAD指向的是一個引用則可以用:git symbolic-ref HEAD)
git checkout [objeck_pos] (切換HEAD指向目標位置(object_pos))
示例:
git checkout c1
2:相對引用(^,~
)
- 使用 ^ 向上移動一個提交記錄
- 使用 ~
向上移動多個提交記錄,如 ~3
示例:
git checkout master^ (git checkout master~1)
3:強制修改分支位置
移動分支到目標位置:
git branch -f [branch_name] [object_pos]
示例:
git branch -f bugFix master~3
git branch -f master c6 (c6是提交記錄的哈希值,可以通過 git log 命令來查看)
4:撤銷變更
撤銷變更:
-
底層部分(暫存區的獨立文件或者片段)
-
上層部分(變更到底是通過哪種方式被撤銷的)組成。
4.1:Git Reset
git revert [分支名/記錄哈希值/HEAD~<num>] (只能跟一個參數)
git reset
通過把分支記錄回退幾個提交記錄來實現撤銷改動。你可以將這想象成“改寫歷史”。git reset
向上移動分支,原來指向的提交記錄就跟從來沒有提交過一樣。
缺點:只能在本地分支中使用,對遠程分支無效
示例:
git reset HEAD~1
4.2:Git Revert
git revert [param1] [param2] ... (后面可以跟多個參數(分支名/記錄哈希值/HEAD~<num>))
- 遠程分支上可以使用
示例1:
git revert HEAD
解釋:新提交記錄 C2'
引入了更改 —— 這些更改剛好是用來撤銷 C2
這個提交的。也就是說 C2'
的狀態與 C1
是相同的。
- revert 之后就可以把你的更改推送到遠程倉庫與別人分享啦。
示例2:
git reset local^
git checkout pushed
git revert pushed local
移動提交記錄
1:Git Cherry-pick
將一些提交復制到當前所在的位置(HEAD
)
-
git cherry-pick <提交號>...
-
與
git rebase
類似
示例:
git cherry-pick c2 c4
2:交互式 rebase
交互式 rebase 指的是使用帶參數 --interactive
的 rebase 命令, 簡寫為 -i
如果你在命令后增加了這個選項, Git 會打開一個 UI 界面並列出將要被復制到目標分支的備選提交記錄,它還會顯示每個提交記錄的哈希值和提交說明,提交說明有助於你理解這個提交進行了哪些更改。
在實際使用時,所謂的 UI 窗口一般會在文本編輯器 —— 如 Vim —— 中打開一個文件。
特點:不清楚提交記錄的哈希值時使用比較方便
當 rebase UI界面打開時, 你能做3件事:
- 調整提交記錄的順序(通過鼠標拖放來完成)
- 刪除你不想要的提交(通過切換
pick
的狀態來完成,關閉就意味着你不想要這個提交記錄) - 合並提交。 遺憾的是由於某種邏輯的原因,我們的課程不支持此功能,因此我不會詳細介紹這個操作。簡而言之,它允許你把多個提交記錄合並成一個。
示例:
git rebase -i HEAD~4
注意!:實際上並不是此畫面。
代碼測試:
$ git log
commit 1839f3c00d6407c594d6f575872f743eed82195e (HEAD -> master)
Author: rainMist <------------> #此處橫杠代表我的郵箱
Date: Sun Jan 10 23:51:19 2021 +0800
changed the b.html
commit e2ef072ca6121a2ecb2b1f0170ce18f5999fa3fe
Author: rainMist <------------> #此處橫杠代表我的郵箱
Date: Fri Jan 8 22:19:07 2021 +0800
修改代碼
commit 6e74ece9436503f52efed4ec99d54bcebc53faaa
Author: rainMist <------------> #此處橫杠代表我的郵箱
Date: Fri Jan 8 12:38:31 2021 +0800
new file b.html
$ git rebase -i master~3
hint: Waiting for your editor to close the file...
執行命令后會打開文件(此處打開notepad++是因為我安裝Git時配置的)
雜項
1:本低棧式提交
2:提交的技巧 #1
示例:
git rebase -i HEAD~2
git commit --amend
這句命令可以用下面兩句代替:
- git branch caption c2
- git rebase c3'
git rebase -i HEAD~2
git branch -f master caption
3:提交的技巧 #2
主要利用 git cherry-pick
和git checkout
命令。
git checkout c1
git cherry-pick c2
git checkout master
git cherry-pick c2 c3
4:Git Tag
永遠指向某個提交記錄的標識,不會隨着新的提交而移動,也不能檢出到某個標簽上面進行修改提交
git tag [tag_name][record]
- 第一個參數 - 標簽名
- 第二個參數 -提交記錄(即需要標簽的位置)
注意:如果不指定提交記錄,Git 會用 HEAD
所指向的位置。
5:Git Describe
-
描述離你最近的錨點(也就是標簽)
-
Git Describe 能幫你在提交歷史中移動了多次以后找到方向;當你用
git bisect
(一個查找產生 Bug 的提交記錄的指令)找到某個提交記錄時
語法:
git describe <ref>
<ref>
可以是任何能被 Git 識別成提交記錄的引用,如果你沒有指定的話,Git 會以你目前所檢出的位置(HEAD
)。
它輸出的結果是這樣的:
<tag>_<numCommits>_g<hash>
tag
表示的是離 ref
最近的標簽, numCommits
是表示這個 ref
與 tag
相差有多少個提交記錄, hash
表示的是你所給定的 ref
所表示的提交記錄哈希值的前幾位。
當 ref
提交記錄上有某個標簽時,則只輸出標簽名稱
高級話題
1:多分支 rebase
示例:
git checkout another
git rebase side
git rebase bugFix
git rebase master
git branch master another
2:兩個父節點
操作符 ^
與 ~
符一樣,后面也可以跟一個數字。
但是該操作符后面的數字與 ~
后面的不同,並不是用來指定向上返回幾代,而是指定合並提交記錄的某個 父提交。
示例:
git branch -f bugWork HEAD~^2~
此步相當於以下步驟組合:
- git branch bugWork #創建分支bugWork
- git branch -f bugWork HEAD~ #強制移動分支到 c6 提交記錄
- git branch -f bugWork HEAD^2 #強制移動分支到 c6 的第二個父提交 -c5 提交記錄
- git Branch -f bugWork HEAD~ #強制移動分支到 c2 提交記錄
3:糾纏不清的分支
現在我們的 master
分支是比 one
、two
和 three
要多幾個提交。出於某種原因,我們需要把 master
分支上最近的幾次提交做不同的調整后,分別添加到各個的分支上。
one
需要重新排序並刪除 C5
,two
僅需要重排排序,而 three
只需要提交一次。
git checkout one
git cherry-pick c4 c3 c2
git checkout two
git cherry-pick c5 c4 c3 c2
git branch -f three c2
到此結束!