你还在用svn?git你无法拒绝的版本管理工具

序言:之前在公司培训过git入门,效果不错。然后我把分享的提纲完善补充了一下分享给需要的人,后期考虑录一个视频讲解一下

本文旨在教你了解git设计原理,以及怎么快速的使用git进行版本控制,对于理解和学习git有很大的帮助,如果是git老手大可忽略了

1. git安装

直接访问https://git-scm.com/downloads下载对应系统的git安装包,然后一路安装就可以了,比较简单

2. git设计理念

git是一个分布式的版本控制管理工具,它不同于传统的集中式管理工具,例如svn,cvs。使用git协同管理的代码在本地都会有一个完整的仓库备份,这是极为安全的,不会因为服务端的问题导致代码的丢失。

git版本的管理是快照式的,每一次的提交,相当于生成了这个文件的快照。对同一文件的修改,如果分两次提交,那么就会有两次快照,即有两个版本。

git的提交都是基于本地仓库的,所以你可以单机运行不联网肆意的提交,当适时的时候push到远程仓库即可。不用担心自己频繁地提交会产生更多的冲突,同样git是提倡积极提交的,这样可以更好的追踪文件,当然在你push到远程的时候,要保证代码的正确,可编译运行,否则将会影响其他协作的开发人员。如果还是不小心提交了错误的代码,通过沟通也是很快就可以解决的。

3. git快速上手体验

ps:这部分最好能手动跟着我的思路操作一遍,这样你对git的魔法就会有一个表深刻的印象。
  • 初始化git仓库

    1. 进入工作目录,打开Git Bash,敲入命令git init ,会生成一个.git的文件夹,这样我们就初始化了一个git本地空仓库
    2. 敲入命令git status命令,查看一下版本管理的状态,显示无任何变动,很干净~
      init.gif
  • 模拟新增文件
    1.在工作目录新建a.txt文件,git status查看状态
    2.下图显示你有一个文件a.txt未纳入版本管理,你可以通过git add把它纳入版本管理当中,这样我们就模拟了一次新增文件的状态展示

    add.jpg

  • 模拟正常提交
    1.根据上图提示,我们通过git add将a.txt纳入到版本管理当中,这时候git status就会看到文件变绿了😁
    2.然而这并没有完,你还需要git commit -m "改动注释",这一步才是正在的把文件提交到了你本地的git仓库,这个时候你再git status看一下仓库状态,很干净,没毛病了🤭

    add.gif

暂时体验到此,后续我们会继续边讲边演示

4. 工作区和暂存区、本地仓和远程仓概念

下面这个图是我总结的git的基本设计理念,一定要重点理解。各个区间的转化我用箭头+命令的方式展示了出来,这里可以帮助你理解这些常用命令执行的逻辑,所以一定要吃透。
这里我简单介绍下,如果还有疑问请在下面回复,我都会解答的。

四个长条矩形分别代表了四种不同状态的空间

1.展示的是你工作目录文件的实时变化,也就是ide里面直观看到的,改了什么就是是么
2.暂存区是git提出的创新概念,这里是个临时区域,我们无法很直观的看到,这里存放的是暂时行文件,也就是你准备要提交的内容,可以将多个文件一次性放到暂存区里,只需要提交一次,这些暂存去的内容就会都被提交
3.本地仓库这里存放里你提交的所有文件的版本以及别人提交的文件,是一个完整的版本库
4.远程仓库存放了所有的文件版本信息,主要用来团队协作的

git设计理念.jpg

5. git仓库(比较好理解)

通过上面的图就很清晰的知道,仓库分为本地仓库和远程仓库前面我们已经知道如何创建一个仓库,并提交版本管理到本地仓库,这节我们介绍下如何创建远程仓库。

  • 创建远程仓库有俩种方式:
    • 1.先创建本地仓库,然后推送到远程服务器。
      git init & git remote add origin http://101.37.21.24:3385/liuhu/git-test.git & git push -u origin master
    • 2.服务器端初始化仓库,本地拉去远程仓库.
      git clone http://101.37.21.24:3385/liuhu/learngit.git

