git相关blog都是一些从极客学院和一些blog上面学习到的知识,经过总结提炼而写,以作记录分享,本篇主要是git本地操作相关知识。
1. git简介
Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力
2. git安装配置
我们还是先来了解git的基本配置,安装就不多说了
which -a git
git --version
vim .bash_profile
git在电脑上可能存在多个版本,通过which -a git 命令列出所有版本,再通过git –version 命令查出当前使用git版本号
接着我们来配置git的版本,通过vim .bash_profile文件编辑
//***** /mingw32/bin/git****目标git的路径
export PATH=/mingw32/bin/git/bin:$PATH
vim编辑的命令很多,详情参考 vim命令集合,这里用到了i进入Insert模式,Esc进入底部编辑,:wq 保存并退出,如果出现如下结果:
e45 readonly option is set (add!to override)
只有读取的权限,表示权限不够,需要获取超级管理员权限,当然你也可以这样
:wq!
编辑好.bash_profile文件后重新载入即可。
source .bash_profile
下面呢我们先下载一个项目来作为实例学习git 使用,我们必须得懂的命令git clone path
git clone https://github.com/7heaven/bitmapMesh.git
通过命令下载github上面的开源项目需要配置github的账号才行,关于这方面更多知识稍后提到,下面再来说说git自动补全,bitmapMesh项目下载到了桌面,通过cd命令进入master,cd xxx/xx/ 命令在我们输入cd 任意字母+tab键可以自动补全目录
当我们的命令编写占满屏幕,脑子里冒过qq的清屏功能
clear
每次文件提交,都需要知道我们的名称、和邮箱,这里就需要我们配置好基本信息
git config --global user.name xxx
git config --global user.email xxx@xx.xx
git config 配置也分权限高低,下面从低到高排列
- git config –system
- git config –global
- git config –local
如果你对git config 还想深入了解,获取帮助,可以尝试以下命令(第③个方案个人是没成功,但有人成功了,具体原因不解)
① git config –help
② git help config
③ main git-config
尽管我们配置了我们的用户名还是可以修改的重新配置即可,而配置用户名的途径还可以用以下命令
git config --global --add user.name xxx
查询当前指定的用户名称有以下两种方法
① git config user.name
② git config –get user.name
③ git config –global –list //查看所有的设置的名称
用户名太多了,我们想要删除名称,那么就需要指定具体哪个
//如果只有一个用户名称,删除时可以不用指定具体名称
git config --global --unset user.name xxx
有一天,突然发现遗忘了git命令咋办呢,莫急我有妙招,自动提示相关git命令
git 任意字母x+tab
git命令我们还可以给他设置别名,设置好了就可以按照别名操作,举个实例 :clone 别名ce 那么 git clone =git ce ,具体别名设置方法如下:
git config --global alias.xx xxxx
查看git的操作日志
git log
但是如果日志过长,要退出,需要执行以下命令
ctrl+z
log日志看着不叫乱,我们可以考虑日志一行输出,同时采用别名实践一次
git config --global alias.logone "log --oneline"
git logone
3. git工作流程
在了解git工作流程之前我们必须懂得两条命令,一个是之前提到的git clone url,另一个就是本地仓库创建
git init xxx
创建好了仓库后会在该目录下面自动创建一个.git文件夹,如果你用的window系统,看不到目录,请在查看>隐藏文件打上勾,命令模式下 cd xxx/.git/可进入查看目录,ls列出目录,git init xxx创建的是一个带工作控件的仓库,下面创建一个裸仓库。
//切换盘符
cd f:
//退出命令
cd ..
//创建裸仓库
git init --bare xx
创建裸仓库不会自动创建.git文件夹,但会在里面直接创建 .git文件夹里面的所有文件。开发中经常会遇到一下情况,leader突然要求打一个版本分支出来,开发一个演示版本,这里我们可以用到git 神技能
//path1:项目地址 newName:克隆后的项目名称
git clone path1/ newName
效果如下图
下面正式来了解git 工作流程,可以分为三块: working directory(工作区)、staging area(暂存区) 、history repository(历史记录区),我们工作区先通过 git add命令添加到staging区,文件变为暂存文件,最后通过git commit 提交,大概流程图如下:
下面先来实践一下工具流程,首先git init 初始化仓库,创建两个文件,创建命令
touch xxx.txt
创建三个个文件后,我们在通过git status 查看文件状态
发现暂存区里面有两个暂存文件 test01、test02,我们再把这两个文件进行提交(没有配置user.name 、user.email 是无法提交的)
// git commit -m "xxx" xxx表示提交的log信息
git commit -m "Initial commit files "
完成提交后在调用git status 会提示我们working directory区间还有个test03文件还没添加到暂存区
接着我们把剩下的文件也一起添加提交到历史记录,再修改历史记录里提交的test01文件(vim命令编辑文件),修改完成后再来查看文件状态
从上图不难看出,我们修改了文件,需要我们把文件提交到暂存区,最后通过git commit 提交,当我们不需要提交的某个文件时,通过rm命令移除 工作区和暂存区的文件索引
git rm xx.txt
当我们删除了某个文件还没提交,要想找回来,可以通过 reset 、checkout相关命令
git reset HEAD xxx.txt
git checkout xxx.txt
运用实例图如下
git rm xxx.txt 命令同时移除了工作区和暂存区的,如果你只想移除暂存区的索引,可以这样操作
git rm --cached xxx.txt
//一个一个添加移除太麻烦,还可以同时操作多个文件
git rm a b c
git add a b c
我们需要修改文件名称,可以通过mv命令
git mv oldName newName
接下来再来了解.gitignore文件,通过vim编辑过滤掉需要提交的文件
① *.[rt] 忽略这些字母结尾的文件
②*~
③*.txt
④\~xxx 已经在忽略规则*~里面了,而文件名称含有~,此时不想忽略,需要添加反斜杠
⑤src/ 忽略当前的src目录
⑥**/src 忽略所有目录下的额src目录
⑦build/ 忽略build目录
⑧.DS_Store mac的隐藏文件
…………………………………………………………………………………………….
下面呢来编译查看android studio 里面的.gitignore文件源码(不做过多解释,大概看看就行了,如果你想了解更多,这里有个忽略规则博文)
4. 暂存区
通过vim命令编辑.git 文件下的index等类似文件,可以查看内部内容,这些文件内容都是什么,有什么作用呢,下面来通过一组图来了解暂存区与index、HEAD、objects、工作区之前的关系
git add命令执行,把文件变成暂存文件,在.git文件目录下的index文件会记录相应的索引,而objects文件存放对象
add完成后我们需要提交这些文件,.git 目录下的HEAD指向第一次提交的commint对象
当我们再提添加提交文件,会生成一个新的commit对象,HEEA指向最新的commit提交对象
–cache语法运用,移除暂存区的对应的index的所用和objects存放的对象
mv 修改文件名,暂存区和工作区都被重命名,而mv只是修改了名称,而文件内容未发生变化,索引的值不变
5. 本地分支与合并
本地分支与合并主要涉及到的命令有以下几个
- git branch //创建分支
- git tag //给固定commit做标记
- git checkout //切换分之
- git stash //切换分之前保存修改
- git merge //合并分之
首先我们需要创建一个分支
git branch branchName
然创建了分支并不代表我们就进入到了分支里面,还需要checkout切换到分支
git checkout branchName
在分支工作完成以后再切换回到master
git checkout master
checkout 和branch命令分开始使用是一件两人不开心的事,其实我们还可以跟简单一点
git checkout -b branchName
然而branch 编辑完成后回到master发现并没有变化,之前branch编辑的并没有在master同步,因为master指向分支的最新的一次提交的引用。我们可以使用tag来解决这一问题,首先Tag的创建
git tag "tagName" xxxxxxx
git tag -a "TAG" xxxxxxx
设置完后通过git tag查看刚才设置的tag,效果图如下:
如果你想要查看这些Tag的相应操作,可以通过show来查看
git show TagName
在你设置了Tag后也可以通过checkout tag来切换分支了
git checkout TagName
当切换到了TAG对应的分支进行编辑,add之后不能直接切换到其他分支,需要对文件进行commit或者暂存,这里就来了解暂存文件(保存当前编辑过得文件,在下次进入可以暂存文件继续载入编辑,在你不想提交的情况下可以这样操作)
git stash save -a "stashName"
在你切换分支后回到TAG对应的分支,通过list 查看分支暂存信息
git stash list
通过pop命名弹出分支的暂存文件
git stash pop --index xxx
效果图如下:
branch与master的合并通过merge命令
git merge branchName
有合并那么就有放弃合并分支
git merge --abort
6. 查看与对比历史纪录
- git show
- git log
- git diff //工作区与暂存区差异
之前提到过 git log show相关方法了,show命令用于查看目标下的操作,例如:git show master,如果你想查看master下面的commit的第一次提交,需要使用到^
git show master^ / git show master~
如果你想看第n次提交~+number即可
git show master~n
log命令可以输出完整的历史信息,如果信息过长,退出按Q键。查看每次提交的差异信息log日志:
git log --stat
git log /show 可以组合很多命令来一起使用,还可以给这些命令设置别名,这里就不具体细说,git diff 命令用于查看工作区与暂存区的差异,实例如下:
查看暂存器与历史提交的差异
git diff --cached
查看工作区与HEAD纪录的索引提交对应的提交差异
git diff HEAD~+Number
查看当前版本与指定版本的差异对比
git diff HEAD HEAD~+Number (如果需要细化到具体文件 -- +fileName)
如果还要细化到查看具体单词的差异,需要用到 –color-words,效果图如下
7. 撤销修改
先看图,这是一个vim编辑文件后撤销修改four.txt文件的示例
原理就是把暂存区文件取出来覆盖工作区。如果你的文件修改了之后add到了暂存区,需要执行撤销,通过reset命令可以
git reset xxxxxx
reset、checkout 是指向commit的提交。
查看已存在的文件那些可以删除以及删除这些文件,参考clean命令
git clean -n // clear下面命令执行将被删除的文件列表
git clean -f // 删除文件
上面clean命令示例如下
如果你不需要上次commit的内容,可以通过revert命令
git revert HEAD //撤销上次commit
8. 重写历史纪录
git commit –amend // 产生一个新的提交,用来替换掉当前指向的提交
git rebase
git reset // 可以撤销提交
git reflog
以上命令示例这里就不贴了,个人目的达到了,把代码push到了github,学习git就先到这里吧。
结语: 一天一个小模块,边学边纪录整理,但愿天长地久以后不会遗忘。上面知识对我来说主要是add commit push相关命令。
特别感谢 http://www.jikexueyuan.com/ 虽然曾经对极客学院各个群里宣传vip很不开森,但是这视频的确不错