Git詳解——push
push 的本質
在之前的內容里,我粗略地說過, push 指令做的事是把你的本地提交上傳到中央倉庫去,用本地的內容來覆蓋掉遠端的內容。這個說法其實是不夠準確的,但 Git 的知識系統比較龐大,在你對 Git 了 解比較少的時候,用「上傳本地提交」來解釋會比較好理解;而在你知道了 branch ,並且明白了 branch 的具體含義以後,我就可以告訴你 push 到底是什麼了。
push:把 branch 上傳到遠端倉庫
實質上, push 做的事是:把當前 branch 的位置(即它指向哪個 commit )上傳到遠端倉庫,並把 它的路徑上的 commit s 一併上傳。
例如,我現在的本地倉庫有一個 master ,它超前了遠端倉庫兩個提交;另外還有一個新建的 branch 叫 feature1 ,遠端倉庫還沒有記載過它。具體大概像這樣:
這時我執行 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 到的目標倉庫和目標分支,意思是 「我要 push 到 origin 這個倉庫的 feature1 分支」。
在 Git 中(2.0 及它之後的版本),預設情況下,你用不加引數的 git push
你可以通過 git config 指令來設定 push.default 的值來改變 push 的行為邏輯,例如 可以設定為「所有分支都可以用 git push 來直接 push,目標自動指向 origin 倉庫的同 名分支」(對應的 push.default 值: current ),或者別的什麼行為邏輯,你甚至可以設 置為每次執行 git push 時就自動把所有本地分支全部同步到遠端倉庫(雖然這可能有點耗 時和危險)。如果希望詳細了解,你可以到這里看看。
細心的人可能會發現,在 feature1 被 push 時,遠端倉庫的 HEAD 並沒有和本地倉庫的 HEAD 一樣指向 feature1 。這是因為, push 的時候只會上傳當前的 branch 的指向,並不會把本地的 HEAD 的指向也一起上傳到遠端倉庫。事實上,遠端倉庫的 HEAD 是永遠指向它的預設分支(即 master,如果不修改它的名稱的話),並會隨著預設分支的移動而移動的。
小結
這一節介紹了 push這個指令的本質。總結一下關鍵點:
- push 是把當前的分支上傳到遠端倉庫,並把這個 branch 的路徑上的所有 commit s 也一併 上傳。
- push 的時候,如果當前分支是一個本地建立的分支,需要指定遠端倉庫名和分支名,用 git push origin branch_name 的格式,而不能只用 git push ;或者可以通過 git config 修改 push.default 來改變 push 時的行為邏輯。
- push 的時候之後上傳當前分支,並不會上傳 HEAD ;遠端倉庫的 HEAD 是永遠指向預設分支 (即 master )的。