遠端分支
遠端引用是對遠端倉庫的引用(指標),包括分支、標籤等等
你可以通過 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
指標到更新之後的位置
可以看到,因為本地的 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
推送本地指定分支的內容到指定的遠端倉庫下
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,伺服器上有一次提交還沒有合併入同時本地有三次提交還沒有 pushtesting
分支並沒有跟蹤任何遠端分支【沒有 [] 】
重點注意
- 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 伺服器通常會保留資料一段時間直到垃圾回收執行,所以如果不小心刪除掉了,通常是很容易恢復的