Git 使用技巧

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 平台与工具

  1. CodePlex 微软开源平台

    微软开源平台。CodePlex将于年底关门,并且计划今年11月末完全设置为“只读”状态,目前微软正在将CodePlex中大部分的源代码案例转移到了GitHub当中,并且已经不允许开发者上传新的代码案例。(TFS,CVS,SVN and Git)

  2. GitHub

    GitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。主要针对开源项目(免费)&私有项目(收费)

    八卦之12306

    2013年1月15日晚间 突然遭遇疑似DDOS攻击,访问大幅减慢。管理员通过日志查询,发现洪水般的访问竟来自中国的12306抢票插件。
    插件中的某些js资源以raw文件方式托管在GitHub上而且由于代码的暴力retry导致了躺枪。
    从此GitHub更加了解了中国春节的疯狂和一个无法联系上的神秘组织12306
    
  1. GitLab Git仓库管理系统

    GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。CE版本免费/EE版本收费

  2. TortoiseGit 乌龟系列之Git管理工具

    TortoiseGit 是 Windows 平台上的一个开放的git版本控制系统的源客户端。操作方式跟TortoiseSVN类似。使用之前需要先安装Git

  3. SourceTree GUI非常友好的Git管理工具

    SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是 Mercurial 和 Subversion 版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。可选Git安装(支持自定义/自动安装)

开始使用 git

准备工作

  1. 一台PC(Windows/Mac/Linux 都可以)
  2. 可以连晚上互联网(可选)
  3. 安装Git(Linux/Mac 平台一般已经内置 git,windows需要手动安装)
  4. 安装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

    tortoise1.png
    tortoise2.png
tortoise3.png
  • SourceTree
sourcetree1.png

Git Rebase(变基/衍合) 概念介绍

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

$ git checkout -b mywork origin

这个时候,流程图可以这样表示:

rebase1.png

现在我们在这个分支做些修改,然后生成两个提交(commit)。

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

但是与此同时,有些人也在origin分支上做了一些修改并且做了提交了。这就意味着originmywork这两个分支各自"前进"了,它们之间"分叉"了。如下所示:

rebase2.png

这个时候,我们一般的操作是这样的:用pull命令把origin分支上的修改拉下来并且和你的修改合并;结果看起来就像一个新的合并的提交(merge commit):

rebase3.png

一旦从origin获取最新的code片段时,可能会产生冲突。在我们处理完冲突后会产生一个 Merge 记录。后面会将这些历史信息一并推回到origin分支中,这些信息可能不是我们所期望的,尤其是这些冗余、无异议的提交信息。那么我们要怎么做才能去掉这个呢?这个时候,就需要使用到RebaseRebase可以让mywork分支历史看起来像没有经过任何合并一样。

$ git checkout mywork
$ git rebase origin

这些命令会把你的mywork分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到.git/rebase目录中),然后把mywork分支更新到最新的origin分支,最后把保存的这些补丁应用到mywork分支上。

rebase4.png

mywork分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

rebase5.png

整理后的日志

rebase6.png

当 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 操作

使用交互式变基

sourceRebase1.png

交互式变基可以做修改,删除,变更修改次序等等操作。此外,还可以合并尚未提交到 origin 上的修改。

sourceRebase2.png
sourceRebase3.png

使用rebase 方式更新代码

sourceRebase4.png

解决冲突。解决完冲突后选择动作=>继续变基。代码就更新好了。注意,解决完冲突后不要点击提交

sourceRebase5.png
sourceRebase6.png
sourceRebase7.png

这时候我们可以看到线已经合并成了一条了。

sourceRebase8.png

命令行上演示 rebase 操作

commandRebase1.png

通过日志,我想将本地测试提交的功能合并,那么获取到测试提交功能上次提交的hash值,以此作为衍(yǎn)合起点。

commandRebase2.png

进入交互模式(vi编辑模式),这里可以看到测试提交的两次提交,及以下帮助信息,目前大家只需要关注标注的内容即可。

commandRebase3.png

修改功能起始日志&结束日志(这里只需要 r 改写黄色部分即可,esc后键入 :wq 即可弹出修改日志界面)

commandRebase4.png

改写完首次提交内容,在改写最后一次提交内容。

commandRebase5.png

修改完成

删除、合并提交参考 source tree 操作

Git Flow

  • 就像代码需要规范一样,代码管理同样需要一个清晰的流程和规
  • Vincent Driessen 提供一个很好的解决方案来解决这个问题
  • 这是啥?!向左旋转90°,大家就会很好的理解了,那么我们往下看
gitflow1.png

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

gitflow2.png

Git Flow – Feature 分支

命名方式 feature/*

e.g. feature/facebook_intergration

Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留

gitflow3.png

Git Flow – Release 分支

命名方式 release/*

Release分支基于Develop分支创建,打完Release分支后,我们可以在这个Release分支上测试,修改Bug等。 (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。

gitflow4.png

Git Flow – HotFix 分支

命名方式 hotfix/*

hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag

gitflow5.png

SourceTree 上的 GitFlow

gitflow6.png

Git 扩展阅读

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • Git分支管理 master:主分支,当前分支上的代码随时可以直接发布,并且只能通过Pull Request从其他...
    UEUEO阅读 9,583评论 5 33
  • 写作突然停滞了几天,有点累,也许这并不是理由。 今天上班老大把一份文件放我桌子上然后说了一句话,我应声抬头答应一句...
    素颜hb阅读 176评论 0 0
  • 文/ 路人锋 月亮、星星们是怎么来的?孩子说,都是太阳的粑粑。 窗台的风铃笑了叮叮当当,院子的小树笑了哗哗啦啦,厨...
    路人锋阅读 705评论 9 13
  • 打蟑螂的瞬间 世界这么大,难免在哪遇到一只蟑螂。 有时蟑螂是从窗户飞进来降落的。惊恐指数相当高,拿起拖鞋的瞬间脑海...
    胖大梨阅读 595评论 1 2