Git 简介
发音 [gɪt],跟SVN一样,也是一套代码仓库。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
版本 0.99~2.15.1 (从 05年12月15日 至 17年11月28)
是免费&开源&分布式布局。https://git-scm.com/
git 的基本使用
在 Terminal 中键入 git 回车后回显的帮助信息
$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
reset Reset current HEAD to the specified state
rm Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that introduced a bug
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
checkout Switch branches or restore working tree files
commit Record changes to the repository
diff Show changes between commits, commit and working tree, etc
merge Join two or more development histories together
rebase Reapply commits on top of another base tip
tag Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
程序员常见的 git 平台与工具
-
CodePlex 微软开源平台
微软开源平台。CodePlex将于年底关门,并且计划今年11月末完全设置为“只读”状态,目前微软正在将CodePlex中大部分的源代码案例转移到了GitHub当中,并且已经不允许开发者上传新的代码案例。(TFS,CVS,SVN and Git)
-
GitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。主要针对开源项目(免费)&私有项目(收费)
八卦之12306
2013年1月15日晚间 突然遭遇疑似DDOS攻击,访问大幅减慢。管理员通过日志查询,发现洪水般的访问竟来自中国的12306抢票插件。 插件中的某些js资源以raw文件方式托管在GitHub上而且由于代码的暴力retry导致了躺枪。 从此GitHub更加了解了中国春节的疯狂和一个无法联系上的神秘组织12306
-
GitLab Git仓库管理系统
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。CE版本免费/EE版本收费
-
TortoiseGit 乌龟系列之Git管理工具
TortoiseGit 是 Windows 平台上的一个开放的git版本控制系统的源客户端。操作方式跟TortoiseSVN类似。使用之前需要先安装Git
-
SourceTree GUI非常友好的Git管理工具
SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是 Mercurial 和 Subversion 版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。可选Git安装(支持自定义/自动安装)
开始使用 git
准备工作
- 一台PC(Windows/Mac/Linux 都可以)
- 可以连晚上互联网(可选)
- 安装Git(Linux/Mac 平台一般已经内置 git,windows需要手动安装)
- 安装Git工具软件(TortoiseGit/SourceTree选一,可选)
创建第一个 git 项目
-
使用命令行方式创建
$ mkdir hello #创建 Project 目录 $ cd hello/ #进入目录 $ touch readme.md #创建 readme 文件 $ vi readme.md #更新 readme 文件内容 $ git init #初始化Git仓库 $ git add readme.md #将 readme 文件加入版本控制 $ git commit #提交本次修改内容
-
Tortoise Git
- SourceTree
Git Rebase(变基/衍合) 概念介绍
假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。
$ git checkout -b mywork origin
这个时候,流程图可以这样表示:
现在我们在这个分支做些修改,然后生成两个提交(commit)。
$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...
但是与此同时,有些人也在origin
分支上做了一些修改并且做了提交了。这就意味着origin
和mywork
这两个分支各自"前进"了,它们之间"分叉"了。如下所示:
这个时候,我们一般的操作是这样的:用pull
命令把origin
分支上的修改拉下来并且和你的修改合并;结果看起来就像一个新的合并的提交
(merge commit):
一旦从origin
获取最新的code片段时,可能会产生冲突。在我们处理完冲突后会产生一个 Merge 记录。后面会将这些历史信息一并推回到origin
分支中,这些信息可能不是我们所期望的,尤其是这些冗余、无异议的提交信息。那么我们要怎么做才能去掉这个呢?这个时候,就需要使用到Rebase
。Rebase
可以让mywork
分支历史看起来像没有经过任何合并一样。
$ git checkout mywork
$ git rebase origin
这些命令会把你的mywork
分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到.git/rebase
目录中),然后把mywork
分支更新到最新的origin
分支,最后把保存的这些补丁应用到mywork
分支上。
当mywork
分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)
整理后的日志
当 rebase 遇到冲突
在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用git-add
命令去更新这些内容的索引(index), 然后,你无需执行 git-commit
,只要执行:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任何时候,你可以用 --abort 参数来终止rebase的行动,并且mywork
分支会回到rebase开始前的状态。
$ git rebase --abort
交互式 rebase
你亦可以选择进行交互式的rebase。这种方法通常用于在向别处推送提交之前对它们进行重写。交互式rebase提供了一个简单易用的途径让你在和别人分享提交之前对你的提交进行分割、合并或者重排序。在把从其他开发者处拉取的提交应用到本地时,你也可以使用交互式rebase对它们进行清理。
如果你想在rebase的过程中对一部分提交进行修改,你可以在git rebase
命令中加入-i
或--interactive
参数去调用交互模式。
$ git rebase -i 选定分支/选定版本
e.g. git rebase -i origin/master
这个命令会执行交互式rebase操作,操作对象是那些自最后一次从origin仓库拉取或者向origin推送之后的所有提交。
Source Tree 上演示 rebase 操作
使用交互式变基
交互式变基可以做修改,删除,变更修改次序等等操作。此外,还可以合并尚未提交到 origin 上的修改。
使用rebase 方式更新代码
解决冲突。解决完冲突后选择动作=>继续变基。代码就更新好了。注意,解决完冲突后不要点击提交
这时候我们可以看到线已经合并成了一条了。
命令行上演示 rebase 操作
通过日志,我想将本地测试提交的功能合并,那么获取到测试提交功能上次提交的hash值,以此作为衍(yǎn)合起点。
进入交互模式(vi编辑模式),这里可以看到测试提交的两次提交,及以下帮助信息,目前大家只需要关注标注的内容即可。
修改功能起始日志&结束日志(这里只需要 r 改写黄色部分即可,esc后键入 :wq 即可弹出修改日志界面)
改写完首次提交内容,在改写最后一次提交内容。
修改完成
删除、合并提交参考 source tree 操作
Git Flow
- 就像代码需要规范一样,代码管理同样需要一个清晰的流程和规
- Vincent Driessen 提供一个很好的解决方案来解决这个问题
- 这是啥?!向左旋转90°,大家就会很好的理解了,那么我们往下看
Git Flow 常用分支
-
Production 分支
也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改(只读、仅合并、Tag、创建 Hotfix 分支)
-
Develop 分支
这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并其他分支,比如Feature分支(只读、仅合并、创建 Feature&Release 分支)
-
Feature 分支
这个分支主要是用来开发一个新的功能,待开发完成,将其合并回Develop分支(开发)
-
Release 分支
当需要发布一个新 Release 的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们会将其合并到Master和Develop分支
-
Hotfix 分支
当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会包含在下一个Release中
Git Flow – 初始化分支
所有在 Master 分支上的 Commit 应该标记 Tag
Git Flow – Feature 分支
命名方式 feature/*
e.g. feature/facebook_intergration
Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留
Git Flow – Release 分支
命名方式 release/*
Release分支基于Develop分支创建,打完Release分支后,我们可以在这个Release分支上测试,修改Bug等。 (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)
发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。
Git Flow – HotFix 分支
命名方式 hotfix/*
hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag
SourceTree 上的 GitFlow
Git 扩展阅读
- Linus讲述Git
- 真实还是谎言:SVN大战Git
- https://git-scm.com
- https://github.com
- https://tortoisegit.org
- https://www.sourcetreeapp.com
- http://gitbeijing.com/flow
- http://www.oschina.net/translate/a-successful-git-branching-model?lang=chs&page=1
- https://www.cnblogs.com/cnblogsfans/p/5075073.html
- https://git-scm.com/book/zh
- http://nvie.com/posts/a-successful-git-branching-model
- http://blog.51cto.com/lansgg/1570942
- http://blog.justbilt.com/2017/04/12/the-git-for-neat-freak