1、Git基本工做流程git
git init缓存
git clone服务器
git仓库分为两种状况:app
第一种是在现有项目或目录下导入全部文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库学习
git init –bare git 建立一个裸仓库spa
讲述完了git的区域,接下来说解下git文件的状态,其实git的状态无外乎两种:已跟踪和未跟踪,已跟踪的文件说明的是被归入版本控制的文件,在上一次快照中有它们的记录,在工做一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工做目录中除已跟踪文件之外的全部其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工做目录中的全部文件都属于已跟踪文件,并处于未修改状态。3d
讲解下文件变化周期,好比咱们在项目中添加了一个文件a,这时候文件a处于的状态则是Untracked未跟踪状态,当咱们git add的时候这时候就会将文件放到暂存区中这时候状态变为Stage,当咱们commit这个暂存区的文件后这个文件就变成未修改状态,由于没有进行修改过了相对于版本控制中的文件,当咱们修改了a文件后这时候从unmodified变成modified(修改状态),这是再git add的时候就会将修改的文件变成stage,放入暂存区用于等待commit。版本控制
往暂存区里面添加东西使用以下git指令指针
git addcode
从暂存区提交到历史记录使用以下指令
git commit
查看工做区和暂存区之间的区别,来确保提交时咱们所须要的呢?
git status
从暂存区里面删除内容
git rm
工做区内重命名文件或者移动文件,而后再把他们添加到暂存区
git mv
确保工做区内里面不须要的文件不被添加进去添加到暂存区和历史。
.gitignore
新建一个仓库
git init git_init
cd git_init
touch a //新建a文件
git add a //将a添加到暂存区
git status会显示咱们要提交的内容a文件,这时候a两个文件都是Changes to be committed也就是待commit的状态。
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: a
git commit -m “initial commit”//提交a文件到版本控制中。
touch b新建文件b
git add b //将b放入暂存区中
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: b
编辑一下a文件,这时候在调用git status
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: a new file: bb
这时候a文件是出于修改状态,那么若是咱们在进行修改a文件时候,在调用下git status会发生什么奇怪的事呢?let’s go。
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: a new file: bb Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: a
这时候咱们会发现两个modified a,这是为何呢?可是两个文件分别存在暂存区和非暂存区,实际上暂存区内只保存了git add的版本,而最新修改的一份没有提交到暂存区内还在工做区域中,因此咱们会看到两个,若是这时候调用git commit的话就只会讲已经在暂存区的文件存入到版本控制中,而最新修改的那一次记录没有被提交。
固然这里还提供了跳过暂存区的方法就是git commit –a –m“注释内容”能够直接跳过暂存区直接提交到记录里面去。
将a移除整个项目
git rm a
清楚缓存中的内容,也就是已经暂存的文件
git rm a –cached
给文件重命名将a文件名换成c
git mv a c
假设工做区里面有这么一些文件以下图所示:
在第一次add都尚未进行的时候,暂存区尚未被建立出来,当咱们add的时候会建立一个暂存区出来(文件分开add产生两个数据对象),以下图所示:
.git目录下面多了一个index的文件,那么这个index文件就是咱们所说的暂存区的文件,那么每一条索引都是hash值表示以及它对应的文件名。每一个索引还包含了他的文件模式权限还有status number来表示他的合并状态、时间戳等。每个索引都是跟对象库的文件是对应的。好比说file.txt这里对应的是标号1,那么file2.txt对应的就是标号2(上图所示标号),这个index里面除了维护了索引以外还维护了提早计算好的tree对象的内容,也就是咱们的顶层的目录tree以及folder的tree对象内容,当咱们提交的时候他能够迅速的根据咱们已经计算好的内容生成一个tree对象,而后添加到历史记录里面。
当咱们修改了file2.txt的时候,这时候git add到暂存区时,发现对象库里面新创了一个对象,那么暂存区的这条索引就被指向新对象的索引替换掉。这时候git暂存区又重新计算了下顶层目录tree对象的一个内容。当咱们提交的时候咱们直接使用已经计算好的内容建立好一个新的tree对象,生成一个commit对象将master分支上面的HEAD指针指向当前commit对象上去。以下图所示:
这里的标号8指向的就是新生成的commit对象。
1.建立分支git branch
2.给固定的commit作标记 git tag
3.分支之间进行切换 git checkout
4.切换分支以前保存本地修改 git stash
5.合并分支 git merge
例子建立一个分支名字叫test并切换到当前的分支上去。
这时候分支的名称再也不是master而是改变成为test分支。编辑下a文件用test分支进行提交
切换到master分支上面咱们看一下a的内容
并无test分支在a中添加的内容这时候咱们切换分支时会使用咱们分支上最新的一个提交来还原咱们的暂存区和工做区内容,那么可让咱们在不一样的分支之间独立的作本身的工做。
git log –oneline –decorate –graph –all
咱们能够看到提交的记录或提交这些提交的引用
给第一个提交加一个名称tag
git tag “v0” f6699b3
在查看下git log –oneline –decorate –graph –all
多了一个tag:v0使用git show v0查看下内容,这是打的tag是一个轻量级的只是一个固定的引用。
而使用git tag –a的方式进行添加时会是一个tag对象,他有tag的属性,包括提交人时间等信息。
Tag指向了一个提交commit
Tag也可使用checkout进行操做
可是它当前的没有指向一个分支而是指向了一个commit,这时候就会出现一个问题就是咱们切换分支的时候这一部份内容就有可能被遗弃掉,也就是说head引用直接指向了一个commit而不是一个分支名,checkout提供了针对当前commit新建一个分支的方法并切换到当前分支。
git checkout -b “ttt_v0”
接下来切换master分支
这时候会用的git stash进行保存工做区,由于咱们切换checkout的时候会覆盖掉当前的内容因此咱们先将其保存起来。若是想要保存暂存区就可使用-a来保存。
Git stash save -a “stash1”
这时候咱们来查看下缓存区状态git status的时候是很干净的以下图:
下面咱们切换到master分之下,在切换会ttt_v0下时咱们要还原stash里面的内容
会有一个stash的缓存内容存在,下面咱们来恢复stash里面的内容,并将缓存区内容还原。
git stash pop –index stash@{0} 这里的标记红色的表示stash里面的第0个stash
咱们会发现以前修改的a文件已经在暂存区内贮备提交了
使用git stash apply –index stash@{0}这种方式时git stash list里面的内容是不会被清理掉的这里–index是恢复暂存区内容
使用git stash drop stash@{0}清除掉,若是不加stash@{0}引用的话他默认会清楚stash栈最上面的一个。
清楚多个stash的时候使用git stash clear
1.git show
2.git log
3.git diff
输入git log –oneline –decorate –graph –all查看完整的历史示意图。
git log -p经常使用的选项是 -p,用来显示每次提交的内容差别, 你也能够加上 -2 来仅显示最近两次提交:
咱们能够根据查看git show f6699b3的信息
最新的一次提交能够用git show master 或者git show HEAD,也可使用git show master^表示master分支的第一次提交master^2表示第二次提交
一般咱们会用git diff来回答两个问题:第一个就是当前作了什么尚未提交暂存区?第二个问题就是当前那些文件已经暂存了等待提交?
git diff 这个命令是查看当前工做区与暂存区快照的差别,也就是那些尚未暂存起来。
图中显示的是暂存区和工做区的区别在于a文件被修改了添加了next edit file。请注意,git diff 自己只显示还没有暂存的改动,而不是自上次提交以来所作的全部改动。 因此有时候你一会儿暂存了全部更新过的文件后,运行 git diff 后却什么也没有,就是这个缘由。
回顾:
所谓的分支就是一个commit记录的引用以下图所示:
在这些分支上工做会产生各自的历史记录(commit记录)所谓的分支切换就是指的Head指针的切换以及暂存区和工做区的一个还原,好比说咱们如今当前Head指向的位置处再建两个分支以后他们所指向的commit都是同一个以下图所示:
分支切换后以下图所示:
而tag指向了一个固定的commit记录,以下图所示:
分为两种一种是轻量级的一种是标签对象,主要区别就是轻量级的tag只是一个固定的链接,可是标签对象就是建立标签的时候会产生一个标签对象,这个标签对象存储在.git/object目录里面,tag对象里面包括对数据对象的指向,以及建立时间数据对象类型和建立人等信息。
举个例子来讲明一下分支切换以及合并:
开始的状态是这样的,咱们提交了三次commit后的示意图以下:
当咱们使用了git branch test的时候,将会在当前位置处新建一个分支,分支的名称叫test,可是分支并无切换依然是master分支(Head的指向)以下图所示:
咱们在master分支上面工做会产生master分支上面的commit记录以下图所示:
这个时候咱们是用git checkout test的时候HEAD指针就会指向test,而且还原暂存区和工做区内容。以下图所示:
继续在test分支上面进行工做,会产生test对应分支上面的commit记录
咱们来讲一下合并,合并分为两种一种是fast-farword merge也就是说test所指向的commit记录他实际上是master所指向的commit所衍生出来的以下图所示:
蓝色部分是master分支,红色部分是master分支所衍生出来的分支。这时候咱们在master分支上面进行合并git merge test不会产生新的commit记录出来,master分支指向test分支所指向的commit记录上去,而后把工做区和暂存区还原成了test的暂存区和工做区内容。以下图所示:
另一种就是non-fast-farword merge也就是咱们的三方合并。
咱们能够看到master指向的commit和test只想的commit有一个共同的父节点就是70e4d8这个节点。Master指向的commit和test指向的commit并无一个衍生的关系,这时候咱们在master分支上面git merge test,会生成一个新的commit来承载两个分支的历史内容
这篇文章非一天写完的我也是在学习的过程当中总结,以及参考大婶们写的文章加本身的理解写成的,若是这里有些错的或者有雷同的请各位大神指点一二。小丁谢过,写一篇文章确实不容易,能支持的就支持下不能支持的就当没看过这篇文章就行了。写篇文章容易么?写完了还被移除首页,已经发了两篇了第一篇只是开始被移除了首页~看看这个给不给我移除首页吧~