Git 系列教程(14)- 遠程分支


遠程分支

遠程引用是對遠程倉庫的引用(指針),包括分支、標簽等等

你可以通過 git ls-remote <remote> 來顯式地獲得遠程引用的完整列表

polo@B-J5D1MD6R-2312 watermarker % git ls-remote
From git@gitee.com:poloyy/watermarker.git
3fb14343217ff0725bbf68f9a1b5f36fa650548f    HEAD
3fb14343217ff0725bbf68f9a1b5f36fa650548f    refs/heads/master
7fa175dbc2a1ce3cec03033472abb894f1a94527    refs/tags/testbu
8be5ab723bc931dcae3cd9a2bccaca8b474e962b    refs/tags/v1.1
9baca61910f4182075c753a4bb9eedba5af8cb02    refs/tags/v1.1

 

或者通過 git remote show <remote> 獲得遠程分支的更多信息

polo@B-J5D1MD6R-2312 watermarker % git remote show origin
* 遠程 origin
  獲取地址:git@gitee.com:poloyy/watermarker.git
  推送地址:git@gitee.com:poloyy/watermarker.git
  HEAD 分支:master
  遠程分支:
    master 已跟蹤
  為 'git pull' 配置的本地分支:
    master 與遠程 master 合並
  為 'git push' 配置的本地引用:
    master 推送至 master (最新)

 

遠程跟蹤分支

  • 遠程跟蹤分支是遠程分支狀態的引用
  • 一旦你進行了網絡通信, Git 就會為你移動它們以精確反映遠程倉庫的狀態
  • 該分支在遠程倉庫中的位置就是最后一次連接到它們的位置

 

命名格式

 <remote>/<branch> 

 

查看最后一次與遠程倉庫 origin 通信時 master 分支的狀態

origin/master 

你與同事合作解決一個問題並且他們推送了一個 iss53 分支,你可能有自己的本地 iss53 分支, 然而在服務器上的分支會以 origin/iss53 來表示

 

為何叫 origin? 

  • giit clone 命令會給遠程倉庫默認命名為 origin,然后拉取它的所有數據, 創建一個指向它的 master 分支的指針,並且在本地將其命名為 origin/master【遠程分支 origin/master】
  • Git 也會給你一個與 origin 的 master 分支在指向同一個地方的本地 master 分支,這樣你就有工作的基礎【本地分支 master】

 

重點

  • origin 和 master 一樣,沒有特殊的含義
  • 只是 git init 時默認的起始分支名字取得就是 master
  • 而 git clone 默認給遠程倉庫名字取得就是 origin

假設指定遠程倉庫名字

 git clone -o booyah

 

那么默認的遠程分支名字就是 booyah/master

克隆之后的服務器與本地倉庫。

 

克隆之后的遠程倉庫與本地倉庫

  • 有人在 git.ourcompany.com 的 master 分支上 push 了新的提交
  • 而自己在本地的 master 分支上也做了提交但是沒有 push
  • 只要本地不拉取最新的數據,那么本地的遠程分支(origin/master)還是指向之前的 f4265 節點

本地與遠程的工作可以分叉。

 

本地與遠程的工作可以分叉

將本地的遠程倉庫和服務器上的遠程倉庫同步數據

git fetch <remote>
git fetch origin
  • 這個命令查找 “origin” 是哪一個服務器(在本例中,它是 git.ourcompany.com
  • 從中拉取本地沒有的數據,並且更新本地數據庫
  • 移動 origin/master 指針到更新之后的位置

`git fetch` 更新你的遠程倉庫引用。

可以看到,因為本地的 master 分支已經有過新的提交,所以和 origin/master 遠程分支處於分叉狀態

 

git fetch 更新你的遠程跟蹤分支

現在有個新的 git 服務器位於 git.team1.ourcompany.com

當有多個遠程倉庫與遠程分支的情況下,要怎么添加新的遠程倉庫引用到本地項目呢?

git remote add <remote> <git 服務器 url

添加另一個遠程倉庫。

 

添加另一個遠程倉庫

抓取新添加的遠程倉庫在本地沒有的數據

git fetch teamone
  • 因為那台服務器上現有的數據是 origin 服務器上的一個子集,
  • 所以 Git 並不會抓取數據而是會設置遠程跟蹤分支 teamone/master 指向 teamone 的 master 分支。
遠程跟蹤分支 `teamone/master`。
 

推送至遠程跟蹤分支 teamone/master

推送本地指定分支的內容到指定的遠程倉庫下
git push <remote> <branch>:

 

栗子

將本地的 serverfix 分支推送到遠程倉庫上的 awesomebranch 分支

git push origin serverfix:awesomebranch

 

下一次其他協作者從服務器上拉取數據時,他們會在本地生成一個遠程分支 origin/serverfix,指向服務器的 serverfix 分支的引用:

$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix

這樣操作,本地不會自動新增一個 serverfix 分支,只是有一個不可修改的 origin/serverfix 指針

 

git merge origin/serverfix 

這也是將 origin/serverfix 遠程分支下的內容合並到本地當前所在分支

 

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix' 

這樣可以在本地新建一個 serverfix 分支,並且和 origin/serverfix 遠程分支指向同一個提交內容

 

跟蹤分支

  • 從一個遠程跟蹤分支 checkout 一個本地分支會自動創建所謂的“跟蹤tracking分支”(它跟蹤的分支叫做“上游 upstream 分支”)
  • 跟蹤分支是與遠程分支有直接關系的本地分支
  • 如果在一個跟蹤分支上輸入 git pull,Git 能自動地識別去哪個服務器上抓取、合並到哪個分支

 

-u 或 --set-upstream-to 

將本地分支跟蹤一個剛拉取下來的遠程分支,或者修改正在跟蹤的上游分支

$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.

 

查看設置的所有跟蹤分支

這會將所有的本地分支列出來並且包含更多的信息,如每一個分支正在跟蹤哪個遠程分支與本地分支是否是領先、落后或是都有。
$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new
  • iss53 分支正在跟蹤 origin/iss53 並且 “ahead” 是 2,本地有兩個提交還沒有推送到服務器上【領先兩個提交】
  • master 分支正在跟蹤 origin/master 分支並且是最新的【 [] 里面沒有其他提示】
  • serverfix 分支正在跟蹤 teamone 服務器上的 server-fix-good 分支並且領先 3 落后 1,服務器上有一次提交還沒有合並入同時本地有三次提交還沒有 push
  • testing 分支並沒有跟蹤任何遠程分支【沒有 [] 】

 

重點注意

  • git branch -vv 顯示的值來自每個服務器最后一次拉取數據(git fetch)
  • 這個命令並沒有連接服務器,它顯示本地緩存的服務器數據
  • 如果想要統計最新的 ahead 與 behind 數字,可以先拉取所有服務器的最新數據
git fetch --all
git branch -vv

 

拉取

git fetch 命令從服務器上抓取本地沒有的數據時,它並不會修改工作目錄中的內容,它只會獲取數據然后讓你自己合並

 

git pull 命令等價於

git fetch
git merge

 

刪除遠程分支

當某個遠程分支已經做完所有工作,且把該分支的內容合並到了 master 分支(或其他穩定版本分支),就要刪除不再需要的遠程分支

$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix
  • 基本上這個命令做的只是從服務器上移除這個指針
  • Git 服務器通常會保留數據一段時間直到垃圾回收運行,所以如果不小心刪除掉了,通常是很容易恢復的

 


免責聲明!

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



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