Git多人协作
-
查看远程分支
$ git remote origin $ git remote -v #显示的信息更详细 origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的
origin
的地址。如果没有推送权限,就看不到push
的地址。 -
推送分支
推送时指定本地分支
$ git push origin master $ git push origin dev
master
是主分支,要时刻与远程同步dev
是开发分支,团队成员都要在上面工作,也需要与远程同步bug
分支只在本地修复bug
,没必要推送远程feature
分支是否推送,取决于你是否和你的小伙伴合作在上面开发
-
抓取分支
下面模拟一下你的小伙伴,另一台电脑(把
SSH Key
添加到GIT CODE
)或同一电脑的另一个目录下克隆:$ git clone git@gitcode.net:codechina/learngit.git
此时默认情况下只能看到本地的
master
分支,开发时需要创建远程origin
的dev
分支到本地,用以下命令:$ git checkout -b dev origin/dev
在
dev
上修改后即可将dev
分支push
到远程:$ git add env.txt $ git commit -m "add env" $ git push origin dev
你的小伙伴向
origin/dev
分支推送了提交,若此时你也对同样的文件做了修改并试图提交:$ cat env.txt $ git add env.txt $ git commit -m "Update env.txt" $ git push origin dev ! [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. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
推送失败,与你小伙伴的提交有冲突:先用
git pull
把最新的提交从origin/dev
抓下来,在本地合并解决冲突后再推送:$ git pull There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
没有指定本地
dev
分支与远程origin/dev
分支的链接,根据提示设置dev
和origin/dev
的链接:$ git branch --set-upstream-to=origin/dev dev $ git pull
此时推送成功,但是合并会有冲突,要手动解决(解决方法和分支管理中的解决冲突完全一样)。解决后再提交,再
push
:$ git commit -m "fix env conflict" $ git push origin dev
-
多人协作小结
多人协作的工作模式通常为:
- 用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,要先用
git push
试图合并; - 合并出现冲突,解决冲突并在本地提交
- 用
git push origin <branch-name>
推送即可成功
如果
git pull
提示no tracking information
,说明本地分支与远程分支没有创建链接关系使用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
. - 用
-
git rebase
在上面多人在同一分支协作时,经常需要解决冲突,最终导致分支会很乱,如下:
$ git log --graph --pretty=oneline --abbrev-commit * f4e7ea8 (HEAD -> master) Merge branch 'dev' into master |\ | * ad728db (origin/dev, dev) fix env conflict | |\ | | * d7e6866 Update env.txt | * | 770ce3f new env | |/ | * 34bde7f add env | * 0944c8c fix bug 101 * | b003293 (origin/master) merged bug fix 101 |\ \ | * | 8842ff5 (issue-101) fix bug 101 |/ / * | fc76cf7 merge with no-ff |\| | * c7b409a add merge |/ * fb8b190 conflict fixed
而
rebase
的操作则可以将这些分叉的提交变成直线$ git rebase
然后用
git log
查看就发现分叉的提交变成直线了,最终的提交结果不会发生改变,但是会修改本地的分叉提交。推送到远程之后,查看效果也是一条直线。$ git push origin master $ git log --graph --pretty=oneline --abbrev-commit
以上就是
rebase
的详细介绍了,现在让我们来回顾一下:- rebase操作可以把本地未
push
的分叉提交历史整理成直线 - rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
- rebase操作可以把本地未