【學了就忘】Git分支 — 43.基本分支操作(二)

6、新建一個分支並且使分支指向指定的提交對象

使用命令:git branch branchname commitHash

我們現在本地庫中只有一個 master 分支,並且在 master 分支有三個提交歷史。

需求:創建一個 testing 分支,並且testing 分支指向 master 分支第二個版本。

# 1.查看提交歷史記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --graph --oneline
* b97ccfd (HEAD -> master) 第3次提交,新增內容:branch test v3
* f72a9fe 第2次提交,新增內容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

# 2.創建testing分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch testing f72a9fe

# 3.查看提交歷史記錄,此時我們還在master分支上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --graph --oneline
* b97ccfd (HEAD -> master) 第3次提交,新增內容:branch test v3
* f72a9fe (testing) 第2次提交,新增內容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

# 4.切換到testing分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout testing
Switched to branch 'testing'

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --graph --oneline
* f72a9fe (HEAD -> testing) 第2次提交,新增內容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

# 5.再來查看readme.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat readme.txt
branch test v1
branch test v2

如上,我們看到新創建的 testing 分支,創建在master分支的第二個版本上了。

HEAD 指針的移動狀態如下圖:

執行git branch testing f72a9fe命令,創建testing 分支後:

執行git checkout testing命令,切換分之後:

總結:

在日常工作中,我們可以這樣的操作,切換到之前的版本,或者其他人之前寫過的版本。我們把自習需要的代碼進行保存,然後就可以在切換到自己開發的分支上,應用這些代碼,同時把剛纔創建的分支刪除掉即可。

(該操作在工作中非常的實用)

7、思考:

git checkout -b branchname commit-Hash命令,

能否代替下面兩個命令:

  • git branch branchname commitHash
  • git checkout branchname

答案是可以的。

示例如下:

# 1.查看本地庫中所有的分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch
* master

# 2.查看當前分支的提交歷史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
b97ccfd (HEAD -> master) 第3次提交,新增內容:branch test v3
f72a9fe 第2次提交,新增內容:branch test v2
fa2439a 第1次提交,新增readme.txt文件

# 3.創建testing分支,並切換
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout -b testing f72a9fe
Switched to a new branch 'testing'

# 4.查看testing分支的提交歷史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline
f72a9fe (HEAD -> testing) 第2次提交,新增內容:branch test v2
fa2439a 第1次提交,新增readme.txt文件

# 5.查看readme.txt是否是V2版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat readme.txt
branch test v1
branch test v2

8、項目分叉歷史的形成

查看當前版本庫的如上,此刻正在 testing 分支的上工作,在 readme.txt 文件在第二個版本。

需求:我需要在 testing 分支的上,修改 readme.txt 文件,並提交新版本。

# 1.查看版本庫狀態
# 分支情況
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git branch
  master
* testing

# 分支的提交歷史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline
f72a9fe (HEAD -> testing) 第2次提交,新增內容:branch test v2
fa2439a 第1次提交,新增readme.txt文件

# 2.修改readme.txt文件並提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ echo "branch test v333 testing" >> readme.txt

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git commit -a -m 'testing 分支的提交'
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
[testing 7ba443e] testing 分支的提交
 1 file changed, 1 insertion(+)

# 3.查看testing分支歷史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline --graph
* 7ba443e (HEAD -> testing) testing 分支的提交
* f72a9fe 第2次提交,新增內容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

# 4.查看所有分支的歷史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline --graph --all
* 7ba443e (HEAD -> testing) testing 分支的提交
| * b97ccfd (master) 第3次提交,新增內容:branch test v3
|/
* f72a9fe 第2次提交,新增內容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件

我們可以看到,現在這個項目的提交歷史已經產生了分叉。

在實際工作中,是因爲你創建了一個新分支,並切換過去進行了一些工作,可能隨後又切換回 master 分支進行了另外一些工作,這樣針對的是不同分支進行改動,就會在工作目錄中產生項目的分叉歷史。

你可以在不同分支間不斷地來回切換和工作,並在時機成熟時將它們合併起來。 而所有這些工作,你需要的命令只有 branchcheckoutcommit

此時 HEAD 指針的狀態如下圖:

9、分支的總結

由於 Git 的分支實質上僅是包含,所指對象校驗和(長度爲 40 的 SHA-1 值字符串)的文件,所以它的創建和銷燬都異常高效。 創建一個新分支就相當於往一個文件中寫入 41 個字節(40 個字符和 1 個換行符),如此的簡單能不快嗎。

這裏簡單說明一下:

# 1.查看.git/refs/heads目錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ ll .git/refs/heads/
total 2
-rw-r--r-- 1 L 197121 41  4月 16 22:07 master
-rw-r--r-- 1 L 197121 41  4月 17 11:26 testing

# 可以看到.git/refs/heads目錄存放的是版本庫中的分支。

# 2.查看testing文件只呢箇中的內容給
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat .git/refs/heads/testing
7ba443e4f6591631af4276bd3aa7356ff0f61fac

# 可以看到是一個提交的索引,對比上圖中的`7ba443e`提交,你就明白了。

# 3.在往深說一點,查看.git/HEAD文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat .git/HEAD
ref: refs/heads/testing

# .git/HEAD文件就是之前說的HEAD指針,指向了當前正在工作的分支。
# 是不是一切都非常的簡單高效。

這與過去大多數版本控制系統形成了鮮明的對比,它們在創建分支時,將所有的項目文件都複製一遍,並保存到一個特定的目錄。 完成這樣繁瑣的過程通常需要好幾秒鐘,有時甚至需要好幾分鐘。所需時間的長短,完全取決於項目的規模。

而在 Git 中,任何規模的項目都能在瞬間創建新分支。 同時,由於每次提交都會記錄父對象,所以尋找恰當的合併基礎(即共同祖先)也是同樣的簡單和高效。 這些高效的特性使得 Git 鼓勵開發人員頻繁地創建和使用分支。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章