遠(yuǎn)程倉庫是指托管在網(wǎng)絡(luò)上的項(xiàng)目倉庫斑响,可能會(huì)有好多個(gè)菱属,其中有些你只能讀,另外有些可以寫舰罚。同他人協(xié)作開發(fā)某個(gè)項(xiàng)目時(shí)纽门,需要管理這些遠(yuǎn)程倉庫,以便推送或拉取數(shù)據(jù)营罢,分享各自的工作進(jìn)展膜毁。常用對(duì)倉庫的操作:
- git clone
- git remote
- git fetch
- git pull
- git push
clone
克隆遠(yuǎn)程倉庫
git clone
從遠(yuǎn)程主機(jī)克隆一個(gè)版本庫, 該命令會(huì)在本地主機(jī)生成一個(gè)目錄,與遠(yuǎn)程主機(jī)的版本庫同名愤钾。如果要指定不同的目錄名瘟滨,可以將目錄名作為git clone
命令的第二個(gè)參數(shù)。
# 克隆git倉庫
# git clone <版本庫的網(wǎng)址>
$ git clone https://github.com/git/git.git
# 克隆指定目錄(yjd_git)
# git clone <版本庫的網(wǎng)址> <本地目錄名>
$ git clone https://github.com/git/git.git yjd_git
remote
查看遠(yuǎn)程倉庫
git remote
它會(huì)列出每個(gè)遠(yuǎn)程倉庫的簡(jiǎn)短名字能颁,克隆完某個(gè)項(xiàng)目后杂瘸,至少可以看到一個(gè)名為 origin 的遠(yuǎn)程倉庫,Git 默認(rèn)使用這個(gè)名字來標(biāo)識(shí)你所克隆的原始倉庫伙菊。
# 查看簡(jiǎn)短名字
$ git remote
origin
# 查看詳細(xì)信息
$ git remote -v
origin git@github.com:JinduYin/test_git.git (fetch)
origin git@github.com:JinduYin/test_git.git (push)
添加遠(yuǎn)程倉庫
git remote add
添加一個(gè)新的遠(yuǎn)程倉庫败玉,可以指定一個(gè)簡(jiǎn)短的名字以便將來引用
# 添加遠(yuǎn)程倉庫
# git remote add <主機(jī)名> <網(wǎng)址>
# 新增test-yjd.git倉庫
$ git remote add tcjf git@gitServer:yjd48676/test-yjd.git
$ git remote -v
origin git@github.com:JinduYin/test_git.git (fetch)
origin git@github.com:JinduYin/test_git.git (push)
tcjf git@gitServer:yjd/test-yjd.git (fetch)
tcjf git@gitServer:yjd/test-yjd.git (push)
刪除遠(yuǎn)程倉庫
git remote rm
刪除遠(yuǎn)程倉庫
# 刪除遠(yuǎn)程倉庫
# git remote rm <主機(jī)名>
# 刪除tcjf倉庫
$ git remote rm tcjf
$ git remote -v
origin git@github.com:JinduYin/test_git.git (fetch)
origin git@github.com:JinduYin/test_git.git (push)
重命名遠(yuǎn)程倉庫
git remote rename
遠(yuǎn)程倉庫改名
# 重命名遠(yuǎn)程倉庫
# git remote rename <原主機(jī)名> <新主機(jī)名>
# 把origin改成test
$ git remote rename origin test
$ git remote -v
test git@github.com:JinduYin/test_git.git (fetch)
test git@github.com:JinduYin/test_git.git (push)
fetch
git fetch
將遠(yuǎn)程倉庫的版本庫有了更新(Git術(shù)語叫做commit)取回本地。
git fetch
命令通常用來查看其他人的進(jìn)程镜硕,因?yàn)樗』氐拇a對(duì)你本地的開發(fā)代碼沒有影響运翼。默認(rèn)情況下,git fetch
取回所有分支(branch)的更新兴枯。
git fetch
代碼同步到本地倉庫(其實(shí)是.git目錄下)不會(huì)對(duì)工作目錄有任何更改(肯定也不會(huì)在本地創(chuàng)建相應(yīng)的分支信息)血淌。從本地倉庫到工作目錄需要git merge
操作
# 將某個(gè)遠(yuǎn)程主機(jī)的更新,全部取回本地
$ git fetch <遠(yuǎn)程主機(jī)名>
$ git fetch <遠(yuǎn)程主機(jī)名> <分支名>
所取回的更新财剖,在本地主機(jī)上要用"遠(yuǎn)程主機(jī)名/分支名"的形式讀取悠夯。比如origin主機(jī)的master,就要用origin/master讀取躺坟。
# 取回本地沒有的分支
# fetch只是把代碼拖到本地庫沦补,并沒有創(chuàng)建本地沒有的分支
# 比如要獲取fetch后dev的分支
$ git checkout -b dev origin/dev
上面命令表示,在origin/master的基礎(chǔ)上咪橙,創(chuàng)建一個(gè)新分支夕膀。
此外虚倒,也可以使用git merge命令或者git rebase命令,在本地分支上合并遠(yuǎn)程分支产舞。
$ git merge origin/master
# 或者
$ git rebase origin/master
# 示例
# 更新代碼
$ git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
From github.com:JinduYin/test_git
* [new branch] dev -> origin/dev
# 查看本地分支
$ git branch
* master
# 查看遠(yuǎn)程
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/foo
remotes/origin/master
# 創(chuàng)建分支
$ git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
# 再查看本地分支
$ git branch
* dev
master
pull
git pull
取回遠(yuǎn)程主機(jī)某個(gè)分支的更新魂奥,再與本地的指定分支合并。
# git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
# 示例
# 取回origin主機(jī)的next分支庞瘸,與本地的master分支合并
$ git pull origin next:master
# 遠(yuǎn)程分支是與當(dāng)前分支合并捧弃,則冒號(hào)后面的部分可以省略赠叼。
$ git pull origin next
git pull
命令實(shí)際上相當(dāng)于執(zhí)行了兩條命令
$ git fetch origin
$ git merge origin/next
追蹤關(guān)系
git branch -vv
查看追蹤關(guān)系
$ git branch -vv
* dev deab1f9 [origin/dev] update
master 83428ce [origin/master] add e
在某些場(chǎng)合擦囊,Git會(huì)自動(dòng)在本地分支與遠(yuǎn)程分支之間,建立一種追蹤關(guān)系(tracking)嘴办。比如瞬场,在git clone的時(shí)候,所有本地分支默認(rèn)與遠(yuǎn)程主機(jī)的同名分支涧郊,建立追蹤關(guān)系贯被,也就是說,本地的master分支自動(dòng)"追蹤"origin/master分支妆艘。
Git也允許手動(dòng)建立追蹤關(guān)系彤灶。
git branch --set-upstream master origin/next
指定master分支追蹤origin/next分支
如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系,git pull就可以省略遠(yuǎn)程分支名批旺。
# 本地的當(dāng)前分支自動(dòng)與對(duì)應(yīng)的origin主機(jī)"追蹤分支"(remote-tracking branch)進(jìn)行合并
$ git pull origin
push
git push
命令用于將本地分支的更新幌陕,推送到遠(yuǎn)程主機(jī)。它的格式與git pull
命令相仿汽煮。
$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
注意:分支推送順序的寫法是<來源地>:<目的地>搏熄,所以git pull是<遠(yuǎn)程分支>:<本地分支>,而git push是<本地分支>:<遠(yuǎn)程分支>暇赤。
省略遠(yuǎn)程分支名心例,則表示將本地分支推送與之存在"追蹤關(guān)系"的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在鞋囊,則會(huì)被新建止后。
$ git push origin master
省略本地分支名,則表示刪除指定的遠(yuǎn)程分支溜腐,因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支
# 刪除遠(yuǎn)程分支
$ git push origin :dev
# 等同于
$ git push origin --delete dev
當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系坯门,則本地分支和遠(yuǎn)程分支都可以省略
$ git push origin
如果當(dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系,則可以使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī)逗扒,這樣后面就可以不加任何參數(shù)使用git push
$ git push -u origin master
上面命令將本地的master分支推送到origin主機(jī)古戴,同時(shí)指定origin為默認(rèn)主機(jī),后面就可以不加任何參數(shù)使用git push
了
不帶任何參數(shù)的git push
矩肩,默認(rèn)只推送當(dāng)前分支现恼,這叫做simple方式肃续。此外,還有一種matching方式叉袍,會(huì)推送所有有對(duì)應(yīng)的遠(yuǎn)程分支的本地分支始锚。Git 2.0版本之前,默認(rèn)采用matching方法喳逛,現(xiàn)在改為默認(rèn)采用simple方式瞧捌。如果要修改這個(gè)設(shè)置,可以采用git config
命令润文。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple