git系统学习


title: git系统学习
date: 2018-12-21 23:00:00
tags:
- git
categories:
- git


git的特性

  1. 版本控制
    最终版,最终版1,最终版2
  2. 分布式
    分布式和集中式都需要中央服务器,不同的是分布式在工作电脑上保存了服务器的完整工程,即使服务器挂掉了,也不会影响工作电脑上的开发。
    集中式就不可以了。中央服务器挂掉,其他人就都不可以开发了。

git的安装和基本使用

安装

sudo apt-get install git

基本使用

//目录初始化
git init 
// 创建版本
vim code.txt
git add code.txt
git commit -m "create file code.txt"
// 查看版本记录
git log
// 版本回退
git reset --hard HEAD^  // HEAD表示当前的最新版本,也可以用版本编号(commit hash)
// HEAD^也是这样表示HEAD~1,回退四个版本git reset --hard HEAD~4

使用git reset 回退到低版本后,高版本并没有删掉。(但是git log看不到了)如果我们现在又想回到高版本该如何做?
git log看不到高版本的版本编号了,我们可以用git reflog 查看历史操作。就会看到我们高版本的commit hash(版本编号)
git reset --hard 版本编号

工作区和版本库

工作区就是本地工作的目录
版本库就是我们工作区下面的.git文件。

git版本库里有很多东西,其中最重要的就是本称为stage(或者叫index)的暂存区。

已经git add 到暂存区的文件,如何恢复?
git reset HEAD <file>
就相当于git add 命令的倒退,从暂存区清理code.txt,但是工作区的修改依然在。此时用git status,应该又提示文件修改,需要你git add

git只会用暂存区的修改来创建版本,工作区的修改如果没有添加到暂存区。git commit创建的版本中是不会包括工作区修改的内容的。
vim code.txt -> 添加第一行
git add code.txt
vim code.txt -> 添加第二行
// 没有git add 直接git commit
git commit -m "update code.txt" // 这个版本中是没有第二行内容的

撤销修改

编辑完工作区后,想撤销对工作区的修改

git checkout -- <file> 

编辑完文件,git add 提交到暂存区,突然又不想到暂存区的此文件的改动了

git reset HEAD <file>  // 这就是取消暂存
想要继续丢弃工作区的改动
git checkout -- <file>

总结撤销修改的三种情况
1.只在工作区修改,还没有提交到暂存区
git checkout -- <file>
2.工作区修改后,git add 提交到了暂存区
git reset head <file>
git checkout -- <file>
3 git add 并且已经git commit
git reset --hard HEAD^

git对比文件

工作区和版本库中的对比

git diff HEAD -- <file>
将工作区和版本库HEAD进行比较
如何看比较的内容?
---和+++ ,分队对应diff后面的第一个和第二个

--- a/<file> 代表HEAD版本中的
+++ b/<file> 代表工作区的
前面没有出现+或者-的,就是两个文件共有的

两个版本库中的对比

git diff HEAD HEAD^

删除文件

rm <file>
// 将删除的改动提交到暂存区
git add <file>
// 将删除的改动提交到版本库
git commit - "delete"

rm <file> 和 git add <file>,两个命令可以合为一个,git rm <file>

恢复删除

删除文件也是对工作区的改动,和上面修改文件的恢复是一样的。
在工作区删除后,发现删错了。想要恢复怎么办?
git checkout -- <file>

特别注意:

创建文件touch filename.txt后,如果没有git add添加到暂存区,git是不会开始管理这个文件的。
这个时候,如果你直接rm filename.txt,就真的删掉了。因为git本来就没有跟踪这个文件。

git基本操作小结

image.png

分支管理

工厂里面的流水线
平行宇宙

创建分支与合并分支

主分支,默认分支 master
刚才我们说HEAD指向最新的commit,严格的说:HEAD是指向master,master才是指向最新的commit






