接触git只有不到一年的时间,可以说比大多数人起步都晚。那会还沉浸在自己的舒适圈里面,进公司就用着perforce,一用就快7年,觉得自己会用一个SCM就行了,捧着不放,也不想去接触别的SCM。

直到去年公司一个新的项目开启,时程很赶,然后我也被拉进项目组。编程语言用的是PHP,framework是Laravel,SCM是git。刚听到的时候,我……一.NET程序员,现在让我来搞php,还是从来没接触过的,心想没搞错吧,可是是大老板安排的,抵触也没用,然后就被逼接触到了php,接触到了git。

如果说perforce带给我的感觉是迈腾,git就是S级大奔,如果现在让我从新再选一次,我会毫无疑问选择git,差距就是这么大,再加上当今最大的代码托管平台GitHub,git作为当今最强大的分布式SCM,当之无愧。

废话说的有点多,下面进入正题。

Git的安装

参考官网https://www.git-scm.com/
在windows上的童鞋下载打包好的集成环境即可:https://www.git-scm.com/download/win

Git flow

Git flow有很多,从简单到复杂,没有绝对的标准,选择适合自己的就好:

  • 如果整个项目只有你一个人,在一个master分支上玩就可以
  • 如果项目有多人合作,且master分支总是可以跟线上环境吻合,使用master分支+branches开发。
  • 如果项目有多人合作,并且master分支并不一定跟线上环境吻合,使用master分支+production分支+branches开发。
  • 等等

本文讲述的是上面第二种Flow:

  1. 主代码在master分支上
  2. 要对代码做的任何一个改动,无论是开发功能,修复bug,均从master分支开新的branch
  3. 代码完成,发pull/merge request,如果有CI,此时会跑test脚本,通过之后,reviewers会来评审你的代码,期间可能需要你再对code做一些修改
  4. 完成之后,代码被合并至master分支,如果有CI,会自动部署到stage(QA)环境

Flow对应的操作如下:

0、配置SSH KEY

参考:http://www.cnblogs.com/windchen/p/6222434.html

1、获取master分支代码

如果是第一次获取,用git clone指令,代码仓库都有一个地址,比如git@code.aliyun.com:ypzc/first-web.git

git clone git@code.aliyun.com:ypzc/first-web.git

如果是获取远程最新代码,用git pull指令,下面指令获取远程master的最新代码到当前分支

git checkout master
git pull origin master

2、创建branch

创建branch的命令有两个,这里推荐 git checkout -b [branch-name]

git checkout -b相当于执行两条指令:

git branch [branch-name]
git checkout [branch-name]

在实际多人合作开发过程中,无论是开发功能或者修复bug,均需先获取远程master分支最新代码,再创建branch:

git checkout master
git pull origin master
git checkout -b [branch-name]

branch创建好之后,就要开始修改code了,比如新增try-git.md文件:

# I like git very much

此时可以用git status指令查看工作区有哪些文件有修改:

$ git status
On branch training
Your branch is up-to-date with 'origin/training'.
Untracked files:
(use "git add <file>..." to include in what will be committed) try-git.md nothing added to commit but untracked files present (use "git add" to track)

git已经很聪明的提醒我们,没有被跟踪的文件列表,并告诉我们用git add指令去追踪它

$ git add try-git.md

再次用git status查看状况

$ git status
On branch training
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: try-git.md

提示有修改需要提交,需要再运行git commit。

git add指令是将我们在工作区对文件做的修改放入暂存区,之后可以继续对该文件进行修改,但暂存区里面保存了该文件上一次放进去的样子。

git commit是将暂存区中的文件提交到本地版本库

$ git commit -m "first add file" try-git.md
file changed, insertion(+)
create mode try-git.md

再次运行git status

$ git status
On branch training
nothing to commit, working tree clean

到目前为止,对git的操作只是在本地进行,需要把对代码的修改推到远端仓库,其他人才能看到你修改后的代码

$ git push origin [branch-name]

3. 合并分支、提交merge request

