在本地上,我们虽然创建了一个仓库,但是我们无法进行协作,所以我们使用远程仓库来进行同步,这样远程仓库既可以作为备份,也可以与其他人进行协作
创建远程仓库
远程仓库最出名的就是github了,我们首先创建一个github
github提醒我们,既可以创建一个新的存储库,也可以推送现有的存储库
现在我们先推送本地上的git仓库
直接根据提示,推送现有的本体存储库
$: git remote add origin https://github.com/Wlgls/learngit.git
$: git push -u origin master
对象计数中: 37, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (15/15), 完成.
写入对象中: 100% (37/37), 2.85 KiB | 324.00 KiB/s, 完成.
Total 37 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/Wlgls/learngit.git
* [new branch] master -> master
分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'。
将本地库中的内容推送到远程,使用的是git push
命令,实际上就是把当前分支master
推送到远程
在第一次推送的时候,因为远程库是空的,所以我们第一次推送的时候,加上-u
参数,git不但会把本地master
分支内容推送到远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取简化命令
现在github页面中就有了内容而且和本地仓库内容一致
此时我们就可以使用git push origin master
命令把master
分支的最新修改推送到github了。
从0开始的远程仓库
我们首先创建了一个新的仓库,可以命名为’gittest`
然后我们就可以使用git clone
命令来克隆一个本地库了
$: git clone https://github.com/Wlgls/gittest.git
正克隆到 'gittest'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
你可以进入gittest
仓库查看一下
$: cd gittest
$: ls
README.md
需要注意的是,我们在克隆github仓库的时候还可以使用git://github.com/Wlgls/gittest.git
,而且似乎速度更快一些。(以后尝试)
取消与远程仓库的关联
有些时候,我们因某些原因,将远程仓库改变了,所以需要取消与当前远程仓库的关联,使用git remote
来观察远程仓库。
然后使用git remote remove [name]
来取消关联
$:~/Data/homework$ git remote
kkk
origin
$:~/Data/homework$ git remote remove kkk
$:~/Data/homework$ git remote
origin
多人协作
使用远程仓库的一个原因是备份,另一个原因就是为了多人协作
查看远程仓库的信息
当我们从远程仓库克隆的时候,实际上git自动把本地的master
分支与远程的master
分支对应了起来,并且远程仓库的默认名称是origin
我们可以使用git remote
来查看远程仓库的信息
$: git remote
origin
我们可以使用带有参数-v
的git remote
来显示更为详细的信息:
$: git remote -v
origin https://github.com/Wlgls/learngit.git (fetch)
origin https://github.com/Wlgls/learngit.git (push)
推送分支
我们使用git push
推送分支,这时候会默认推送master
分支都推送到远程库。
我们我们要指定分支的话,就可以使用git push origin <name>
$: git push origin dev
抓取分支
多人协作时,大家都会往dev
和master
上推送自己的修改
我们在另一台电脑上克隆了远程库(我们在这里可以在同一个电脑上的不同目录)
$: git clone https://github.com/Wlgls/learngit.git mygit
正克隆到 'mygit'...
remote: Enumerating objects: 37, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 37 (delta 5), reused 37 (delta 5), pack-reused 0
展开对象中: 100% (37/37), 完成.
当我们从远程库中clone
时,默认是只能看到master
分支的。可以使用git branch
检查一下
如果我们需要在dev
分支上进行开发,就必须创建远程origin
和dev
分支到本地,所以我们可以使用一下命令来创建本地dev
分支
$: git checkout -b dev origin/dev
如果你遇到了错误fatal: 'origin/dev' 不是一个提交,不能基于它创建分支 'dev'
请先进入learngit
目录推送dev
分支,即使用git push origin dev
然后进入mygit
目录,首先使用git pull
拉取,然后再次使用git checkout -b dev origin/dev
即可
现在我们就可以继续在dev
上修改了,然后是不是的将dev
分支push
到远程
$: cd mygit
$: touch env.txt
$: echo "hello git" >> env.txt
$: git add env.txt
$: git commit -m "add env"
[dev 1b95ed3] add env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$: git push origin dev
对象计数中: 3, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 304 bytes | 304.00 KiB/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/Wlgls/learngit.git
112a8f5..1b95ed3 dev -> dev
这时候github就会有提示说我们推送了一个dev
分支,但是github没有显示内容
解决冲突
这时候,如果其他人来推送了自己的dev
分支
$: cd ../learngit
$: touch env.txt
$: echo "helloworld" >> env.txt
$: git add env.txt
$: git commit -m "add env"
$: git push origin dev
To https://github.com/Wlgls/learngit.git
! [rejected] dev -> dev (fetch first)
error: 无法推送一些引用到 'https://github.com/Wlgls/learngit.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
这个时候,就会因为冲突问题而导致无法提交
解决冲突也很简单,只要先用git pull
把最新的提交从origin/dev
抓下来,然后在本地合并,解决冲突,在推送就好了。
$: git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 完成.
来自 https://github.com/Wlgls/learngit
112a8f5..1b95ed3 dev -> origin/dev
当前分支没有跟踪信息。
请指定您要合并哪一个分支。
详见 git-pull(1)。
git pull <远程> <分支>
如果您想要为此分支创建跟踪信息,您可以执行:
git branch --set-upstream-to=origin/<分支> dev
但是拉取失败了,原因是没有指定dev
分支和远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接
$: git branch --set-upstream-to=origin/dev dev
分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。
现在就可以git pull
了
$: git pull
自动合并 env.txt
冲突(添加/添加):合并冲突于 env.txt
自动合并失败,修正冲突然后提交修正的结果。
现在就可以手动解决冲突了,这在前文中提及了,就不做演示了
$: vim env.txt
$: cat env.txt
$: git add env.txt
$: git commit -m "fix env conflict"
$: git push origin dev
对象计数中: 4, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (4/4), 486 bytes | 486.00 KiB/s, 完成.
Total 4 (delta 0), reused 0 (delta 0)
To https://github.com/Wlgls/learngit.git
1b95ed3..2b5575e dev -> dev