在开始任何命令之前,先上一张图,下面的所有的命令都是围绕这张图展开的
常用命令#
初始化本地库#
git init
会生成一个.git结尾的隐藏文件
查看工作区文件的状态#
git status
红色表示新增或者被修改的文件, 绿色表示被管理(添加进缓存区)的文件,git status
命令查看不到被上传到本地库的文件
在这里再拓展一个命令: git checkout --file
可以撤销在工作空间对这个文件的修改
将文件添加进缓存区#
git add . git add [文件名]
把项目移除出缓存区#
git -rm --cached [名称]
提交到本地库#
git commit -m '描述信息'
查看历史提交#
git log git reflog
回退到上一个版本#
假设我们的版本迭代顺序是: 版本1 -> 版本2 -->版本3
- 先从版本3 回退到版本2
git log // 目的是找到历史版本的md5 tag值 git reset --hard [md5格式的tag值] // HEAD表示当前版本 // ^ 表示上一个版本, 100个^表示 : 第前100个版本 git reset --hard HEAD^
- 再从2回退到版本3
git reflog // 目的是找到历史版本的md5 tag值 git reset --hard [md5格式的tag值]
找回已经删除的文件#
找回已经删除的文件是有前提的,什么前提呢? 前提是: 这个被删除的文件曾经被上传到过本地库
第一种情况:, 我们在本地将文件删除了,并且这次更改的操作被commit到本地库,那么我们回退一下版本不就把文件找回来了?
第二种情况:, 我们在本地删除了这个文件,但是我们还没有将这次操作commit提交到本地库, 于是我们使用下面的命令,目的是,重新检出文件
git reset --hard [指针HEAD的hash值]
分支#
分支的目的是隔离不同的环境
指针的概念: 比如说在master是已经上线了的主分支,它里面存在1000个文件,还有第二个叫dev的开发分支,在这个所有的新功能的拓展都在这个用来开发的分支上编写,假设又新增了100个文件,其实这个叫dev的分支器中真正保存的是自己新增的100个文件,其他的1000个文件通过指针的方式指向master分支
查看当前的分支#
git branch
创建分支#
git branch [分支名] git checkout -b [分支名]
删除分支#
git branch -d [分支名]
合并分支#
git merge [分支名]
如何紧急修复bug#
如上图: 采用分支的特点,可以灵活的解决线上的bug, 为什么非的新开辟一个临时分支呢? 因为如果想让dev分支去修改bug是一个得不偿失的行为,很可能这时dev分支的开发人员已经写了很多天的新代码了, 让dev去修复bug,就的先让dev将本地的未写完的代码提交到本地库,然后从master分支上拉取代码到本地,这样诚然可以修改bug,但是修改完了后怎么提交呢? 没法提交啊,新代码往哪里放?
综上:,需要新开辟一个临时分支,临时分支,让临时分支去修改bug,然后让master去merge这个临时分支, bug修复后,临时分支可以剔除
本地的当前项目存在多个分支的话,做了个改动后得先提交到本地库才能再切换分支
产生冲突时报错#
在merge时,难免出现代码冲突, 向下面这样报错
$ git merge dev Auto-merging index2.html CONFLICT (content): Merge conflict in index2.html Automatic merge failed; fix conflicts and then commit the result.
这时需要我们手动去解决,然后重新 add到缓冲区, 再commit到本地库 ,git会我们生成类似下面这样的字符串
hello one git 9 <<<<<<<<<<<HEAD 10 hello two git edit by hot_fix 11 =========== 12 hello two git edit by master 13 >>>>>>>>>>> master 14 hello three git