git筆記整理-learnGitBranching


聲明

此篇文章內容是本人在 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-pickgit 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 是表示這個 reftag 相差有多少個提交記錄, 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 分支是比 onetwothree 要多幾個提交。出於某種原因,我們需要把 master 分支上最近的幾次提交做不同的調整后,分別添加到各個的分支上。

one 需要重新排序並刪除 C5two 僅需要重排排序,而 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

到此結束!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM