想要高效的协同开发吗?用Git吧!

简介

还是先了解些概念性的东西吧!

  • Git为分布式版本控制系统,与集中式版本控制系统SVN不一样。具体区别这里不做解释,因为有更好的解释—>git 分布式工作流
  • 仓库:实际开发中一般是把github当远端仓库。所以要理解实际使用存在两个仓库,一个本地,一个远端。
  • 分支:这可能是Git 最重要的部分,当然了分支也是分远端分支和本地分支。比如本地分支:develop 对应远端分支:origin/develop。分支间互不干扰又能相互衍合,分支对于协同工作和代码管理简直再适合不过。
  • 三个工作区域:工作目录、暂存区、git目录。每次更改都是发生在工作目录,也是我们的工作区域。暂存区解释起来有些抽象,但简单来说就是索引文件,提交前需要将文件添加进暂存区。提交之后文件将永久存储在git目录。
  • 三个状态:已修改(modified)、已暂存(staged)、已提交(committed)。
  • commit: 一次提交就是一个commit,每个commit 都具有唯一SHA值如:b14287b56c371542380ca0900d53fb2171a4f42e 不过一般前7位 b14287b 就具有唯一性了。Git里面的commit 与svn 不一样,Git里面的commit 仅仅是提交在本地仓库,要同步到远端仓库还要push。所以说没网的情况下也能做提交,有网了统一push就是了,这点svn做不到。

新建git库

若是建本地仓库,则在文件夹根目录下git init 即可,新增.git 文件夹既是git 仓库。
实际开发中一般是先在github 新建远端仓库,然后git clone到本地,clone 下来的文件已经有本地仓库,不需要git init。

提交

Git 上的提交流程也蛮easy,修改之后git add . 默认全部暂存,提交写个提交信息 git commit -m"..."就算完成提交了。你想推到远端那就git push。
对应的各种文件状态:

修改文件testabc.txt,文件处于modified 状态,但是unstage。

**git add . **添加至暂存区,文件staged
**git commit -m""**提交至本地仓库,提交之后可看到超出远端分支一个commit,可以用git push 推到远端

分支

前面说了分支是git 最为重要的东西,一切操作都是基于分支。什么都不做,建好git 仓库之后,默认为master分支,即主分支。
一条分支可以理解为一条工作线,推动工作线不断向前的便是commit。

查看所有本地分支,查看当前分支状态

  • 分支的新建
    新建分支同样也是基于某个分支的某个commit,新建分支之后就好比在一条工作线上的某个位置,又拉了一条工作线,两条工作线同时存在,互不影响。


    **git checkout -b develop** 基于master分支新建develop 分支。
  • 远端分支
    远端分支的最新指向由 origin/分支名 来表现。当协同开发时,有人将远端分支指针向前移动了,那你的分支上则表现为本地分支落后于远端分支。比如develop 落后于 origin/develop,可通过git pull远端分支来同步。
    本地分支落后于远端分支

    当然了在本地与远端同步的基础上,你进行了commit那你的分支表现为本地分支领先于远端分支,可通过git push来将commit 推向远端,使远端指针向前移动,让本地与远端同步。
    本地分支领先远端分支
  • 分支与分支之间的合并
    不考虑远端分支的情况下进行本地分支合并。
    1、merge
    merge 是一种三方合并,把两个分支的最新节点与两个分支最近的共同祖先进行合并。生成一个新的节点,a merge b,那a 分支指向最新节点,同理b merge a,b指向最新节点。
develop merge carson

2、rebase
rebase 又称衍合,但与merge不一样,它是一种变基操作。a rebase b,会将a 的最新提交重新以b为基座运用一遍。


carson rebase develop

下面是坑:
在不考虑远端分支的情况下,merge、rebase 都没什么问题,都能完成合并工作。但考虑远端分支,特别是多人协同开发时,使用rebase 就要注意了。弄不好就把别人写好的代码给冲掉了。
具体情景:
在节点c2新建你的carson分支之后,你已经在你的分支上做了push操作,也就是说origin/carson指向的节点领先与基点c2。

