关于git你需要知道的事

*原文已同步到前端派 *


gutv.png

版本控制相信大家都不陌生,从CVS,到SVN,再到现在越来越受到重视的git。关于它们三者特别是后两者的对比,我觉得有必要说一下。

现在很多人,很多项目从svn转到了git,相信还是有一部分人是被动转到git的,比如说项目的改变,其中又有一部分人可能对git的好处并不是十分了解,以及git也不太了解。我们在使用一个东西的时候,常常会进入到我会用就行了,当我会用了,我就很容易就懂,但是实际情况并非如此。我们要会用,也应该知道究竟为什么我们要这么用。比如说学车的时候,我们虽然没必要知道汽车内部的构造,但是如果能明白为什么换挡的时候要踩离合的时候,对你学车觉得是很有用的。

  • GIT是分布式存储的,而SVN是集中式存储。

    什么意思呢?相信大家都用过SVN,它的工作流程就是:checkout 远端分支到本地 -> 本地修改 -> commit (这一步自动将代码push到远端的代码仓库) -> 加入版本控制这就要求,你必须得有网络,保证本地能够顺利的push代码改动到远端,否则就没法加入版本控制。
    而GIT的工作流程就不同了:ckeckout远端仓库到本地 -> 本地建立分支 -> 在分支上做些修改 -> add 并 commit -> 加入版本控制 -> push本地缓存的commit到远端

    所以最大的区别就是,使用git你完全不需要网络就可以进行版本控制,在本地修改,并提交到本地,并在合适的时候再push到远端。而svn要想加入版本控制就必须保证网络通常。

  • GIT把内容按元数据方式存储,而SVN是按文件
    意思就是GIT会在本地存储项目下的所有文件,因为本地存储的是一个远端的克隆版本,而svn则只需要checkout你需要的那部分代码文件到本地即可。所以通常本地的git目录的大小要远远大于svn的目录。

  • 另外一些特性包括GIT的操作速度要远远快于svn,这对发布来说速度提升明显。

参考:版本控制系统对比:Git与Subversion


下面说正事,说这么多其实最重要的还是得学会使用,毕竟工具的目的就是让我们的工作更加方便有效率。

拿github的工作方式举例吧:

  • 1.在github上新建一个项目
  • 2.checkout 到本地
    git clone git@github.com:HoTT/book.git -o o
    // -o可以指定oringin的alias。而oringin是远端仓库地址的alias
    //如果需要指定本地文件夹
    git clone git@github.com:HoTT/book.git gitbook -o o
    //如果想查看所有分支
    git branch -a
  • 3.建立分支

建立一个新的分支:

    git branch example //新建example分支
    git checkout example //跳到example分支
    OR:
    git checkout -b example //新建并跳到新分支
    
    //如果新建了分支之后,想把它的远端设置为init的话应该怎么做?
    git branch -u upstream/init //upstream是远端地址,一般为oringin
        

clone默认会chekout出master分支,如果你还想要远端的init分支呢?

    git checkout init origin/init //克隆远端的init分支到本地的init分支
    //你也可以在clone版本仓库的时候指定分支;
    git clone <remote_repo> -b <branch>
    
    //用gitk看下你的工作流
    gitk--all &
  • 3.修改并提交
    //本地修改
    git status //列出当前分支的状态
    git difftool //调用diff工具diff代码
    or
    gitk & //
    or
    git gui & //如果你安装了git gui的话
    
    git add -A . //将所有文件加入缓存
    
    //提交代码
    git push o init:init //第一次,新建远端init分支,并将本地init分支push过去
    or
    git push o init //效果参见上一条命令
    or
    git push o //push当前分支到upstream。设置了本地分支的upstream之后,可以不用指定远端的分支
    
    git push  //是 git push o prd_1:prd_1 的简写。因为要push的是本地当前分支prd_1,且其upstream分支名是o/prd_1,同名,所以可以全省略
    
  • 4.merge
    //merge 当前分支中的别人的修改
    git pull //等同于 git fetch 更新所有的远程分支,然后再 git merge o/prd_1。
    or
    git fetch (and) git merge 
    //merge master 分支到当前分支
    git merge o/master
  • 5.conflict 冲突解决

merge的时候很容易就会出现代码冲突,一般情况下git会自行自动resolve,但是如果自动没能解决的话就需要手动解决冲突了。

    //如果配置了mergetool,可以这么使用
    git mergetool
    //修改冲突后,直接提交就行了,就像正常的提交
    git add -A .
    git ci -m 'merge master'
    git push 
    
    //查看下状态
    git status

上面所说的只是一些很基本的用法,对于每个都没有深入去讲,后面会针对常见的问题做一些深入的讲解。

最后再放送一些小技巧

  • 配置alias
    找到你的.gitconfig文件,在里面增加
    st = status
    ci = commit -m
    co = checkout
    br = branch
    unstage = reset HEAD --
    last = log -1 HEAD

或者直接配置全局的alias:

    $ git config --global alias.st status 
    $ git config --global alias.ci 'commit -v'

配置了alias之后,命令将大大减少

    $ git st //git status
    $ git ci 'commit one' //git commit -m 'commit one'

如果你觉得这样还是费事的话,你还可以配置的bash或者zsh的alias:

    alias gst='git status'
    alias gl='git pull'
    alias gp='git push'
    alias gd='git diff | mate'
    alias gau='git add --update'
    alias gc='git commit -v'
    alias gca='git commit -v -a'
    alias gb='git branch'
    alias gba='git branch -a'
    alias gco='git checkout'
    alias gcob='git checkout -b'
    alias gcot='git checkout -t'
    alias gcotb='git checkout --track -b'
    alias glog='git log'
    alias glogp='git log --pretty=format:"%h %s" --graph'
  • 我同时还使用github,这样的话,公司的username和github的不同怎么办?
    //如果不想使用全局的username的配置,只需在项目目录下单独配置即可
   $ git config user.name 'developer' //记得不加--global
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 源代码管理工具的起源 为什么会出现源代码管理工具? 为了解决在软件开发过程中,由源代码引发的各种蛋疼繁琐问题 源代...
    小白文_Vincent阅读 3,151评论 2 8
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,621评论 9 163
  • 1.jQuery 中, $(document).ready()是什么意思? 当DOM加载完成后执行该函数 2.$n...
    S级食材咩咩羊阅读 195评论 0 0
  • 时间过得真快,一眨眼已经开学三周了,仿佛暑假时期的种种都只是发生在昨日。现在的我终于可以抽出时间来坐在电脑前开始完...
    李白杨阅读 276评论 0 2
  • 红楼梦这本名著流传至今,依然深受广大读者喜爱,学者研究追捧原因,本身在于书内容的价值,在这个信息爆炸,生活快节奏的...
    尼尔基斯阅读 433评论 0 0