完全掌握git(一)html
① 工做区
所谓工做区,就是你在电脑里能看到的目录,能够简单地理解为咱们的项目根目录就是工做区。
② 版本库
所谓版本库,就是在项目根目录下执行git init
命令以后,会在项目根目录下生成一个.git目录,正常状况下,这个.git目录是隐藏的,这个.git目录就是版本库。
③ 暂存区
所谓暂存区,就是.git版本库目录中存放的index文件,因此咱们也会把暂存区叫做索引(index)区。git
因此,完成一次提交包括三个步骤,首先对工做区中的内容进行修改,而后经过add命令将工做区的修改归入到暂存区中,最后将暂存区的修改经过commit命令提交到版本库中。segmentfault
git status
命令用于查看当前工做区中所发生的修改,以及其中哪些修改已经添加到了暂存区中,简单说,就是status命令能够查看工做区中有哪些文件尚未被追踪,哪些被追踪的文件被修改后有没有被添加到暂存区(当前在工做区仍是在暂存区)。spa
> git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: foo.txt 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: index.html Untracked files: (use "git add <file>..." to include in what will be committed) bar.txt
能够看到,bar.txt是新添加的文件,尚未被git追踪;index.html是已经被追踪的文件,在工做区中修改后尚未提交到暂存区;foo.txt是在工做区中修改后同时将修改添加到了暂存区中。code
① git diff
: 不带任何参数的git diff
命令,是比较工做区和暂存区的差异。好比,工做区中某个文件发生了修改,可是还未添加到暂存区中,此时工做区和暂存区是有差异的,经过git diff
命令便可查看到工做区的修改内容。
② git diff --cached
: 带上了--cached参数,此时同git diff --staged
,比较的是暂存区和最后一次提交的差异。好比,工做区内容修改后,同时将工做区的修改添加到了暂存区中,那么此时,暂存区和最新一次提交是有差异的,由于目前最新一次提交是上次的提交。
③ git diff head
: head表示的最后一次提交(最新的提交),是比较(工做区和暂存区)与最后一次提交的差异,便可以同时查看工做区、暂存区与最后一次提交的区别。htm
① 取消工做区的修改: 若是对工做区的内容进行了修改,可是该修改尚未添加到暂存区,那么能够经过git checkout -- <file>
的方式来取消工做区的修改。
② 取消暂存区的修改: 若是对工做区的内容进行了修改,同时该修改已经添加到了暂存区,那么能够经过reset命令来重置暂存区,由于工做区的修改提交到了暂存区,如今暂存区和最后一次提交出现了差异,因此咱们能够将暂存区重置到head位置,即最后一次提交的位置,便可恢复暂存区,即git reset head <file>
,head后面不加文件名则表示重置暂存区中的全部文件。
③ 回退到某个版本: 若是通过一系列操做后,想要回到某个版本,那么能够经过git reset --hard <commit-id>
回到指定的提交位置。不加--hard,也能够回到指定的提交位置,可是不会清空工做区的修改,只会清空暂存区的修改,而加上--hard则表示彻底回到指定的提交位置。blog
对应项目中的一些文件,咱们可能不想被版本库追踪。咱们能够在项目根目录下新建一个.gitignore文件,而后将不须要被版本库追踪的文件添加到.gitignore文件中。须要注意的是,.gitignore文件只能忽略还未被版本库追踪的文件。对于已经被版本库追踪的文件,若是也想忽略,怎么办呢?已经被版本库追踪的文件之因此不能被忽略,是由于该文件在暂存区中,因此若是咱们把该文件从暂存区中删除不就能够了吗。索引
> git rm --cached <file> > git add <file> > git commit --message 'untrack some file'
不过,该方法有一个很差的地方就是从暂存区中删除后,须要提交一次。咱们还能够经过 git update-index --assume-unchanged <file>
那么该文件就不会被版本库追踪了,也不须要将其加到.gitignore文件中。若是想恢复,那么能够执行git update-index --no-assume-unchanged <file>
get
当咱们在某些事情进行到中间的时候,忽然发现须要先快速修复某个问题,可是咱们又不想丢弃以前的工做,那么咱们能够经过 git stash
命令将这些工做区和暂存区的修改都保存到本地。执行git stash
命令后,工做区和暂存区当即变干净了,此时能够着手一些更紧急的bug,等bug修复后,再以前的工做恢复出来,能够经过 git stash pop
将栈顶的stash恢复。也能够经过git stash list
查看全部的stash,而后恢复指定的stash,如:it
> git stash Saved working directory and index state WIP on master: 3f5aa1b add bar.txt > git stash list stash@{0}: WIP on master: 3f5aa1b add bar.txt > git stash pop stash@{0}