在討論遠程分支、遠程跟蹤分支之前,我們先來看看什么是分支。
分支(branch)
幾乎所有的版本控制系統都以某種形式支持分支。使用分支意味着你可以把你的工作從開發主線上分離開來,以免影響開發主線。Git的分支表示的就是一個開發線,而在本質上僅僅是指向一個提交對象(commit)的可變指針。commits都有指向其父對象的指針(零個、一個或多個),而branch就是一個指向最新commit的指針,因此通過遍歷這個鏈表,就可以得到這個分支的所有提交歷史。如下圖所示。

遠程分支(remote branch)
遠程分支就是存在於遠程倉庫上的那些分支,比如遠程倉庫上的master等分支。如下圖所示。

遠程跟蹤分支(remote-tracking branch)
遠程引用是對遠程倉庫的引用(指針),包括分支、標簽等等,而遠程跟蹤分支就是遠程分支狀態的引用,用於告訴用戶其所跟蹤的遠程分支的狀態。它們是你無法修改的本地引用,每當與遠程倉庫進行任何網絡通信(例如git fetch、get pull、git push等)時Git都會為你自動更新,以確保它們准確地表示遠程分支的狀態。遠程跟蹤分支就像是你上次連接到遠程倉庫時那些分支所處狀態的書簽。
遠程跟蹤分支的命名形式:<remote>/<branch>,如上圖所示。如果你想要看看你最后一次與遠程倉庫 origin 通信時 master 分支的狀態,你可以查看 origin/master 分支。如果你與同事合作解決一個問題並且他們向遠程分支iss53做了推送,此時你可能有自己的本地分支iss53,但是在服務器上的iss53分支是由本地倉庫的遠程跟蹤分支origin/iss53表示的。
實例
假設你有一個在git.ourcompany.com上的Git服務器,你可以使用git clone命令從這個Git服務器上向你自己的設備上克隆一個本地倉庫。Git clone命令會為你拉取所有數據,為每個分支創建遠程跟蹤分支(使用git branch -r 命令查看),比如:origin/master,創建並檢出一個初始分支(master)。如下圖所示。

如果你在本地的master分支做了一些工作,與此同時,其他人推送commits到git.ourcompany.com並更新了它的master分支,那么你們的提交歷史將向不同的方向前進。只要你不與git服務器進行連接通信,你的 origin/master(遠程跟蹤分支) 指針就不會移動。如下圖所示。

為了使你本地的工作與遠程倉庫保持同步(一致),需要先運行 git fetch <remote> 命令。這個命令查找 “origin” 是哪一個服務器(在本例中,它是git.ourcompany.com),從中抓取本地沒有的數據,並且更新本地數據庫,移動 origin/master 指針指向新的、更新后的位置。如下圖所示。

現在,本地分支master與遠程跟蹤分支origin/master指向的是不同的commit,working tree中是沒有31b8e、190a3這兩個commit的內容的,還需執行git merge命令進行合並。之后,一個新的commit被創建,本地分支master被更新以指向此最新commit,而遠程跟蹤分支origin/master保持不變。此時,working tree包含了31b8e、190a3、a38de、893cf 這四個commit。
注:《Pro Git》中的Remote Branches一節中引入了"tracking branch"這個概念,使得這個章節比較混亂,看后更加迷惑了。個人的理解是,這個"tracking branch"應該指的是本地倉庫中那些tracking了遠程分支的本地分支(本地分支也可能未tracking任何分支),簡單理解為本地分支會更清楚些。
參考:
https://git-scm.com/docs/git
https://git-scm.com/book/en/v2/
https://blog.csdn.net/zhuyucheng123/article/details/55045339