此时这个branch的代码还不在master分支中,在提交merge request之前要先合并master分支的最新代码到当前分支,避免merge失败:

先将master分支上最新的code marge到当前分支:

$ git pull --rebase origin master
CONFLICT (content): Merge conflict in try-git.md

如果遇到错误提示,则打开冲突的文件,修改冲突。

查看有冲突的文件:

git status

both modified:标出的就是需要手动调整的冲突文件。

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,此时打开try-git.md文件,可以看到类似

<<<<<<< HEAD
# Git is so powerful!
=======
# I like git very much
>>>>>>> feature1

手动调整为:

# Git is so powerful!
# I like git very much

所有冲突的文件调整好之后,运行

git add .

提交到暂存区,然后执行git rebase --continue,再push到远程

$ git add try-git.md
$ git rebase --continue
$ git push origin [branch-name]

建立pull/merge request,拿阿里code举例子:

执行之后,reviewers会收到通知信,查看代码,顺利的话,代码会自动marge到master分支上。

Git常用命令

  • git add [file-name] 将文件放入暂存区
  • git add . 将所有文件放入暂存区
  • git status 查看工作区和暂存区状况
  • git commit -m "message" [file-name] 提交文件到版本库
  • git commit -m "message" 提交所有暂存区中的文件到版本库
  • git push origin [branch-name] 将当前分支推到远端分支
  • git pull --rebase origin master 将远端master的修改更新到本地当前分支
  • git diff [file-name] 比较工作区文件与暂存区/版本库的差别
  • git checkout [file-name] 忽略文件当前工作区的修改,如果暂存区有该文件的修改,则回到暂存区的版本,否则回到版本库的版本
  • git rm [file-name] 删除文件
  • git log 查看版本库提交历史
  • git reset --hard [commit-id] 将代码回退到某一次commit,丢弃所有更改。另外HEAD代表当前版本,HEAD^表示上一次commit,HEAD^^表示上上次,以此类推,当然,还有这种表示方法:HEAD~10
  • git reset --soft [commit-id] 取消commit记录,但保留代码修改。这个在从feature branch上merge回master的时候非常有用,通常开发一个feature会有多次commit,如果不经过处理直接marge到master,commit也会一并marge进去,导致master分支的commit太多不容易阅读和维护。最好是在push到origin的时候,先将commit清空,仅保留一个描述当前功能的commit
  • git tag 查看所有标签
  • git tag -a [tag-name] -m "message" 给当前最新一次commit打标签,并给标签添加说明
  • git tag -a [tag-name] -m "message" [commit-id] 给某一个commit打标签,并添加说明
  • git push origin [tag-name] 将本地标签推到远程
  • git push origin --tags 将本地未推送的标签批量推到远程
  • git tag -d [tag-name] 删除标签
  • git push origin :refs/tags/[tag-name] 删除远程标签
  • git branch 查看本地分支
  • git branch -a 查看远程分支
  • git branch -d [branch-name] 删除本地分支
  • git branch -d -r origin/[branch-name] 删除远程分支 推荐用下面的方法
  • git push origin :[branch-name] 删除远程分支
  • git branch |grep 'bran'|xargs git branch -d 批量删除以bran开头的本地分支
  • git branch -a |  grep 'bran' | sed 's/remotes\///' | xargs git branch -d -r 批量删除以bran开头的远程分支
  • git check-ignore -v [file] 检查文件是被哪条规则ignore

另外有一些文件不希望让git来追踪,可以在工作区根目录的.gitignore文件中说明,语法百度。

git diff默认提供的功能比较难以阅读,可以利用第三方tool来,这里比较推荐suorcetree,官网:https://www.sourcetreeapp.com/,注册之后可以免费试用。

如果官网下载很慢,也可以从百度盘下载:

http://pan.baidu.com/s/1pLS4W7D

