git和svn不同,没有一个中央服务器用于存放代码,作为一个分布式的版本控制工具,每台主机都是一个仓库。

如果多个人之间要分享代码,就需要一台远程的仓库协助完成,git中通过git remote指令来完成这些操作。

使用git remote -v可以看到所有的远程主机:

> git remote -v
origin    git@github.com:maqianos/gitstudy.git (fetch)
origin    git@github.com:maqianos/gitstudy.git (push)

一、添加远程仓库

添加远程仓库使用git remote add命令完成,命令格式为:

git remote add 远程仓库名 仓库地址

其中远程仓库名是任意的别名,以后要通过这个别名区分不同的远程仓库(一个仓库可能有多个不同的远程仓库),一般情况下这个名字会使用origin

1.1 使用示例

首先在github上创建一个仓库https://github.com/maqianos/gitstudy备用,然后在本地通过git init初始化一个仓库:

> mkdir study
> cd study/
> git init
Initialized empty Git repository in /data/git/study/.git/
> git remote -v # 此时还没有设置远程仓库
>

添加远程github仓库地址:

# 仓库地址git@github.com:maqianos/gitstudy.git
> git remote add origin git@github.com:maqianos/gitstudy.git
> git remote -v
origin    git@github.com:maqianos/gitstudy.git (fetch)
origin    git@github.com:maqianos/gitstudy.git (push)

二、从远程拉取代码

在远程更新代码可以通过git fetchgit pull完成,两者的用法:

git fetch/pull origin master # origin是远程仓库名,master是分支名。

git fetch只会从远程拉取更改到本地,不会合并分支,git pull除了拉取更新以外还要更新,具体的区别下面再讲。

这里先使用git pull拉取代码,它相当于svn中的checkout:

> git pull origin master
From github.com:maqianos/gitstudy
 * branch            master     -> FETCH_HEAD

一个可选操作是设置默认的远程仓库和分支,这样可以避免每次拉取都要输入git pull origin master

# 绑定当前分支和远程分支,以后输入git pull即可拉取,不需要再加origin master
> git branch --set-upstream-to=origin/master
Branch ''master'' set up to track remote branch ''master'' from ''origin''.

以后使用git pull即可默认拉取的仓库和分支。

三、推送代码

推送代码到远程使用git push,用法为:

git push origin master # origin是远程仓库名,master是分支。

创建更改并推送到远程:

> echo "HelloWorld" >> README.md  # 创建修改
# 提交更改到本地仓库
> git status -s
 M README.md
> git add README.md  
> git commit -m ''[UPDATE] README.md''
[master 0fc1fe3] [UPDATE] README.md
 1 file changed, 1 insertion(+)
# 推送的远程分支
> git push -u origin master
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 333 bytes | 333.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:maqianos/gitstudy.git
   46d75a2..0fc1fe3  master -> master
Branch ''master'' set up to track remote branch ''master'' from ''origin''.

加上-u选项的意思是以后默认推送到origin master,不用再手动指定推送到的远程主机和分支,直接git push即可。

推送过去后在github中就可以看到更改了:

四、删除远程仓库

删除远程仓库使用git remote rm 远程仓库名

> git remote rm origin
> git remote -v
# 已经没有远程仓库了

五、fetch和pull区别

重新创建一个本地仓库并绑定远程仓库,然后使用git fetch

> git init
Initialized empty Git repository in /data/git/study2/.git/
> git remote add origin git@github.com:maqianos/gitstudy.git
> git fetch
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (9/9), done.
From github.com:maqianos/gitstudy
 * [new branch]      master     -> origin/master

此时远程的代码库就已经更新到本地了,但是使用ls命令查看发现并没有文件,查看分支也只有一个远程的remotes/origin/master

> ll
total 0
> git branch -av
  remotes/origin/master 0fc1fe3 [UPDATE] README.md

出现这个问题的原因在于fetch不会自动merge远程分支到本地,而远程的master和本地master并不是一个分支,需要自己手动merge把远程分支和本地合并。

而初始时本地也没有分支,需要先创建一个:

> git co -b master # 创建一个分支并切换到该分支
Branch ''master'' set up to track remote branch ''master'' from ''origin''.
Already on ''master''
> ll
total 8
-rw-r--r--. 1 work root 17 May 24 16:55 master.md
-rw-r--r--. 1 work root 39 May 24 16:55 README.md
> git branch -av # 分支
* master                0fc1fe3 [UPDATE] README.md
  remotes/origin/master 0fc1fe3 [UPDATE] README.md

如上所是,在切换到分支过后已经把远程分支的内容同步到了本地。这里地本地master分支在远程仓库的fetch之后创建,创建本地master时git会自动把本地master和远程master绑定,此时的master和远程master版本一致。但是如果先创建了master然后fetch则需要手动合并。

再创建一个本地库:

> git init
Initialized empty Git repository in /data/git/study3/.git/
> git remote add origin git@github.com:maqianos/gitstudy.git
> git co -b master # 创建本地分支
Switched to a new branch ''master''
> git fetch origin master # 获取更新
From github.com:maqianos/gitstudy
 * branch            master     -> FETCH_HEAD
> ll # fetch之后本地并没有文件
total 0

fetch之后本地并没有文件,原因在于本地分支和远程分支相互独立,此时需要手动合并远程分支到本地分支:

> git merge origin/master # 合并远程分支
> git branch -av # 查看所有分支
* master                0fc1fe3 [UPDATE] README.md
  remotes/origin/master 0fc1fe3 [UPDATE] README.md
> ll # 文件出来了
total 8
-rw-r--r--. 1 work root 17 May 24 17:02 master.md
-rw-r--r--. 1 work root 39 May 24 17:02 README.md

可以看到,使用fetch更新代码一共有两个操作,一个是更新,一个是合并。而pull则是把这两个操作合并,自动帮我们完成,即pull=fetch+merge,这就是两者的区别。

最后修改:2018 年 12 月 16 日
如果觉得我的文章对你有用,请随意赞赏