zoukankan      html  css  js  c++  java
  • 12.GIT多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin.
    
    查看远程库的信息
    $ git remote
    origin
    
    $ git remote -v
    origin  https://github.com/apollo1616/test.git (fetch)
    origin  https://github.com/apollo1616/test.git (push)
    # 上面显示了可以抓取和推送的origin的地址.如果没有推送权限,就看不到push的地址.
    

    1 推送分支

    推送分支,就是把该分支上的所有本地提交推送到远程库.推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
    $ git push origin master
    
    如果要推送其他分支,比如dev,就改成:
    $ git push origin dev
    
    但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
    master分支是主分支,因此要时刻与远程同步;
    dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发.
    总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
    

    2 抓取分支

    多人协作时,大家都会往master和dev分支上推送各自的修改.
    现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆:
    
    $ git clone git@github.com:triaquae/gitskills.git
    Cloning into 'gitskills'...
    remote: Counting objects: 16, done.
    remote: Compressing objects: 100% (7/7), done.
    remote: Total 16 (delta 0), reused 10 (delta 0), pack-reused 0
    Receiving objects: 100% (16/16), done.
    Checking connectivity... done.
    
    当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看:
    $ git branch
    * master
    
    现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
    $ git checkout -b dev origin/dev
    
    现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
    $ git add .
    $ git commit -m "small updates"
     
    [dev f1b762e] small updates
     2 files changed, 5 insertions(+), 1 deletion(-)
    Alexs-MacBook-Pro:gitskills alex$ git push origin dev
    Counting objects: 4, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (4/4), 438 bytes | 0 bytes/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    To git@github.com:triaquae/gitskills.git
       33ec6b4..f1b762e  dev -> dev
    
    你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
    $ git add .
    $ git commit -m "add Dog class"
    [dev 7e7b1bf] add Dog class
     2 files changed, 7 insertions(+)
     
     
    $ git push origin dev
     
    To git@github.com:triaquae/gitskills.git
     ! [rejected]        dev -> dev (fetch first)
    error: failed to push some refs to 'git@github.com:triaquae/gitskills.git'
    hint: Updates were rejected because the remote contains work that you do
    hint: not have locally. This is usually caused by another repository pushing
    hint: to the same ref. You may want to first integrate the remote changes
    hint: (e.g., 'git pull ...') before pushing again. #提示你了,先把远程最新的拉下来再提交你的
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    
    推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推
    $ git pull
    remote: Counting objects: 4, done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
    Unpacking objects: 100% (4/4), done.
    From github.com:triaquae/gitskills
       33ec6b4..f1b762e  dev        -> origin/dev
    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
    
    git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
    $ git branch --set-upstream-to=origin/dev dev
    Branch dev set up to track remote branch dev from origin.
    
    再pull:
    $ git pull
    Auto-merging hello.py
    CONFLICT (content): Merge conflict in hello.py
    Auto-merging branch_test.md
    CONFLICT (content): Merge conflict in branch_test.md
    Automatic merge failed; fix conflicts and then commit the result.
    
    这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:  
    $ git add .
    $ git commit -m "merge & fix hello.py"
    [dev 93e28e3] merge & fix hello.py
     
    $ git push origin dev
     
    Counting objects: 8, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (7/7), done.
    Writing objects: 100% (8/8), 819 bytes | 0 bytes/s, done.
    Total 8 (delta 1), reused 0 (delta 0)
    remote: Resolving deltas: 100% (1/1), done.
    To git@github.com:triaquae/gitskills.git
       f1b762e..93e28e3  dev -> dev
    
    因此,多人协作的工作模式通常是这样:
    首先,可以试图用git push origin branch-name推送自己的修改;
    	如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    	如果合并有冲突,则解决冲突,并在本地提交;
        没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建.
    	执行命令: git branch --set-upstream branch-name origin/branch-name。
    这就是多人协作的工作模式,一旦熟悉了,就非常简单.
    
  • 相关阅读:
    jQuery制作焦点图(轮播图)
    mysql 存储引擎的选择
    linux 系统操作
    把网页转换成doc 格式的文件,方便用户下载PHP 方法
    多年级勾选
    zend studio 破解
    win7下安装Linux实现双系统全攻略
    【Linux】Linux中常用操作命令
    PHP xmapp 下面安装 Composer-Setup.exe
    ecshop中smarty比较操作符(eq,ne,neq)含义
  • 原文地址:https://www.cnblogs.com/apollo1616/p/10440340.html
Copyright © 2011-2022 走看看