git多人合作模式的应用的更多相关文章

  1. 使用git 高效多人合作

    复习一下... 附加学习链接: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/) ...

  2. git 操作 :从远程仓库gitLab上拉取指定分支到本地仓库;git如何利用分支进行多人开发 ;多人合作代码提交实践

    例如:将gitLab 上的dev分支拉取到本地 git checkout -b dev origin/dev 在本地创建分支dev并切换到该分支 git pull origin dev 就可以把git ...

  3. GitHub-分支管理03-多人合作【重点】

    参考博文:廖雪峰Git教程 1. 多人协作 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信 ...

  4. 记录git多人协作开发常用的流程,供新手参考

    声明:博主写的博客都是经过自己总结或者亲测成功的实例,绝不乱转载.读者可放心看,有不足之处请私信我,或者给我发邮件:pangchao620@163.com. 写作目的: 记录一下我看完廖学锋老师的gi ...

  5. Git多人协作常用命令

    Git多人协作工作模式: 首先,可以试图用git push origin branch-name推送自己的修改. 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并. 如果 ...

  6. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  7. 《移山之道》第十一章:两人合作 读书笔记 PB16110698 第六周(~4.15)

     本周在考虑阅读材料时,我翻阅了<移山之道>,正好看到这一章:两人合作,心想:正好,我们正值结对作业的紧要关头,书中两人合作的宝贵经验和教诲应当对我们有很大帮助.于是,我开始一边在ddl苦 ...

  8. Jenkinsfile里定义对象和函数,获取git提交人, 发送钉钉通知

    自从开始使用Jenkinsfile作为Jenkins配置后就一发不可收,因为开发者自定义CI脚本实在太方便了. 比如,最近开发的以一个项目涉及多人,提交冲突挺多的,有的人自己没编译通过就提交了,导致后 ...

  9. Git 多人协作的工作模式

    多人协作 148次阅读 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git rem ...

随机推荐

  1. C# 利用SMTP异步发送邮件

    C#实现收发邮件功能需要用到两个命名空间  System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...

  2. DataGridView的使用和批量修改

    DataGridView的属性:AllowUserToAddRows:如果为true允许用户添加行,false不允许用户添加行ReadOnly:true表示只读.不能修改单元格中的值,false可以对 ...

  3. 支付宝集成时的InvalidKeySpecException

    近来在集成第三方支付---支付宝,在集成的过程中严格按照支付宝开发者平台所发布的说明文档和Demo,在我的测试机上可以完美的运行,但是在别人的手机无论怎么就是调用不起来,总是弹出"remot ...

  4. GridView动态增加行

    GridView动态增加行GridView动态增加行 很多时候,我们需要可编辑的表格,来比较方便的进行数据的录入,比如学习成绩的录入.当然这就要求能够动态的增加行,来一次性录入多个学生的信息.现在用A ...

  5. 一个ERP系统的磕磕碰碰

    历时5个月的开发,终于可以交付使用了.在这期间系统从需求分析.系统架构设计.开发.测试.运行.迭代.交付,整个忐忑波荡的一路走来,终于有时间静下心来写一篇总结跟各位博友一起探讨.学习了.如果对大家有帮 ...

  6. js 将long日期格式 转换为标准日期格式方法

    我们经常在操作的时候会发现从后台传递到view层的json中datetime类型变成了long型,当然你也可以从后台先转为string类型,但是如果是从和数据库对应的object中封装的话,就不能再去 ...

  7. C#简单实现贪吃蛇程序(LinQ + Entity)

    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...

  8. C51编译器扩展的关键词 & C51中断函数的写法

    C51根据单片机的特性扩展了相关的关键字,如下表示: 关键词 用途 说明 bit 位变量声明 声明了一个位变量或者位类型的函数 sbit 位变量声明 声明了一个可位寻址变量 sfr 特殊功能寄存器声明 ...

  9. C/C++基础知识总结——数组、指针域、字符串

    1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...

  10. seajs代码

    打包并压缩seajs代码 背景 seajs是一款优秀的模块开发插件,但是当我们使用它来进行模块化开发的时候,由于它的每个模块的加载都会进行一次http请求,那么当模块数量倍增的时候,会拖慢页面的加载速 ...