git stash用於將當前工做區的修改暫存起來,就像堆棧同樣,能夠隨時將某一次緩存的修改再從新應用到當前工做區。linux
yang@Ubuntu64:~/code/linux/git$ vim hello.c yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..bdc92a5 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func1(void) {printf("this is func1");} +void main(void) {return func1();}
yang@Ubuntu64:~/code/linux/git$ git stash Saved working directory and index state WIP on master: 452b08d rename hello as hello.c HEAD is now at 452b08d rename hello as hello.c yang@Ubuntu64:~/code/linux/git$ git status On branch master nothing to commit, working directory clean
yang@Ubuntu64:~/code/linux/git$ vim hello.c yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..9c5bff3 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1 @@ +some bad chenges.... yang@Ubuntu64:~/code/linux/git$ git checkout . yang@Ubuntu64:~/code/linux/git$ git stash pop On branch master 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: hello.c no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (208ca2e2c0c455da554986a6770a74ad0de5b1e0) yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..bdc92a5 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func1(void) {printf("this is func1");} +void main(void) {return func1();}
注意,git stash pop 彈出成功後,暫存列表裏面就沒有了,若是當前工做區不乾淨,彈出時有衝突,則暫存列表會繼續保留修改。git
yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..bdc92a5 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func1(void) {printf("this is func1");} +void main(void) {return func1();} yang@Ubuntu64:~/code/linux/git$ git stash Saved working directory and index state WIP on master: 452b08d rename hello as hello.c HEAD is now at 452b08d rename hello as hello.c yang@Ubuntu64:~/code/linux/git$ git status On branch master nothing to commit, working directory clean yang@Ubuntu64:~/code/linux/git$ vim hello.c yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..7fd0a13 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func2(void) {printf("this is func2");} +void main(void) {return func2();} yang@Ubuntu64:~/code/linux/git$ git stash Saved working directory and index state WIP on master: 452b08d rename hello as hello.c HEAD is now at 452b08d rename hello as hello.c yang@Ubuntu64:~/code/linux/git$ git status On branch master nothing to commit, working directory clean
yang@Ubuntu64:~/code/linux/git$ git stash list stash@{0}: WIP on master: 452b08d rename hello as hello.c stash@{1}: WIP on master: 452b08d rename hello as hello.c
yang@Ubuntu64:~/code/linux/git$ git show stash@{0} commit 72e6a391bcad186ab24676aa1db8d5831c99cec9 Merge: 452b08d 6c95c30 Author: NickYang <yang@Ubuntu64> Date: Sat Mar 12 19:56:18 2016 +0800 WIP on master: 452b08d rename hello as hello.c diff --cc hello.c index e69de29,e69de29..7fd0a13 --- a/hello.c +++ b/hello.c @@@ -1,0 -1,0 +1,2 @@@ ++void func2(void) {printf("this is func2");} ++void main(void) {return func2();} yang@Ubuntu64:~/code/linux/git$ git show stash@{1} commit 7fcca4b66640c51ca76e637df03264b7c41885be Merge: 452b08d 1c37881 Author: NickYang <yang@Ubuntu64> Date: Sat Mar 12 19:54:35 2016 +0800 WIP on master: 452b08d rename hello as hello.c diff --cc hello.c index e69de29,e69de29..bdc92a5 --- a/hello.c +++ b/hello.c @@@ -1,0 -1,0 +1,2 @@@ ++void func1(void) {printf("this is func1");} ++void main(void) {return func1();}
發現stash@{0}對應func2的修改, stash@{1}對應func1的修改,原來新入棧的修改,其代號爲0,循環命名。算法
yang@Ubuntu64:~/code/linux/git$ git stash apply stash@{1} On branch master 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: hello.c no changes added to commit (use "git add" and/or "git commit -a") yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..bdc92a5 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func1(void) {printf("this is func1");} +void main(void) {return func1();}
可見git stash apply能夠將列表中任何一次修改應用到當前工做區,咱們再次git stash list一把:vim
yang@Ubuntu64:~/code/linux/git$ git stash list stash@{0}: WIP on master: 452b08d rename hello as hello.c stash@{1}: WIP on master: 452b08d rename hello as hello.c
yang@Ubuntu64:~/code/linux/git$ vim hello.c yang@Ubuntu64:~/code/linux/git$ git diff diff --git a/hello.c b/hello.c index e69de29..786c214 100644 --- a/hello.c +++ b/hello.c @@ -0,0 +1,2 @@ +void func3(void) {printf("this is func3");} +void main(void) {return func3();} yang@Ubuntu64:~/code/linux/git$ git stash save "this is func3" Saved working directory and index state On master: this is func3 HEAD is now at 452b08d rename hello as hello.c yang@Ubuntu64:~/code/linux/git$ git stash list stash@{0}: On master: this is func3 stash@{1}: WIP on master: 452b08d rename hello as hello.c stash@{2}: WIP on master: 452b08d rename hello as hello.c
咱們在save後面指定一個字符串,做爲提醒,這樣在git stash list查看時就能知道每個代號對應的修改了。緩存