筆記源於:
在 git 中提交時,會儲存乙個提交(commit)物件,該物件包含乙個指向暫存內容快照的指標,包含本次提交的作者等相關附屬資訊,包含零個或多個指向該提交物件的父物件指標:首次提交是沒有直接祖先的,普通提交有乙個祖先,由兩個或多個分支合併產生的提交則有多個祖先。
git commit
新建個提交物件前,git 會先計算每乙個子目錄(專案根目錄)的校驗和,並將校驗和加入暫存區域(暫存操作會對每乙個檔案計算校驗和(sha-1 雜湊字串),然後把當前版本的檔案快照儲存到 git 倉庫中(git 使用 blob 型別的物件儲存這些快照)),然後在 git 倉庫中將這些目錄儲存為樹(tree)物件。之後 git 建立的提交物件,除了包含相關提交資訊以外,還包含著指向這個樹物件(專案根目錄)的指標。
每次提交物件會包含乙個指向上次提交物件的指標
當git切換分支時,git 會把工作目錄的內容恢復為檢出某分支時它所指向的那個提交物件的快照。它會自動新增、刪除和修改檔案以確保目錄的內容和你當時提交時完全一樣。
如果順著乙個分支走下去可以到達另乙個分支的話,那麼 git 在合併兩者時,只會簡單地把指標右移,因為這種單線的歷史分支不存在任何需要解決的分歧,所以這種合併過程可以稱為快進(fast forward)。
由於當前master
分支所指向的提交物件(c4)並不是iss53
分支的直接祖先,git 不得不進行一些額外處理。就此例而言,git 會用兩個分支的末端(c4 和 c5)以及它們的共同祖先(c2)進行一次簡單的三方合併計算。git 為分支合併自動識別出最佳的同源合併點:
git 可以自己裁決哪個共同祖先才是最佳合併基礎,然後git 自動建立了乙個包含了合併結果的提交物件。
任何包含未解決衝突的檔案都會以未合併(unmerged)的狀態列出。git 會在有衝突的檔案裡加入標準的衝突解決標記,可以通過它們來手工定位並解決這些衝突。
git branch --merged
檢視哪些分支已被併入當前分支(譯註:也就是說哪些分支是當前分支的直接上游。)
一般來說,列表中沒有*
的分支通常都可以用git branch -d
來刪掉。原因很簡單,既然已經把它們所包含的工作整合到了其他分支,刪掉也不會損失什麼。
git branch --no-merged
檢視尚未合併的工作
當你在使用分支及合併的時候,一切都是在你自己的 git 倉庫中進行的 — 完全不涉及與伺服器的互動
遠端分支(remote branch)是對遠端倉庫中的分支的索引。它們是一些無法移動的本地分支;只有在 git 進行網路互動時才會更新。遠端分支就像是書籤,提醒著你上次連線遠端倉庫時上面各分支的位置。
我們用(遠端倉庫名)/(分支名)
這樣的形式表示遠端分支。比如我們想看看上次同origin
倉庫通訊時master
分支的樣子,就應該檢視origin/master
分支。
一次 git 轉殖會建立你自己的本地分支 master 和遠端分支 origin/master,並且將它們都指向origin
上的master
分支。
git fetch
命令會更新 remote 索引,如圖
從遠端分支checkout
出來的本地分支,稱為跟蹤分支 (tracking branch)。跟蹤分支是一種和某個遠端分支有直接聯絡的本地分支。在跟蹤分支裡輸入git push
,git 會自行推斷應該向哪個伺服器的哪個分支推送資料。同樣,在這些分支裡執行git pull
會獲取所有遠端索引,並把它們的資料都合併到本地分支中來。
刪除遠端分支
git push [遠端名] :[分支名] 例:git push origin :serverfix
把乙個分支中的修改整合到另乙個分支的辦法有兩種:merge
和rebase
。
rebase: 把在乙個分支裡提交的改變移到另乙個分支裡重放一遍。
它的原理是回到兩個分支最近的共同祖先(
c2),根據當前分支(也就是要進行變基的分支experiment
)後續的歷次提交物件(這裡只有乙個 c3),生成一系列檔案補丁,然後以基底分支(也就是主幹分支master
)最後乙個提交物件(c4)為新的出發點,逐個應用之前準備好的補丁檔案,最後會生成乙個新的合併提交物件(c3'),從而改寫experiment
的提交歷史,使它成為master
分支的直接下游,如圖 所示:
rebase最後整合得到的結果與merge沒有任何區別,但變基能產生乙個更為整潔的提交歷史,彷彿所有修改都是在一根線上先後進行的,儘管實際上它們原本是同時並行發生的。
git rebase --onto master server client
// 取出client
分支,找出client
分支和server
分支的共同祖先之後的變化,然後把它們在master
上重演一遍
一旦分支中的提交物件發布到公共倉庫,就千萬不要對該分支進行變基操作。
Git學習筆記之分支
這些內容只是git知識的冰山一角 1.檢視當前版本庫當中有哪些分支 git branch a 2.建立分支名為 version1.0的分支 git branch version2.o再次檢視有哪些分支。號為當前的分支 git branch a master version1.0 remotes or...
Git學習之分支管理策略
建立乙個屬於自己的分支,別人看不到,你在你自己的分支上幹活,想提交就提交,直至開發完畢後,再一次性合併到原來分支上。這樣,既安全,又不影響他人工作。在實際的開發過程中,應照幾個基本原則進行分支管理 master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活 幹活都在dev分支上,也...
Git學習小記之分支原理
如果想要熟練使用 git,沒有分支理念是絕對行不通的,在用 git 管理專案的時候,經常需要使用 commit 這個命令,那麼這個 commit 到底是指什麼呢?按照官方的解釋,這應該成為乙個物件,它包含著乙個指向暫存內容 被add的檔案 快照的指標,包含本次提交的附屬資訊,比如說作者等等,指向父 ...