6. git分支管理(可以说是git最强大的地方了)

  • 前面我们使用git init初始化的仓库他是有默认分支的,叫master。所有不管是本地还是远程仓库是时候后都会有一个叫master分支

  • 创建一个分支
    1.使用命令 git branch dev就可以创建一个分支了,然后使用命令git branch就可以查看本地的分支了,看到了一共有两个分支,一个dev ,一个master,*代表现在所处的分支

    br.jpg

  • 模拟自动合并(开始搞事情了)
    1.打开a.txt,在第一行写上the fist record,然后执行git add .添加,在执行git commit -m "mod a.txt",这样就把修改后的文件提交到了本地仓库中
    2.切换分支,执行git checkout dev,解释下这个命令,因为我们是从master分支基础上创建的分支,所以现在的内容和master分支上的一样的
    3.我们接着打开a.txt,在第二行写上The second record,同样执行git add .&git commit -m "mod a.txt",提交到本地仓库。
    4.我们执行git checkout master切换到master分支,然后打开a.txt文件,发现只有the first record。 why,我刚才提交的The second record哪去了,别急,你刚才提交的内容是提交到了dev分支上,现在你切换到了master分支,当然看不到了。那怎么能在master分支上看到呢?合并呗~
    5.执行git merge dev ,然后再打开a.txt,看看The second record是不是回来了

  • 模拟合并冲突(继续搞事情)

    前面的合并是很顺利的,在毫不知情的情况下,代码内容得到了合并,但是如果有冲突了,那就需要自己手动处理了

    1.还是在master分支,我们发现第一行的内容首字母没有大写,ok我们修改一下把首字母改成大写,然后用同样的方式提交
    2.然后我们git checkout dev切换到dev分支,又加了一行The three record,add并提交
    3.接着我们git checkout master切换回到master分支,这时候我们想把dev的代码合并过来,我们执行git merge dev发现如下提示,有冲突,自动合并失败了,同时分支处在了一个合并状态中

    merge.jpg

    4.那么只能手动处理冲突了,我们打开a.txt,如下图,怎么看这个冲突提示呢?<<<<<<<和=======之间的内容是master的内容,也就是你自己修改的内容,而=======和>>>>>>>之间的内容是合并来的内容也就是dev分支的内容,


    merge.jpg
  5.然后我们选择保留哪一些,去掉<<<<<<<=======>>>>>>>,add并提交,冲突解决完毕,最终修改内容
  ![merge.jpg](https://upload-images.jianshu.io/upload_images/5416778-e4cf474b57cabe49.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 添加远程地址,推送到远程仓库 git remote add origin http://101.37.21.24:3385/liuhu/git-test.git
  • 删除远程的new分支
    git branch -r -d origin/branch-name & git push origin :branch-name

7. git常用功能和技巧

  • 别名命名

    git config --global alias.st status
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.br branch
    
    把暂存区恢复到工作区
    git config --global alias.unstage 'reset HEAD'
    
    显最后次提交信息    
    git config --global alias.last 'log -1'
    
    格式化log的日志输出
    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    
  • git stash暂存功能,相当于一临时性的提交,比如正在开发一个模块中的某个功能,只完成了10%,这是你的头过来说你要先暂停下这个功能,先帮我写个方法吧,如果你用的svn,这时你会认为这是很操蛋一个order,但是没办法,他是leader。这时如果你使用的是git,那么你可以很优雅的执行 git stash命令,这个命令会把你当前的工作内容,未提交之前的所有内容存储到一个临时空间里,等你完成了头给的任务然后快速地提交并push到了远程仓库。然后很优雅的执行了git stash apply,OK你之前写的东西又回来了

  • 善于使用add命令来解决部分提交,可以使用ide自带的图形化工具来进行文件的筛选,add到暂存区,再使用commit命令来提交,这么多的好处就是你可以随时的控制需要提交的文件。当然你也可以直接通过commit -a 的组合命令来直接提交,但我不推荐这么做。

  • git有强大的后悔药功能,即使你做了一些你可能认为无法挽回的错误。

8. git实际工作中的使用和一些常见的问题

  1. 如果你使用的是git命令的话,错误出现时首先是仔细阅读错误提示,一般错误提示都很明确,通常也会给出解决的方案,只要你理解了git的工作原理,相信很快的就能解决问题
  2. 我的建议是也是git命令+图形化工具结合的方式。git命令更有助于你强化git思想,当然这个不会强制要求,个人的工作方式不一样。
  3. 我们大部分的工作基本也就是add + commit + merge + pull + push五个命令
  4. 自动合并,一般不用我们干预,代码会自动进行合并,使用命令可能会弹出合并的说明,这个直接直接输入:q!回车跳过就可以了
  5. 合并中间状态 merge | master ,进入这种状态是git无法进行自动合并,需要我们自己来处理冲突,这个时候你首要的任务就是要处理冲突,处理完之后把文件add并commit,这个时候你才真正的处理完了冲突,你的分支也显示正常了
  6. 合理的规划自己的本地分支。个人建议本地与远程仓库交互的分支不要直接作为开发分支

9. git flow简述

10. git标签

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

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,853评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,902评论 0 11
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,493评论 0 13
  • 今天女儿放学回来,带了一位朋友来玩!这位朋友是同村的,比窦悦嘉大!平时两人非常要好!我们窦悦嘉以前都把她送到家门口...
    夏雪_54bd阅读 145评论 0 1
  • 那年 我14,你大我20 十四岁,豆蔻年华 那时候就想 遇见你,是这一生中多么幸福的事 时光飞逝 十年过去了 我2...
    上官紫郁阅读 207评论 1 2