Skip to content

Instantly share code, notes, and snippets.

@jpzhu
Last active August 29, 2015 14:02
Show Gist options
  • Save jpzhu/93ba3d5ef5e4820da525 to your computer and use it in GitHub Desktop.
Save jpzhu/93ba3d5ef5e4820da525 to your computer and use it in GitHub Desktop.
git three tree

Git做为一个版本控制工具,它的版本管理是在提交 记录区 里,也就是commits。变量HEAD会指向最新的提交。
除了提交记录之外,还有 工作区(work directory)和 缓冲区。缓冲区有好几个名字,cache/stage/index 都是指,这个区。 本文就针对这个3个区会在日常工作中用到的命令进行简单的总结。

Git的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的3个diff

git diff

默认执行的是工作区和缓冲区的比较。有的时候你会发现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

git diff --cached

该命令是比较缓冲区和提交记录里的区别。也就是你准备提交入库的代码和当前最新版本(HEAD)的区别。

i--n--d--e--x_a--r--e--a VS c--o--m--m--i--t_H--E--A--D

git diff HEAD

该命令是比较当前工作区和提交记录里(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

Git的3个reset

我们假设当前的最新提交是C9,并且当前缓冲区和工作区的内容是W9和I9,在执行reset到C2时,不同reset方式对Git的影响。

git reset --soft C2

soft reset 会将当前工作的HEAD指针指向C2,不会对缓冲区和工作区做改动。

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:-----------------------------------------I9  
工作区域:-----------------------------------------W9  

git reset --mix C2

mix reset 除了更改HEAD指向外,还将缓冲区的内容也更新到和C2一样的内容。git reset默认是mix模式。

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:---------C2--------------------------------  
工作区域:-----------------------------------------W9  

git reset --hard C2

hard reset 会清除本地所有的改动。将缓冲区和工作区都变回和C2一样的内容。假如你要回到某个版本做编译,可以用此命令。

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:---------C2--------------------------------  
工作区域:---------C2--------------------------------  

Git的3个存区

w--o--r--k d--i--r--e--c--t--o--r--y		c--o--m--m--i--t HEAD   
    |                               		    |   
    |<------  git add FILENAME      		    |<------  git reset HEAD FILENAME   
    |                               		    |   
    v                               		    |   
index area                          		    |       index area   
    |                               		    |           |   
    |<------  git commit            		    |	        |<------  git checkout -- FILENAME   
    |                               		    |	        |   
    v                               		    V	        v   
cc--o--m--m--i--t HEAD              		w--o--r--k d--i--r--e--c--t--o--r--y   

Git的3个diff

git diff

w--o--r--k_d--i--r--e--c--t--o--r--y VS i--n--d--e--x_a--r--e--a

git diff --cached

i--n--d--e--x_a--r--e--a VS c--o--m--m--i--t_H--E--A--D

git diff 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

Git的3个reset

git reset --soft C2

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:-----------------------------------------I9  
工作区域:-----------------------------------------W9  

git reset --mix C2

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:---------C2--------------------------------  
工作区域:-----------------------------------------W9  

git reset --hard C2

                   __________HEAD  
                  /  
提交记录:C0-->C1--C2-->C3--C4-->C5--C6-->C7--C8-->C9  
缓存区域:---------C2--------------------------------  
工作区域:---------C2--------------------------------  
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment