目錄
1. git clone 復制遠程倉庫
2. git fetch 更新遠程分支
2.1拉取指定的遠程倉庫分支
2.2 git fetch origin <source>:<destination> 指定分支進行操作
3. git pull 來拉取遠程最新的分支寒跳,并與本地的分支合并(組合命令)
3.1 git pull 相當于fetch和merge
3.2 git pull --rebase 相當于fetch和rebase
3.3 上文git fetch能用的git fetch origin <source>:<destination>可以同規(guī)律適用于git pull
4. git push 的操作同時會更新遠程倉庫分支和本地倉庫的遠程分支
4.1 git push <remote> <place>將指定本地分支提交到遠程倉庫的同名分支
4.2 git push origin <source>:<destination> 將指定本地分支提交到遠程倉庫的不同名分支
5. 關聯(lián)遠程的分支
6. 簡單案例
1.git clone 復制遠程倉庫
你可能注意到的第一個事就是在我們的本地倉庫多了一個名為 o/master 的分支, 這種類型的分支就叫遠程分支绣的。由于遠程分支的特性導致其擁有一些特殊屬性。
順帶一提浅悉,git clone會為遠程倉庫中每個分支在本地倉庫創(chuàng)建一個遠程分支和一個關聯(lián)的分支屹蚊。(詳情請看5.關聯(lián)遠程的分支)
遠程分支反映了遠程倉庫(在你上次和它通信時)的狀態(tài)讹开。這會有助于你理解本地的工作與公共工作的差別 —— 這是你與別人分享工作成果前至關重要的一步.
遠程分支有一個命名規(guī)范 —— 它們的格式是:
<remote name>/<branch name>
因此绳瘟,如果你看到一個名為 o/master 的分支,那么這個分支就叫 master而叼,遠程倉庫的名稱就是 o身笤。
當你用 git clone 某個倉庫時,Git 已經(jīng)會幫你把遠程倉庫的名稱設置為 origin 了葵陵。(這邊的網(wǎng)站為了方便液荸,設置成了o)
遠程分支有一個特別的屬性,在你檢出時自動進入分離 HEAD 狀態(tài)脱篙。Git 這么做是出于不能直接在這些分支上進行操作的原因, 你必須在別的地方完成你的工作, (更新了遠程分支之后)再用遠程分享你的工作成果娇钱。
o/master 只有在遠程倉庫中相應的分支更新了以后才會更新。
2. git fetch 更新遠程分支
git fetch 實際上將本地倉庫中的遠程分支更新成了遠程倉庫相應分支最新的狀態(tài)绊困。
git fetch 完成了僅有的但是很重要的兩步:
從遠程倉庫下載本地倉庫中缺失的提交記錄
更新遠程分支指針(如 o/master)
遠程分支反映了遠程倉庫在你最后一次與它通信時的狀態(tài)文搂,git fetch 就是你與遠程倉庫通信的方式了!
特別注意:如果git fetch 后面沒有任何參數(shù)秤朗,會下載所有的提交記錄到各個遠程分支(如果你遠程倉庫里有多個分支的話煤蹭,各個分支都會下載)
git fetch 并不會改變你本地倉庫的狀態(tài)。它不會更新你的 master 分支取视,也不會修改你磁盤上的文件硝皂。
所以, 你可以將 git fetch 的理解為單純的下載操作。
2.1拉取指定的遠程倉庫分支
git fetch origin foo
2.2 git fetch origin <source>:<destination> 指定分支進行操作
因為要拉取作谭,這邊的source是遠程倉庫分支(注意區(qū)別本地倉庫的遠程分支)稽物,destination是本地倉庫的分支
將遠程倉庫分支foo的上一個節(jié)點拉取到本地倉庫的bar分支,如果bar分支不存在折欠,會創(chuàng)建一個
git fetch origin foo~1:bar
在本地創(chuàng)建一個新的分支贝或,不建議用,不如直接用 git branch bar 或者git checkout -b bar
git fetch origin :bar
3.git pull 來拉取遠程最新的分支锐秦,并與本地的分支合并(組合命令)
上面我們提到咪奖,git fetch只改變了本地倉庫的遠程分支,那么如果想要 master與o/master合并农猬,怎么辦呢赡艰?
又或者,遠程倉庫的master分支已經(jīng)超過了本地遠程分支(o/master)的進度斤葱,這個時候我們執(zhí)行git push會失敗慷垮,因為本地沒有拉取遠程倉庫最新的更新。
我們需要先fetch來揍堕。然后又因為在本地的master上有提交料身,我們需要將這個master和o/master合并。這樣我們才會被允許提交
3.1 git pull 相當于fetch和merge
git pull 相當于下面這兩個操作
git fetch
git merge o/master
3.2 git pull --rebase 相當于fetch和rebase
3.3 上文git fetch能用的git fetch origin <source>:<destination>可以同規(guī)律適用于git pull
舉個例子:
4.git push 的操作同時會更新遠程倉庫分支和本地倉庫的遠程分支
4.1 git push <remote> <place>將指定本地分支提交到遠程倉庫的同名分支
git push <remote> <place>
比如:git push origin master
把這個命令翻譯過來就是:
切到本地倉庫中的“master”分支衩茸,獲取所有的提交芹血,再到遠程倉庫“origin”中找到“master”分支,將遠程倉庫中沒有的提交記錄都添加上去楞慈,搞定之后告訴我幔烛。
4.2git push origin <source>:<destination> 將指定本地分支提交到遠程倉庫的不同名分支
git push origin <source>:<destination>
如果destination指定的遠程倉庫分支不存在,會創(chuàng)建一個囊蓝。
如果source為空饿悬,形如git push origin :foo
會刪除遠程倉庫、本地遠程分支聚霜、本地倉庫的foo分支(全滅)
把foo分支的上一個提交push到遠程倉庫的master分支上
git push origin foo^:master
5. 關聯(lián)遠程的分支
Git 好像知道 master 與 o/master 是相關的狡恬。當然這些分支的名字是相似的,可能會讓你覺得是依此將遠程分支 master 和本地的 master 分支進行了關聯(lián)蝎宇。這種關聯(lián)在以下兩種情況下可以清楚地得到展示:
pull 操作時, 提交記錄會被先下載到 o/master 上弟劲,之后再合并到本地的 master 分支。隱含的合并目標由這個關聯(lián)確定的姥芥。
push 操作時, 我們把工作從 master 推到遠程倉庫中的 master 分支(同時會更新遠程分支 o/master) 兔乞。這個推送的目的地也是由這種關聯(lián)確定的!
可以用以下命令進行關聯(lián):
git branch -u o/master foo (這個foo必須已經(jīng)存在)
git checkout -b foo o/master (如果這個foo不存在凉唐,會創(chuàng)建一個)
可以用以下命令查看關聯(lián)關系:
git branch -vv
6.簡單案例:
如果你是在一個大的合作團隊中工作, 很可能是master被鎖定了, 遠程服務器拒絕直接推送(push)提交到master, 因為策略配置要求 pull requests 來提交更新.
不允許提交master分支报嵌,需要提交其他命名的分支。
你應該按照流程,新建一個分支feature, 推送到遠程服務器. 然后reset你的master分支和遠程服務器保持一致, 否則下次你pull并且他人的提交和你沖突的時候就會有問題.
git reset --hard o/master (master與遠程服務器保持一致)
git checkout -b feature c2 (創(chuàng)建一個新的分支feature熊榛,指向c2)
git push origin feature (把feature提交)
下圖左邊為最終結果锚国,右邊為初始狀態(tài)