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 fetch
和git 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
,这就是两者的区别。
此处评论已关闭