用了一段时间的TortoisGit,基本能满足目前的需求。但是当切换到linux的工作环境时,就有点不知所措了,于是又复习了一下git的命令,相对于第一次学习,又有了新的认识。
1.关于工作区,暂存区,版本库
工作区(Working Tree):所有有改动的文件都存在于工作区。
暂存区(Index):对于已经存在于工作区的文件,执行git stage filename
后,文件会保存到暂存区中。刚添加跟踪的新文件也存在于暂存区。
版本库:执行git commit
后会将暂存区中的修改提交到版本库。
2.git add 和 git stage
在学习过程中因为没搞清git add
的作用导致担误了不少时间,最后发现git 的 add命令本就是一个不直观的命令,它有两个不同的作用:
1. 用于添加跟踪一个文件。
2.用于将工作区的文件添加到暂存区。
于是git 的后续版本中添加了git stage
代替git add
的第2个作用,但为了保持和以前的兼容,git add还保持着之前的用法,在很多教程中都没用使用git stage
,导致不利于理解。同时还添加了git diff –staged替代git diff –cached。
3. ~与^
~ 和 ^ 都代表某提交的上一次提交, ~1 == ~
, ^1 == ^
。~2代表上上次提交,如果当前提交为多个分支合并而来,则^n
(n = 1 ,2 ,3 ,4…)分别代表这些分支上的上一次提交。
4. git diff的用法
一次commit 之后,执行git stage filename
添到暂存区之后,再进行一些修改,此时执行git diff
,并添加不同的参数,会有以下区别:
1.git diff 显示当前工作区的文件和暂存区的差异
2.git diff –staged 显示暂存区和HEAD的差异
3.git diff HEAD 显示工作区和HEAD的差异
5. git reset
当希望回退到某个状态(commit, tag 等)时,使用git reset。有3个选项:
1. –soft 将HEAD指向目标commit,并且暂存区和工作区会增加HEAD和目标状态的差异,也就是说即使使用git reset –soft, commit的结果都是一样的,只是会删除某些commit记录。
2. –mixed(默认) 与soft的区别在于,mixed会重置暂存区(将修改放回工作区),并且工作区会增加HEAD和目标状态的差异。因此,git reset 可以作为git stage的反向操作。
3. –hard 回退到某个状态,重置工作区和暂存区,目标状态之后的所有更改都会丢失。
6. git checkout
git checkout filename
(当filename与分支同名时,需要在filename前加–)则是回退到上一次stage时的状态。
7. 关于hunk
hunk代表一个diff中一段连续的改动,git stage 就可以通过添加 -p选项以hunk为单位添加到暂存区。该功能可以用来在开发一个功能时,突然需要修复一个之前提交中bug,修改完成后添加到暂存区,先提交修复的bug,然后再提交当前实现的功能。
8.直接提交
使用git commit -am ” ” 直接提交工作区。
9.改变最近一次提交
对于你的最近一次提交,你经常想做两件基本事情:改变提交说明,或者改变你刚刚通过增加,改变,删除而记录的快照。
git commit –amend
持续更新