1. 程式人生 > >Git詳解——push

Git詳解——push

push 的本質

在之前的內容里,我粗略地說過, push 指令做的事是把你的本地提交上傳到中央倉庫去,用本地的內容來覆蓋掉遠端的內容。這個說法其實是不夠準確的,但 Git 的知識系統比較龐大,在你對 Git 了 解比較少的時候,用「上傳本地提交」來解釋會比較好理解;而在你知道了 branch ,並且明白了 branch 的具體含義以後,我就可以告訴你 push 到底是什麼了。

 

push:把 branch 上傳到遠端倉庫

實質上, push 做的事是:把當前 branch 的位置(即它指向哪個 commit )上傳到遠端倉庫,並把 它的路徑上的 commit s 一併上傳。

 

例如,我現在的本地倉庫有一個 master ,它超前了遠端倉庫兩個提交;另外還有一個新建的 branchfeature1 ,遠端倉庫還沒有記載過它。具體大概像這樣:

 

 

 

 

這時我執行 git push ,就會把 master 的最新位置更新到遠端,並且把它的路徑上的 5 6 兩個 commit s 上傳:

git push

 

 

 

而如果這時候我再切到 feature1 去後再執行一次 push ,就會把 feature1 以及它的 commit 4

上傳到遠端倉庫:

git checkout feature1
git push origin feature1

 

這里的 git push 和之前有點不同:多了 origin  feature1 這兩個引數。其中 origin 是 遠端倉庫的別名,是你在 git clone 的時候 Git 自動幫你起的; feature1 是遠端倉庫中目標 branch 的名字。這兩個引數合起來指定了你要 push 到的目標倉庫和目標分支,意思是 「我要 pushorigin 這個倉庫的 feature1 分支」。

 

在 Git 中(2.0 及它之後的版本),預設情況下,你用不加引數的 git push

只能上傳那些之 前從遠端 clone 下來或者 pull 下來的分支,而如果需要 push 你本地的自己建立的分支,則需要手動指定目標倉庫和目標分支(並且目標分支的名稱必須和本地分支完全相同), 就像上面這樣。

 

你可以通過 git config 指令來設定 push.default 的值來改變 push 的行為邏輯,例如 可以設定為「所有分支都可以用 git push 來直接 push,目標自動指向 origin 倉庫的同 名分支」(對應的 push.default 值: current ),或者別的什麼行為邏輯,你甚至可以設 置為每次執行 git push 時就自動把所有本地分支全部同步到遠端倉庫(雖然這可能有點耗 時和危險)。如果希望詳細了解,你可以到這里看看。

 

 

 

 

細心的人可能會發現,在 feature1push 時,遠端倉庫的 HEAD 並沒有和本地倉庫的 HEAD 一樣指向 feature1 。這是因為, push 的時候只會上傳當前的 branch 的指向,並不會把本地的 HEAD 的指向也一起上傳到遠端倉庫。事實上,遠端倉庫的 HEAD 是永遠指向它的預設分支(即 master,如果不修改它的名稱的話),並會隨著預設分支的移動而移動的。

 

小結

這一節介紹了 push這個指令的本質。總結一下關鍵點: 

  1. push 是把當前的分支上傳到遠端倉庫,並把這個 branch 的路徑上的所有 commit s 也一併 上傳。
  2. push 的時候,如果當前分支是一個本地建立的分支,需要指定遠端倉庫名和分支名,用 git push origin branch_name 的格式,而不能只用 git push ;或者可以通過 git config 修改 push.default 來改變 push 時的行為邏輯。
  3. push 的時候之後上傳當前分支,並不會上傳 HEAD ;遠端倉庫的 HEAD 是永遠指向預設分支 (即 master )的。