远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。常用对仓库的操作:
- git clone
- git remote
- git fetch
- git pull
- git push
clone
克隆远程仓库
git clone
从远程主机克隆一个版本库, 该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone
命令的第二个参数。
# 克隆git仓库
# git clone <版本库的网址>
$ git clone https://github.com/git/git.git
# 克隆指定目录(yjd_git)
# git clone <版本库的网址> <本地目录名>
$ git clone https://github.com/git/git.git yjd_git
remote
查看远程仓库
git remote
它会列出每个远程仓库的简短名字,克隆完某个项目后,至少可以看到一个名为 origin 的远程仓库,Git 默认使用这个名字来标识你所克隆的原始仓库。
# 查看简短名字
$ git remote
origin
# 查看详细信息
$ git remote -v
origin git@github.com:JinduYin/test_git.git (fetch)
origin git@github.com:JinduYin/test_git.git (push)
添加远程仓库
git remote add
添加一个新的远程仓库,可以指定一个简短的名字以便将来引用
# 添加远程仓库
# git remote add <主机名> <网址>
# 新增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)
删除远程仓库
git remote rm
删除远程仓库
# 删除远程仓库
# git remote rm <主机名>
# 删除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)
重命名远程仓库
git remote rename
远程仓库改名
# 重命名远程仓库
# git remote rename <原主机名> <新主机名>
# 把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
将远程仓库的版本库有了更新(Git术语叫做commit)取回本地。
git fetch
命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。默认情况下,git fetch
取回所有分支(branch)的更新。
git fetch
代码同步到本地仓库(其实是.git目录下)不会对工作目录有任何更改(肯定也不会在本地创建相应的分支信息)。从本地仓库到工作目录需要git merge
操作
# 将某个远程主机的更新,全部取回本地
$ git fetch <远程主机名>
$ git fetch <远程主机名> <分支名>
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
# 取回本地没有的分支
# fetch只是把代码拖到本地库,并没有创建本地没有的分支
# 比如要获取fetch后dev的分支
$ git checkout -b dev origin/dev
上面命令表示,在origin/master的基础上,创建一个新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
$ 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
# 查看远程
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/foo
remotes/origin/master
# 创建分支
$ 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
取回远程主机某个分支的更新,再与本地的指定分支合并。
# git pull <远程主机名> <远程分支名>:<本地分支名>
# 示例
# 取回origin主机的next分支,与本地的master分支合并
$ git pull origin next:master
# 远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
git pull
命令实际上相当于执行了两条命令
$ git fetch origin
$ git merge origin/next
追踪关系
git branch -vv
查看追踪关系
$ git branch -vv
* dev deab1f9 [origin/dev] update
master 83428ce [origin/master] add e
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
指定master分支追踪origin/next分支
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
# 本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并
$ git pull origin
push
git push
命令用于将本地分支的更新,推送到远程主机。它的格式与git pull
命令相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
注意:分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin master
省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
# 删除远程分支
$ git push origin :dev
# 等同于
$ git push origin --delete dev
当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
$ git push origin
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push
$ git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push
了
不带任何参数的git push
,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config
命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple