git stash 操作

git stash 操作

git stash 是一个还挺方便,但是不会也不太要紧的指令,主要的应用场景为当部分的代码被修改了,但是又不想要 commit 当前的变化,便可以使用 git stash 将所有的变化进行保存,保持 working tree 干净。使用 git stash 会还原到上一个 commit 的状态。想要获取 stashed 的文件,就可以使用 git stash pop

换言之,使用 git commit + git revert --soft HEAD~1 的组合技也一样,就是多打了几个字会稍微麻烦一些。

stash list

可以用来显示所有的 stash 记录

stash

没什么卵用的补充 git stash 的完整指令是 git shtash store

大多数情况下来说,使用 git stash + git stash pop 就够了,不过 git stash 是一个栈(通过 pop 推测的),自然也可以存储多个 stash,查看 stashed 的记录可以使用 git stash list,如:

➜  stashing git:(main) git stash
Saved working directory and index state WIP on main: 2ea1a40 initial commit
➜  stashing git:(main) git stash
Saved working directory and index state WIP on main: 2ea1a40 initial commit
➜  stashing git:(main) git stash
Saved working directory and index state WIP on main: 2ea1a40 initial commit
➜  stashing git:(main)git stash -m "another lorem"
Saved working directory and index state On main: another lorem
➜  stashing git:(main) git stash list
➜  stashing git:(main) git stash list






















stash@{0}: On main: another lorem
stash@{1}: WIP on main: 2ea1a40 initial commit
stash@{2}: WIP on main: 2ea1a40 initial commit
stash@{3}: WIP on main: 2ea1a40 initial commit
(END)

友情提示,可以使用 -m 这个 flag 添加一些信息,这样之后回来看 stashed 的变化也知道做了些什么。

stash pop

直接 stash pop 会进行退栈操作,如:

➜  stashing git:(main) git stash list
































stash@{0}: On main: pop first
stash@{1}: On main: stash example
stash@{2}: On main: another lorem
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
stash@{5}: WIP on main: 2ea1a40 initial commit
(END)
➜  stashing git:(main) git stash pop
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (780899dc334d6cd257fef560389fce018d314c08)
➜  stashing git:(main)git stash list






















stash@{0}: On main: stash example
stash@{1}: On main: another lorem
stash@{2}: WIP on main: 2ea1a40 initial commit
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
(END)

stash apply

使用 git stash pop <stash@{index}> 也可以选定指定的下标进行退栈操作,顺便,可以直接使用 index 而不需要输入完整的 stash@{index},如:

➜  stashing git:(main) git stash list
































stash@{0}: On main: revert current change to avoid merge conflict
stash@{1}: On main: stash example
stash@{2}: On main: another lorem
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
stash@{5}: WIP on main: 2ea1a40 initial commit
(END)
➜  stashing git:(main) git stash pop 1
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{1} (19fbf2dd8719108de5d3d904a5752fe47e0f362c)
➜  stashing git:(main)git stash list






















stash@{0}: On main: revert current change to avoid merge conflict
stash@{1}: On main: another lorem
stash@{2}: WIP on main: 2ea1a40 initial commit
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
(END)

可以看到,栈顶 stashed 的文件没有被弹出,反而是 index 为 1 的对应 stashed 文件被弹出。

stash apply

git stash apply <stash@{index}> 指令与将对应 stashed 文件应用于当前分支上,但是并不会进行退栈操作,如果某一条 stashed 的记录需要确认在多条分支上都需要工作时,就可以使用这个指令,如:

➜  stashing git:(main) git stash list
































stash@{0}: On main: stash changes
stash@{1}: On main: revert current change to avoid merge conflict
stash@{2}: On main: another lorem
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
stash@{5}: WIP on main: 2ea1a40 initial commit
(END)
➜  stashing git:(main) git stash apply stash@{2}
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
➜  stashing git:(main)git stash list























stash@{0}: On main: stash changes
stash@{1}: On main: revert current change to avoid merge conflict
stash@{2}: On main: another lorem
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
stash@{5}: WIP on main: 2ea1a40 initial commit
(END)

stash drop

git stash drop <stash@{index}> 用于删除对应 stashed 的变化,与 apply 对应,如:

➜  stashing git:(main)git stash list






















stash@{0}: On main: stash changes
stash@{1}: On main: revert current change to avoid merge conflict
stash@{2}: On main: another lorem
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
stash@{5}: WIP on main: 2ea1a40 initial commit
(END)
➜  stashing git:(main)git stash drop 1
Dropped refs/stash@{1} (1d6a06ed2ac0b17c6380a509224932c9137afd7e)
➜  stashing git:(main)git stash list



















stash@{0}: On main: stash changes
stash@{1}: On main: another lorem
stash@{2}: WIP on main: 2ea1a40 initial commit
stash@{3}: WIP on main: 2ea1a40 initial commit
stash@{4}: WIP on main: 2ea1a40 initial commit
(END)

其他

使用 stash 相关指令,尤其是应用变化(pop,apply)时可能会产生 merge conflict,这时候就比需要使用 commit 去解决 merge conflict。这也就是为什么说会用 stash 还挺方便的,不会的话新建 branch+commit+reset 也一样使用。毕竟需要修 merge conflict 的时候,总归都是要产生一个 commit 的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值