carson rebase develop

这种情况是carson 落后于origin/carson,就好比多人开发,你的同事在carson 分支上提交并push了,你这边会落后于origin/carson,你本地没有拉去你同事的最新代码,此时你想用rebase把develop上的代码合过来。合完之后会发现carson 分支与origin/carson 出现了差异。那这时git 会提示你又要拉取代码,又要push代码,这样操作的后果还不算太坏,也就出现几个相同的commit,最坏的结果是,你不pull,直接强制push。那后果就比较严重了,好比c5是你同事的提交,你强制push之后,c5就没了,origin和origin/carson 都指向c4,这就是把代码给冲掉了。如果这个时候你的同事再取拉代码,那本地的c5也没了,工作全白费了。
强制push之后C5被冲掉了

所以rebase 的使用要分情况了,同时强制push 也不是没有好处,有时push了一个错误代码,你可以reset 本地,修改之后再强制push,冲掉远端仓库的错误代码。

pull、fetch、pull --rebase

相信这样的等式大家看到很多次了,但我还是想结合图形来直观说明下。
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

git fetch 只是让远端分支的指针origin/分支名指向最新,不改变本地分支,一般在联网情况下fetch 操作不用执行,感觉单独执行git fetch 无太大的实际意义。

本地与远端分叉的情况
看看git pull:

相当于用carson merge origin/carson

看看git pull --rebase:
相当于用carson rebase origin/carson

这种情况下用pull 、pull --rebase 出现的分支图会有差异。用哪种看个人喜好了,一般rebase会保证一条线,也不会出合成新的commit,比较干净。

当本地与远端没分叉,在一条线上,这种情况下pull 、pull --rebase 效果都一样。

实用操作

  • 别名配置
    嫌git 命令长,自己也可以在.gitconfig 里面设置git 别名。


    别名
  • git reset
    能够回滚本地分支,表现为将本地分支指针向后移动。
    默认接参数 --mixed,回滚之后但最新的改动还在工作区。
    加参数 --soft, 回滚之后最新改动回到暂存区。
    加参数 --hard,回滚之后改动不要了。

  • git push origin [分支名] -f
    强制提交,一般配合git reset 使用,可以冲掉远端commit,用于覆盖掉远端错误代码比较好。

  • git cherry-pick #[SHA]
    假如说你在分支carson 上提交了 c1、c2、c3,但现在develop 分支要发布,但需要有c2、c3 这两个更新,所以你又不能简单的把carson 合并到develop,因为c1这个改动还不能发布上线。那这个时候cherry-pick 就发挥作用了。可以在develop 分支上cherr-pick #[c2、c3 的SHA值,前7位即可],当然cherry-pick 得保证顺序,谁先提交的,那重新运用时也要先pick 谁。

  • git reflog
    查看当前分支的所有操作记录。

总结

刚来公司CTO就说“不会用git的程序员不是好程序员”,确实,git 功能强大,设计非常优秀,对于项目开发管理再适合不过。不会用git 如何跟团队一起高效的协同工作?上面所提的只是一些入门的知识点,没介绍太多命令,因为命令随便搜搜就能查到,重要的还是想多介绍些Git 工作原理,原理弄明白了才能真正做到会用。还不会使用的朋友看完这篇希望对你有所帮助。

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

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,382评论 2 8
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,458评论 1 26
  • 三大区域: 工作区 → 缓存区 → 本地仓库 一 、 使用 git config 命令进行配置: git ...
    Manchangdx阅读 2,841评论 0 2
  • 今天在乐嘉性格色彩的课程中听到关于蓝色性格优势,一是完美主义,二是踏实肯干,三是长情专一。 根据之前的学习以及我对...
    蝶无双阅读 1,501评论 0 1
  • 人生最大的赢家应该是生活家 不论在人生的每个阶段都能把生活过的有滋有味 与穷富无关 与职级无关 与顺逆无关 该转身...
    兰的心事阅读 258评论 0 0