接触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#之冒泡排序的三种实现和性能分析

    冒泡排序算法是我们经常见到的尤其是子一些笔试题中. 下面和大家讨论c#中的冒泡排序,笔者提供了三种解决方案,并且会分析各自的性能优劣. 第一种估计大家都掌握的,使用数据交换来实现,这种就不多说了,园子 ...

  2. 自己动手实现Expression翻译器 – Part I

    伴随.Net3.5到来的Expression,围绕着它产生了各种各样有趣的技术与应用,Linq to object.Linq to sql.Linq to sqllite.Linq to Anythi ...

  3. Varnish 4.0

    Varnish 4.0 实战   简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varn ...

  4. Build MySQL 5.7.4 in RedHat

    Install Cmake 1. download cmake source code at  http://www.cmake.org/files/v3.1/cmake-3.1.0.tar.gz 2 ...

  5. C# BackgroundWorker组件学习

    C# BackgroundWorker组件学习  C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...

  6. 字符串比较strcmp

    问题: 原型:extern int strcmp(const char *s1,const char * s2); 所在头文件:string.h 功能:比较字符串s1和s2. 一般形式:strcmp( ...

  7. CentOS上搭建java WEB开发环境Tomcat+MySQL+JDK

    对于初学者来说,想在linux系统上搭建一个java web服务器,不知道什么方案可行, 这篇文章主要是告诉这些基础和概念相对薄弱的同学,这样搭建是可行的,大体上没问 题的,出问题也是细节问题.所以此 ...

  8. GEF-whole-upload教程中遇到的问题及解决方案

    最近在学习GEF开发,使用的是GEF-whole-upload这个教程.由于教程当时所使用的版本与本人使用的版本有一些差异,中间出现了不少问题,现在将解决方案分享给大家. 本人使用的Eclipse版本 ...

  9. WordPress 4.3 Beta 1 全新发布,改进了后台功能和用户体验

    WordPress 4.3 Beta 1 发布,此版本是开发版本,不建议在生产环境使用.如果要测试 WordPress 4.3 Beta 版本,可以使用 WordPress Beta Tester 插 ...

  10. 二.redis 数据类型

    本文介绍下redis支持的各种数据类型包括string,list ,set ,sorted set 和hash 1. keysredis本质上一个key-value db,所以我们首先来看看他的key ...