Git做为一个版本控制工具,它的版本管理是在提交 记录区 里,也就是commits。变量HEAD会指向最新的提交。
除了提交记录之外,还有 工作区(work directory)和 缓冲区。缓冲区有好几个名字,cache/stage/index 都是指,这个区。 本文就针对这个3个区会在日常工作中用到的命令进行简单的总结。
我们在开发调试代码的时候都是在工作区里,如果代码觉得改动到了一定阶段了,还不是太完美,那么你可以将其放入缓冲区,执行的命令是git add FILENAME。接着继续本地改动,然后提交进入缓冲区。 直到你觉得缓冲区内容已经满意了,这时你可以用git commit命令将代码提交进入版本。
w--o--r--k d--i--r--e--c--t--o--r--y
|
|<------ git add FILENAME
|
v
index area
|
|<------ git commit
|
v
cc--o--m--m--i--t HEAD
反过来操作是,假如你对自己工作区的改动很不满意,都什么垃圾代码啊,那么这时你可以取出缓冲区的代码,命令是git checkout -- FILENAME。如果对缓冲区里的代码也不满意,那么可以用git reset HEAD FILENAME,将代码回退到没有改动前的状态。
c--o--m--m--i--t HEAD
|
|<------ git reset HEAD FILENAME
|
|
| index area
| |
| |<------ git checkout -- FILENAME
| |
V v
w--o--r--k d--i--r--e--c--t--o--r--y
默认执行的是工作区和缓冲区的比较。有的时候你会发现git status有变动,而git diff去没有内容,就是因为你刚刚执行过git add命令后,工作区和缓冲区内容一样的原因。
w--o--r--k_d--i--r--e--c--t--o--r--y VS i--n--d--e--x_a--r--e--a
该命令是比较缓冲区和提交记录里的区别。也就是你准备提交入库的代码和当前最新版本(HEAD)的区别。
i--n--d--e--x_a--r--e--a VS c--o--m--m--i--t_H--E--A--D
该命令是比较当前工作区和提交记录里(HEAD)的区别。
w--o--r--k_d--i--r--e--c--t--o--r--y VS c--o--m--m--i--t_H--E--A--D
我们假设当前的最新提交是C9,并且当前缓冲区和工作区的内容是W9和I9,在执行reset到C2时,不同reset方式对Git的影响。
soft reset 会将当前工作的HEAD指针指向C2,不会对缓冲区和工作区做改动。
__________HEAD
/
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9
缓存区域:-----------------------------------------I9
工作区域:-----------------------------------------W9
mix reset 除了更改HEAD指向外,还将缓冲区的内容也更新到和C2一样的内容。git reset默认是mix模式。
__________HEAD
/
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9
缓存区域:---------C2--------------------------------
工作区域:-----------------------------------------W9
hard reset 会清除本地所有的改动。将缓冲区和工作区都变回和C2一样的内容。假如你要回到某个版本做编译,可以用此命令。
__________HEAD
/
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9
缓存区域:---------C2--------------------------------
工作区域:---------C2--------------------------------