本地git关联远程仓库
关联一个远程仓库使用命令: git remote add origin git@xxx/xxx.git
关联后,使用命令 git push -u origin master 第一次推送master 分支的所有内容
此后,本次本地提交后,只要有必要就可以使用命令 git push origin master 推送最新修改。
如果从远程仓库克隆时,实际上git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称为origin.
要查看远程仓库的信息:git remote
$ git remote
origin
显示更详细的信息:git remote -v
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址
推送分支
把本地仓库内容推送到远程,用git push命令,实际上是把当前分支推送到远程仓库对应的分支。
由于远程库是空的,我们第一次推送master分支时,加上-u 参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送分支就是把分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样git就会把该分支推送到远程库对应的远程分支上。
git push origin master
如果要推送其他分支,比如dev,就修改成
git push origin dev
ps: 并不一定要把本地分支往远程推送,一般那些需要推送?
mater分支:该分支为主分支,因此要时刻与远程同步
dev分支:该分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步。
抓取分支
多人协作开发时,大家都会向master和dev分支上推送各自的修改。
实例:
模拟一个你的小伙伴,可以在另一台电脑(主要要把SSH Key添加到GitHud)或者同一台电脑的另一个目录下克隆
$ git clone git@github.com:michaelliao/learngit.git
Cloning into 'learngit'...
...
Receiving objects: 100% (46/46), 15.69 KiB | 6 KiB/s, done.
Resolving deltas: 100% (16/16), done.
当小伙伴从远程库clone时,默认情况下,小伙伴只能看到本地的master分支。
$git branch
*master
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,使用如下命令:
$git checkout -b dev origin/dev
这样,他就可以在dev 分支上继续修改,并且可以时不时把dev分支push远程
多人开发冲突
当你的小伙伴已经向origin/dev分支推送了他的请求,而碰巧,你也对同样的文件做了修改,并试图推送。
$ git add hello.py
$ git commit -m "add coding: utf-8"
[dev bd6ae48] add coding: utf-8
1 file changed, 1 insertion(+)
$ git push origin dev
To git@github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
这时你发现你的提交和小伙伴的最新提交有冲突,解决办法也很简单,git已经提示我们先用git pull 把最新的提交从origin/dev 抓下来,然后手动解决冲突(详见git的工作流章节),冲突解决后再进行推送。
如果git pull也失败了,原因是没有指定本地dev分支域远程的origin/dev分支的连接,根据提示,设置dev和origin/dev链接
$git pull 失败并提示
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream dev origin/<branch>
将本地dev分支与远程origin/dev分支的链接关联
$ git branch --set-upstream dev origin/dev
Branch dev set up to track remote branch dev from origin.
分支关联后再次进行拉取
$ git pull
Auto-merging hello.py
CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中解决冲突完全一样。解决后,提交,在push
$ git commit -m "merge & fix hello.py"
[dev adca45d] merge & fix hello.py
$ git push origin dev
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 747 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
291bea8..adca45d dev -> dev
多人协作的工作模式
首先可以试图用 git push origin brach-name推送自己的修改
如果推送失败,则是因为远程分支比你本地更新,需要先用git pull试图合并
如果合并有冲突,则解决冲突,并在本地提交。
如果没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就可以成功
如果 git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name
总结
查看远程库,使用 git remote [-v]
本地新建的分支如果不推送到远程,其他人就是不可见的
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的最新提交。
在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name。本地和远程分支的名称最好一致。
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
从远程抓取分支,使用git pull ,如果有冲突,要先处理冲突