合并完分支之后,我们可以删除dev分支。删除dev分支就是把dev指针给删除掉。删掉后,我们就剩下一个master分支。


实验

git branch  //查看当前仓库又多少分支
  * master // *代表当前在那个分支里面
// 创建并切换到新的分支dev
git checkout -b dev
vim code.txt -> add online 
git add code.txt  // 在dev分支中进行开发
git commit -m "dev 分支提交"  // 此时master分支并没有改变
// 切换到master分支
git checkout master
// 查看master分支上有没有dev分支的操作记录
git log --pretty=online  //发现并没有dev分支的操作记录
// 合并分支
git merge dev 
    执行完命令后,我们发现出现又这样的提示,fast-forward,这属于快速合并。快速合并就是直接挪动master指针就可以。
// 删除分支
git branch -d dev  

分支-解决冲突

合并分支往往不是一帆风顺的。当我们在两个分支上都对一个文件进行修改了。那执行git merge命令的时候,就会提示自动合并失败。并给出冲突失败文件。当然我们执行git status 也会看到合并有冲突的文件。

这时候我们该怎么做?
需要手动融合,打开冲突文件进行手动融合。
融合之后,需要做一次新的提交。gti add *,git commit - “”
。HEAD指向master,master向前移动了,但是dev分支是不动的。

重点
有时候我们需要看分支图例
git log --graph --pretty=online

分支管理策略

没有快速合并,但是也没有冲突

我们在dev分支和master分支都做了修改,但是修改的不是同一个文件。我们合并时,不能使用fast-forward模式了,但是并没有冲突。

当我们在master分支上git merge dev时,命令行中会出现一次弹窗,让我们输入一个commit信息。
这种合并方式时recursive合并。这时候,git默认会给我们做一次新的提交。

强制禁止快速合并

是在什么样的情景呢?

git checkout -b dev后,在dev分支做了修改,提交了好几个commit。git checkout master,然后git merge dev。此时没有冲突,快速合并成功。
但是:我们在dev分支中的commit记录都没有了!!!

解决办法,禁用fast-forward
git merge --no-ff -m '禁用fast-farword合并' dev
这样就会重新做一次新的提交。

--no-ff指的是强行关闭fast-forward方式。
fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit
git merge --squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。
总结:
--no-ff:不使用fast-forward方式合并,保留分支的commit历史
--squash:使用squash方式合并,把多次分支commit历史压缩为一次


bug分支

使用场景

我们正在dev分支上开发,突然接到任务说时让我们赶紧修复一个bug。可是我们当前的工作还没有做完,还不能提交。怎么办?

我们可以把工作暂时保存起来。
git stash
就把我们的工作现场给保护起来了。git status一看,工作区都是干净的。

比如bug时在master分支下面,先git checkout master,然后创建bug分支
git checkout -b bug001
vim main.go
git add mian.go
git commit -m "修复bug001"
git checkout master
git merge --no-ff -m '修复bug001合并' bug001
git branch -d bug001
// 修复完成后,继续回到dev分支干活
git status  //工作区干净
git stash list  //列出保存的工作现场
// 恢复现场
git stash pop 
git status //已经回来了

修改bug时,先回到出现bug的分支上面。

分支管理小结

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

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,860评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,908评论 0 11
  • 12月加尔各答的夜晚依旧燥热,旅馆房间里又闷又吵。 我走出来,坐在旅店门口旁看行人。 旅店隔壁是个居民楼,一个黑黑...
    李毓儿e阅读 504评论 0 0
  • 2016-11-07 - 互联网上的小菜场 金融机构是有政府颁发的金融牌照,持有金融牌照意味着有政府背书,意味着出...
    杜WD阅读 137评论 0 0
  • 大家好,我是一名中学英语老师,每天的工作是与100多位青春叛逆期的孩子斗智斗勇,为了征服他们,我练就了特有杀伤力的...
    lijutong_010阅读 208评论 0 2