gitstash详解
转⾃:
应⽤场景:
1 当正在dev分⽀上开发某个项⽬,这时项⽬中出现⼀个bug,需要紧急修复,但是正在开发的内容只是完成⼀半,还不想提交,这时可以⽤git stash命令将修改的内容保存⾄堆栈区,然后顺利切换到hotfix分⽀进⾏bug修复,修复完成后,再次切回到dev分⽀,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分⽀开发的内容,却在master上进⾏了开发,需要重新切回到dev分⽀上进⾏开发,可以⽤git stash将内容保存⾄堆栈中,切回到dev分⽀后,再次恢复内容即可。
总的来说,git stash命令的作⽤就是将⽬前还不想提交的但是已经修改的内容进⾏保存⾄堆栈中,后续可以在某个分⽀上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分⽀,也可以恢复到其他任意指定的分⽀上。git stash作⽤的范围包括⼯作区和暂存区中的内容,也就是说没有提交的内容都会保存⾄堆栈中。
命令详解:
1 git stash
能够将所有未提交的修改(⼯作区和暂存区)保存⾄堆栈中,⽤于后续恢复当前⼯作⽬录。
$ git status
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: src/main/java/com/wy/CacheTest.java
modified: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on master: b2f489c second
$ git status
On branch master
nothing to commit, working tree clean
2 git stash save
作⽤等同于git stash,区别是可以加⼀些注释,如下:
git stash的效果:
stash@{0}: WIP on master: b2f489c second
git stash save “test1”的效果:
stash@{0}: On master: test1
3 git stash list
查看当前stash中的内容
4 git stash pop
将当前stash中的内容弹出,并应⽤到当前分⽀对应的⼯作⽬录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
顺序执⾏git stash save “test1”和git stash save “test2”命令,效果如下:
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
$ 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: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)
$ git stash list
stash@{0}: On master: test1
可见,test2的stash是⾸先pop出来的。
如果从stash中恢复的内容和当前⽬录中的内容发⽣了冲突,也就是说,恢复的内容和当前⽬录修改了同⼀⾏的数据,那么会提⽰报错,需要解决冲突,可以通过创建新的分⽀来解决冲突。
5 git stash apply
将堆栈中的内容应⽤到当前⽬录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应⽤到⼯作⽬录中,适应于多个分⽀的情况。
$ git stash apply
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: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
堆栈中的内容并没有删除。
可以使⽤git stash apply + stash名字(如stash@{1})指定恢复哪个stash到当前的⼯作⽬录。
6 git stash drop + 名称
从堆栈中移除某个指定的stash
7 git stash clear
清除堆栈中的所有内容
8 git stash show
查看堆栈中最新保存的stash和当前⽬录的差异。
$ git stash show
src/main/java/com/wy/StringTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
git stash show stash@{1}查看指定的stash和当前⽬录差异。
通过 git stash show -p 查看详细的不同:
$ git stash show -p
diff --git a/src/main/java/com/wy/CacheTest.java b/src/main/java/com/wy/CacheTest.java
index 6e90837..de0e47b 100644
--- a/src/main/java/com/wy/CacheTest.java
+++ b/src/main/java/com/wy/CacheTest.java
@@ -7,6 +7,6 @@ package com.wy;
*/
public class CacheTest {
public static void main(String[] args) {
- System.out.println("git stash test");
+ System.out.println("git stash test1");
}
}
diff --git a/src/main/java/com/wy/StringTest.java b/src/main/java/com/wy/StringTest.java
index a7e146c..711d63f 100644
--- a/src/main/java/com/wy/StringTest.java
+++ b/src/main/java/com/wy/StringTest.java
@@ -12,7 +12,7 @@ public class StringTest {
@Test
public void test1() {
- System.out.println("=================");
+ System.out.println("git stash test1");
System.out.println(Strings.isNullOrEmpty(""));//true
System.out.println(Strings.isNullOrEmpty(" "));//false
System.out.println(Strings.nullToEmpty(null));//""
同样,通过git stash show stash@{1} -p查看指定的stash的差异内容。
9 git stash branch
从最新的stash创建分⽀。
应⽤场景:当储藏了部分⼯作,暂时不去理会,继续在当前分⽀进⾏开发,后续想将stash中的内容恢复到当前⼯作⽬录时,如果是针对同⼀个⽂件的修改(即便不是同⾏数据),那么可能会发⽣冲突,恢复失败,这⾥通过创建新的分⽀来解决。可以⽤于解决stash中的内容和当前⽬录的内容发⽣冲突的情景。
发⽣冲突时,需⼿动解决冲突。
git使用详解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论