从最简单的git使用场景学习git协同开发

从最简单的git使用场景学习git协同开发

引言

本文是一个初学者经过学习的一些总结,仅供大家参考。有什么问题随时欢迎大家指出,互相讨论,共同进步。

场景

团队合作完成一篇论文。假设有一位老师Alan,一位学生Mike。老师Alan负责修改学生Mike的论文并提出指导意见。学生Mike负责写论文并根据老师意见不断添加内容。

思路

先思考一个问题,一个好的规范是怎样的?master分支用于远程仓库中稳定版本发布,dev分支用于开发人员提交到远程仓库时一个开发版本的提交。具体说明如下:远程仓库可设两个分支master与dev。dev branch专门进行主要的开发,master branch作为存放稳定的release版本的分支。本地提交到dev分支前,可先pull远程仓库中的dev分支,进行冲突解决与合并后,再push到dev分支。本地的分支可以稍多一些:如feature分支作为新文件新功能的提交,bug分支用于快速修复bug。

操作与说明

part1 Alan完成仓库的初始化工作

  1. github 上新建名为gitLearn远程仓库,建好后是空的。(github官网

  2. 本地D盘新建两个文件夹Alan、Mike。模拟二人协同开发。

     mm@Lenovo-PC MINGW64 /d/gitFolder1/gitLearn
     $ mkdir Alan
     mm@Lenovo-PC MINGW64 /d/gitFolder1/gitLearn
     $ mkdir Mike
    
  3. Alan初始化本地库,命令如下,新建文档与实验的文件夹以及模板(新建过程略):

     $ git init
    

    新建的文件添加到暂存区:

     $ git add  report/lab.md
    

    进行第一次提交:

     $ git commit -m "the first version"
    
  4. Alan将本地库与第1步建好的远程库进行关联,git@github.com:NoraLigithub/gitLearn.git(该链接是作者的远程库链接你可以修改为自己的,在自己的github上查看新建的远程库找到该链接。)

     $ git remote add origin git@github.com:NoraLigithub/gitLearn.git
    

    本地添加dev分支

     $ git checkout -b dev
    

    dev分支修改文件建立文件夹(命令略,该部分可以新建一些文档代码模板等,注意新建的空文件夹不会push到远程仓库,若想push空文件夹请参考add an empty folder中提供的方法),下一步是将dev分支push到远程库中。以下命令的含义是建立远程分支origin dev并将本地dev分支push。具体可参考 git分支

     $ git push origin dev:dev
    

part2 Mike获取远程仓库开始自己的工作

  1. 直接获取远程仓库

     $ git clone git@github.com:NoraLigithub/gitLearn.git
    
  2. 这时候你查看一下分支会发现只有一个master分支,没有dev分支。这是需要你手动关联的。下一个命令就是创建一个dev分支并与远程仓库中的dev分支关联,回顾part1中创建分支并跳转的命令,你会发现多了origin/dev表示与远程库关联。再与part1的最后一个命令比较,他们是不一样的。

     $ git checkout -b dev origin/dev
    
  3. 完成自己的工作文档修改。这里建议Mike可以建立feature分支作为功能点的开发分支。同时可以在master分支中完成文档的结构完善,而在feature中完成细小功能点的添加。在这里完成的第一个feature是需求分析,取名为Requirement

     $git checkout -b Requirement
    
  4. 修改文档lab.md,可随时add与提交以确保工作的保存。(略)

  5. 修改工作告一段落准备将两个分支合并,返回dev分支后进行合并。如果出现冲突按照提示修改相关文件并提交即可。建议使用--no-ff参数进行合并,因为这样会有分支合并的记录。不加该参数则看不到分支合并的记录。

     $git branch dev
     $ git merge --no-ff -m "merge with no-ff" Requirement
    
  6. 终于完成修改工作了,Mike想把自己的工作push到远程库中。一个建议是Mike可以先进行pull再进行push,这样做的原因是可以在push前解决冲突。在该情境中Alan可能对之前的文档模板做了一些修改,而Mike自己也做了一些修改。以下命令的含义是pull远程库中的dev分支(不要只写pull,写清楚分支名)

     $ git pull origin dev
    

    如果有冲突解决之(解决的含义是手动修改冲突文件),接下来就可以愉快地push啦,同理要写清楚远程仓库的分支名

     $ git push origin dev
    

part3 Alan与Mike的进一步工作

  1. 每次开始工作前都可以pull一下dev分支,获取对方最新的工作进展,命令见上

             $ git fetch
             $ git pull origin dev
    
  2. 每次有新功能点开发都可以本地新建一个分支,该分支不push到远程仓库中

  3. Mike如果不小心关联错远程仓库或者他突然退学了不工作了,他应该如何移除本地仓库与远程仓库的连接呢?origin是我们之前起的名字。

             $ git remote remove origin
    
  4. 将当前分支与远程分支相关联的命令

             $ git branch --set-upstream-to=origin/master
    

一些补充

  1. 常见的查询状态命令:查看提交记录的命令

     $ git log
    

    查看工作区暂存区状态的命令

     $ git status
    

    查看分支情况的命令

     $ git branch
    
  2. 作者喜欢的git学习参考资料

  3. 多人合作大同小异,深入的学习可以参考作者给出的链接。这是我的第一篇技术博客,感谢阅读<( ̄︶ ̄)>。欢迎指出我的问题,互相交流,共同进步。

posted on 2016-03-11 09:13  NoraLi  阅读(619)  评论(0)    收藏  举报

导航

@font-face { font-family: octicons-anchor; src: url(data:font/woff;charset=utf-8;base64,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) format('woff'); } #cnblogs_post_body { margin: 20px 0; } .cnblogs-markdown { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; color: #333; overflow: hidden; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; font-size: 16px; line-height: 1.6; word-wrap: break-word; } .cnblogs-markdown a { background: transparent; } .cnblogs-markdown a:active, .cnblogs-markdown a:hover { outline: 0; } .cnblogs-markdown strong { font-weight: bold; } .cnblogs-markdown h1 { font-size: 2em; margin: 0.67em 0; } .cnblogs-markdown img { border: 0; } .cnblogs-markdown hr { box-sizing: content-box; height: 0; } .cnblogs-markdown pre { overflow: auto; } .cnblogs-markdown code, .cnblogs-markdown kbd, .cnblogs-markdown pre { font-family: monospace, monospace; font-size: 1em; } .cnblogs-markdown input { color: inherit; font: inherit; margin: 0; } .cnblogs-markdown html input[disabled] { cursor: default; } .cnblogs-markdown input { line-height: normal; } .cnblogs-markdown input[type="checkbox"] { box-sizing: border-box; padding: 0; } .cnblogs-markdown table { border-collapse: collapse; border-spacing: 0; } .cnblogs-markdown td, .cnblogs-markdown th { padding: 0; } .cnblogs-markdown * { box-sizing: border-box; } .cnblogs-markdown input { font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; } .cnblogs-markdown a { color: #4183c4; text-decoration: none; } .cnblogs-markdown a:hover, .cnblogs-markdown a:active { text-decoration: underline; } .cnblogs-markdown hr { height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #ddd; } .cnblogs-markdown hr:before { display: table; content: ""; } .cnblogs-markdown hr:after { display: table; clear: both; content: ""; } .cnblogs-markdown h1, .cnblogs-markdown h2, .cnblogs-markdown h3, .cnblogs-markdown h4, .cnblogs-markdown h5, .cnblogs-markdown h6 { margin-top: 15px; margin-bottom: 10px; line-height: 1.1; } .cnblogs-markdown blockquote { margin: 0; } .cnblogs-markdown ul, .cnblogs-markdown ol { padding: 0; margin-top: 0; margin-bottom: 0; } .cnblogs-markdown ol ol, .cnblogs-markdown ul ol { list-style-type: lower-roman; } .cnblogs-markdown ul ul ol, .cnblogs-markdown ul ol ol, .cnblogs-markdown ol ul ol, .cnblogs-markdown ol ol ol { list-style-type: lower-alpha; } .cnblogs-markdown dd { margin-left: 0; } .cnblogs-markdown code { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px; } .cnblogs-markdown pre { margin-top: 0; margin-bottom: 0; font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; } .cnblogs-markdown .octicon { font: normal normal normal 16px/1 octicons-anchor; display: inline-block; text-decoration: none; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .cnblogs-markdown .octicon-link:before { content: '\f05c'; } .cnblogs-markdown>*:first-child { margin-top: 0 !important; } .cnblogs-markdown>*:last-child { margin-bottom: 0 !important; } .cnblogs-markdown a:not(:link):not(:visited) { color: inherit; text-decoration: none; } .cnblogs-markdown .anchor { position: absolute; top: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30px; } .cnblogs-markdown .anchor:focus { outline: none; } .cnblogs-markdown h1, .cnblogs-markdown h2, .cnblogs-markdown h3, .cnblogs-markdown h4, .cnblogs-markdown h5, .cnblogs-markdown h6 { position: relative; margin-top: 1em; margin-bottom: 16px; font-weight: bold; line-height: 1.4; } .cnblogs-markdown h1 .octicon-link, .cnblogs-markdown h2 .octicon-link, .cnblogs-markdown h3 .octicon-link, .cnblogs-markdown h4 .octicon-link, .cnblogs-markdown h5 .octicon-link, .cnblogs-markdown h6 .octicon-link { display: none; color: #000; vertical-align: middle; } .cnblogs-markdown h1:hover .anchor, .cnblogs-markdown h2:hover .anchor, .cnblogs-markdown h3:hover .anchor, .cnblogs-markdown h4:hover .anchor, .cnblogs-markdown h5:hover .anchor, .cnblogs-markdown h6:hover .anchor { padding-left: 8px; margin-left: -30px; text-decoration: none; } .cnblogs-markdown h1:hover .anchor .octicon-link, .cnblogs-markdown h2:hover .anchor .octicon-link, .cnblogs-markdown h3:hover .anchor .octicon-link, .cnblogs-markdown h4:hover .anchor .octicon-link, .cnblogs-markdown h5:hover .anchor .octicon-link, .cnblogs-markdown h6:hover .anchor .octicon-link { display: inline-block; } .cnblogs-markdown h1 { padding-bottom: 0.3em; font-size: 2.25em !important; line-height: 1.2; border-bottom: 1px solid #eee; } .cnblogs-markdown h1 .anchor { line-height: 1; } .cnblogs-markdown h2 { padding-bottom: 0.3em; font-size: 1.75em !important; line-height: 1.225; border-bottom: 1px solid #eee; } .cnblogs-markdown h2 .anchor { line-height: 1; } .cnblogs-markdown h3 { font-size: 1.5em!important; line-height: 1.43; } .cnblogs-markdown h3 .anchor { line-height: 1.2; } .cnblogs-markdown h4 { font-size: 1.25em !important; } .cnblogs-markdown h4 .anchor { line-height: 1.2; } .cnblogs-markdown h5 { font-size: 1em !important; } .cnblogs-markdown h5 .anchor { line-height: 1.1; } .cnblogs-markdown h6 { font-size: 1em !important; color: #777; } .cnblogs-markdown h6 .anchor { line-height: 1.1; } .cnblogs-markdown p, .cnblogs-markdown blockquote, .cnblogs-markdown ul, .cnblogs-markdown ol, .cnblogs-markdown dl, .cnblogs-markdown table, .cnblogs-markdown pre { margin-top: 0; margin-bottom: 16px; } .cnblogs-markdown hr { height: 4px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none; } .cnblogs-markdown ul, .cnblogs-markdown ol { padding-left: 2em; font-size: 14px; } .cnblogs-markdown ul ul, .cnblogs-markdown ul ol, .cnblogs-markdown ol ol, .cnblogs-markdown ol ul { margin-top: 0; margin-bottom: 0; } .cnblogs-markdown li>p { margin-top: 16px; } .cnblogs-markdown dl { padding: 0; } .cnblogs-markdown dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: bold; } .cnblogs-markdown dl dd { padding: 0 16px; margin-bottom: 16px; } .cnblogs-markdown blockquote { color: #333; padding: 10px 15px; border: none; border-left: 10px solid #D6DBDF; } .cnblogs-markdown blockquote>:first-child { margin-top: 0; } .cnblogs-markdown blockquote>:last-child { margin-bottom: 0; } .cnblogs-markdown table { display: block; width: 100%; overflow: auto; word-break: normal; word-break: keep-all; } .cnblogs-markdown table th { font-weight: bold; } .cnblogs-markdown table th, .cnblogs-markdown table td { padding: 6px 13px; border: 1px solid #ddd; } .cnblogs-markdown table tr { background-color: #fff; border-top: 1px solid #ccc; } .cnblogs-markdown table tr:nth-child(2n) { background-color: #f8f8f8; } .cnblogs-markdown img { max-width: 100%; box-sizing: border-box; } .cnblogs-markdown code { padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0,0,0,0.04); border-radius: 3px; border: none !important; display: inline-block; } .cnblogs-markdown code:before, .cnblogs-markdown code:after { letter-spacing: -0.2em; content: "\00a0"; } /*only for syntaxhighlighter */ /*--start--*/ .cnblogs-markdown .syntaxhighlighter table td.code { width:95% !important; } .cnblogs-markdown .syntaxhighlighter code { font-family: "Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace!important; padding: 0 !important; border-radius: 0 !important; background-color: transparent !important; } .cnblogs-markdown .syntaxhighlighter code:before, .cnblogs-markdown .syntaxhighlighter code:before { letter-spacing: -0.5em; } /*--end--*/ .cnblogs-markdown pre>code { padding: 0; margin: 0; font-size: 100%; word-break: normal; white-space: pre; background: transparent; border: 0; } .cnblogs-markdown .highlight { margin-bottom: 16px; } .cnblogs-markdown .highlight pre, .cnblogs-markdown pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border-radius: 3px; } .cnblogs-markdown .highlight pre { margin-bottom: 0; word-break: normal; } .cnblogs-markdown pre { word-wrap: normal; } .cnblogs-markdown pre code { display: inline; max-width: initial; padding: 0; margin: 0; overflow: initial; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } .cnblogs-markdown pre code:before, .cnblogs-markdown pre code:after { content: normal; } .cnblogs-markdown kbd { display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #555; vertical-align: middle; background-color: #fcfcfc; border: solid 1px #ccc; border-bottom-color: #bbb; border-radius: 3px; box-shadow: inset 0 -1px 0 #bbb; } .cnblogs-markdown .pl-c { color: #969896; } .cnblogs-markdown .pl-c1, .cnblogs-markdown .pl-mdh, .cnblogs-markdown .pl-mm, .cnblogs-markdown .pl-mp, .cnblogs-markdown .pl-mr, .cnblogs-markdown .pl-s1 .pl-v, .cnblogs-markdown .pl-s3, .cnblogs-markdown .pl-sc, .cnblogs-markdown .pl-sv { color: #0086b3; } .cnblogs-markdown .pl-e, .cnblogs-markdown .pl-en { color: #795da3; } .cnblogs-markdown .pl-s1 .pl-s2, .cnblogs-markdown .pl-smi, .cnblogs-markdown .pl-smp, .cnblogs-markdown .pl-stj, .cnblogs-markdown .pl-vo, .cnblogs-markdown .pl-vpf { color: #333; } .cnblogs-markdown .pl-ent { color: #63a35c; } .cnblogs-markdown .pl-k, .cnblogs-markdown .pl-s, .cnblogs-markdown .pl-st { color: #a71d5d; } .cnblogs-markdown .pl-pds, .cnblogs-markdown .pl-s1, .cnblogs-markdown .pl-s1 .pl-pse .pl-s2, .cnblogs-markdown .pl-sr, .cnblogs-markdown .pl-sr .pl-cce, .cnblogs-markdown .pl-sr .pl-sra, .cnblogs-markdown .pl-sr .pl-sre, .cnblogs-markdown .pl-src { color: #183691; } .cnblogs-markdown .pl-v { color: #ed6a43; } .cnblogs-markdown .pl-id { color: #b52a1d; } .cnblogs-markdown .pl-ii { background-color: #b52a1d; color: #f8f8f8; } .cnblogs-markdown .pl-sr .pl-cce { color: #63a35c; font-weight: bold; } .cnblogs-markdown .pl-ml { color: #693a17; } .cnblogs-markdown .pl-mh, .cnblogs-markdown .pl-mh .pl-en, .cnblogs-markdown .pl-ms { color: #1d3e81; font-weight: bold; } .cnblogs-markdown .pl-mq { color: #008080; } .cnblogs-markdown .pl-mi { color: #333; font-style: italic; } .cnblogs-markdown .pl-mb { color: #333; font-weight: bold; } .cnblogs-markdown .pl-md, .cnblogs-markdown .pl-mdhf { background-color: #ffecec; color: #bd2c00; } .cnblogs-markdown .pl-mdht, .cnblogs-markdown .pl-mi1 { background-color: #eaffea; color: #55a532; } .cnblogs-markdown .pl-mdr { color: #795da3; font-weight: bold; } .cnblogs-markdown .pl-mo { color: #1d3e81; } .cnblogs-markdown kbd { display: inline-block; padding: 3px 5px; font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 10px; color: #555; vertical-align: middle; background-color: #fcfcfc; border: solid 1px #ccc; border-bottom-color: #bbb; border-radius: 3px; box-shadow: inset 0 -1px 0 #bbb; padding-top: 20px; } .cnblogs-markdown .task-list-item { list-style-type: none; } .cnblogs-markdown .task-list-item+.task-list-item { margin-top: 3px; } .cnblogs-markdown .task-list-item input { margin: 0 0.35em 0.25em -1.6em; vertical-align: middle; } .cnblogs-markdown :checked+.radio-label { z-index: 1; position: relative; border-color: #4183c4; }