多人协作的工作模式通常是这样:
-
首先,可以试图用git push origin <branch-name>推送自己的修改;
-
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
-
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
-
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
-
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
我们模仿下多人在操作同一个远程分支造成的冲突问题:
开发A和开发B
我们先让开发A创建分支:
[root@VM-75-64 test]# git checkout -b dev
Switched to a new branch 'dev'
[root@VM-75-64 test]# git branch
* dev
master
[root@VM-75-64 test]# git push origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.75.64/root/origin-test/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To git@192.168.75.64:root/origin-test.git
* [new branch] dev -> dev
[root@VM-75-64 test]# git branch -r
origin/dev
origin/master
[root@VM-75-64 test]# git branch
* dev
master
开发B:
[root@VM-75-64 origin-test]# git pull #这里一定要pull,不然看不到远程dev分支
From 192.168.75.64:root/origin-test
* [new branch] dev -> origin/dev
Already up-to-date.
[root@VM-75-64 origin-test]# git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
此时开发B修改test文件
[root@VM-75-64 origin-test]# git checkout -b dev origin/dev #创建跟远程dev分支相同的本地dev分支,名字尽量相同
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'
[root@VM-75-64 origin-test]# vim test.txt
lalala
ni hao ya
another test
deploy test by B #添加修改内容
[root@VM-75-64 origin-test]# git add test.txt
[root@VM-75-64 origin-test]# git commit -m 'deploy test by B'
[dev b5f166b] deploy test by B
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 origin-test]# git push origin dev #推动到远程dev
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 318 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.75.64/root/origin-test/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To git@192.168.75.64:root/origin-test.git
68b1e43..b5f166b dev -> dev
此时开发A也开始修改test文件:
[root@VM-75-64 test]# vim test.txt
lalala
ni hao ya
another test
deploy test by A
[root@VM-75-64 test]# git add test.txt
[root@VM-75-64 test]# git commit -m 'deploy by A'
[dev 152475d] deploy by A
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]#
[root@VM-75-64 test]# git push origin dev #在推送到远程的时候报错了!
To git@192.168.75.64:root/origin-test.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@192.168.75.64:root/origin-test.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
####这里跟网上的报错实例不同,并没有提示该怎么操作~
####原因是此时远程dev分支高于你本次的修改,存在冲突
修复方法:
1:pull 最新远程分支到本地
[root@VM-75-64 test]# git pull origin dev
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From 192.168.75.64:root/origin-test
* branch dev -> FETCH_HEAD
Auto-merging test.txt #####here
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
此时会提示你具体的冲突文件!
手动解决冲突~编辑test.txt文件:
[root@VM-75-64 test]# cat test.txt
lalala
ni hao ya
another test
<<<<<<< HEAD
deploy test by A
=======
deploy test by B
>>>>>>> b5f166b16b314b9d2f102b990a19bb40c7a4728c #提示你冲突的位置
[root@VM-75-64 test]# vim test.txt
[root@VM-75-64 test]# cat test.txt
lalala
ni hao ya
another test
deploy test by A and B #这里是编辑的最终版
[root@VM-75-64 test]# git add test.txt
[root@VM-75-64 test]# git commit -m 'final test' #上传并提交
[dev 184bd71] final test
[root@VM-75-64 test]# git push origin dev #推送远程dev分支!成功!
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 627 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.75.64/root/origin-test/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To git@192.168.75.64:root/origin-test.git
b5f166b..184bd71 dev -> dev
以上就是常见的单个分支冲突的解决方法!
小结:
-
查看远程库信息,使用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 branch --set-upstream-to=origin/dev dev,这两条指令都可以)
-
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
以上,共勉!