Git学习篇(一)

来源:互联网 发布:刺客信条主角排名知乎 编辑:程序博客网 时间:2024/05/17 06:15

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 gitgit --versionvim .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 setaddto 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 xxxgit 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.txtgit checkout xxx.txt

运用实例图如下

git rm xxx.txt 命令同时移除了工作区和暂存区的,如果你只想移除暂存区的索引,可以这样操作

git rm --cached xxx.txt//一个一个添加移除太麻烦,还可以同时操作多个文件git rm a b cgit 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" xxxxxxxgit 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很不开森,但是这视频的确不错

0 0