git暂存,撤销更改等进阶用法

当我们在开发项目的时候,突然来一个变更需要修改,但你又不想提交,这时我们除了将当前项目提交(commit)后切换(checkout) 到其他分支外,我们还可以先将当前的修改暂存(stash)起来,然后再切换(checkout)到其他分支,而不需要提交(commit),这样就可以减少一个 commit

git stash 暂存文件

git stash 或 git stash save ‘注释’ 暂存修改

1、文件已经被git跟踪,只是修改了代码(而不是新增加文件),我们可以使用git stash或git stash save “注释” 来暂存修改。
2、如果有新添加的文件,那么就需要添加参数 -a(会把隐藏的文件或.gitnore忽略的文件也暂存)慎用 -u 只暂存未跟踪的文件

  • 添加 -a 参数 (git stash -a 或 git stash save -a “注释”)慎用
  • 先 git add . 然后再使用 git stash 或 git stash save “注释” 来暂存修改
  • 添加 -u 参数 (git stash -u 或 git stash save -u “注释”) 推荐
    注: stash@{id}里面的id默认从0开始 git-stash文档

git stash list 查看之前缓存的所有stash

1
2
3
4
$ git stash list
-------------------------
stash@{0}: On masterOrder: masterOrder
stash@{1}: On devOrder: devOrder

git stash show 查看某一次stash信息 修改了哪些文件

git stash show -p ‘stash@{0}’ 查看某一次stash信息 查看修改文件里修改的内容

1
2
3
4
$ git stash show stash@{0}
-------------------------
gulpfile.js | 1 +
1 file changed, 1 insertion(+)

git stash apply 取出暂存区的stash 但不在stash list中删除

  • git stash apply 不指定stash 则默认取出第一条stash暂存
  • git stash apply stash@{1} 取出指定stash

git stash drop 删除暂存区的stash

  • git stash drop 不指定stash 则默认删除第一条stash暂存
  • git stash drop stash@{1} 删除指定stash

git stash pop 取出并删除暂存区的stash

  • git stash pop 不指定stash 则默认取出并删除第一条stash暂存
  • git stash pop stash@{1} 取出并删除指定stash

git stash clear 清空stash列表中所有的stash

如果你使用的是vscode中windows的powershell命令行,则需要注意操作某个指定的stash时, 'stash@{1}' 需要加上引号,否则会有如下问题,使用git bash命令行或者cmder等命令行工具可以不用加

1
2
3
git stash apply stash@{1}
----------------------
unknown option: -encodedCommand

stash drop 误删恢复

1
2
3
1. git fsck --lost -found :查看最近移除的文件
2. git show '误删编号':查看删除文件内容
3. git stash apply '误删编号': 本地合并误删的文件内容

参考:git stash drop 误删恢复

git tag 标签

项目的版本管理中,每当一个release版本发布时,需要做一个记录,以便以后需要的时候重新打包这个版本,这时候就用到tag这个功能.

  • 添加标签 git tag -a v1.1.0 -m "Release version" -a v1.1.0 标签名称 -m 后面时注释
  • 查看所有标签 git tag --list
  • 提交标签到远程服务器

    1
    2
    3
    git push origin --tags // 提交所有tag至服务器端
    git push origin v1.1.0 // 提交某个tag至服务器端
    // 注:git push origin master操作不会推送标签到服务器端。
  • 切换到某个标签 git checkout [tagname]
    切换到某个tag时, 不处于任何分支,处于有利状态,也未版本回退,请不要再次tag上修改,修改bug可以基于此tag创建分支并提交

  • 查看某个标签信息 git show v1.1.0
  • 删除标签 git tag -d v1.1.0
  • 删除远程服务器标签 git push origin :refs/tag/v1.1.0

git 撤销更改

  • 本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改。
    git checkout -- <filename> 或 git checkout -- . (所有修改文件)

将工作区中的文件的修改撤销,只撤销还没有add到暂存区的文件,不会撤销暂存区的文件,只放弃了修改的文件,新增和删除的不会被放弃

  • 本地新增或删除了一堆文件(并没有git add到暂存区),想放弃修改
    git clean -f <filename> 移除本地新增,修改或删除的未add的文件

git回退

  • 本地修改/新增了一堆文件,已经git add到暂存区,想放弃修改。
    git reset [HEAD] <filename> 或 git reset [HEAD] . 或者 git 高版本可用 git restore --staged <filename>
  • 本地通过git add & git commit之后,但还未git push,想要撤销此次commit
    git reset commit_id 或 git reset --hard commit_id
  • 撤销git push到远程的代码 (谨慎操作)
    首先在本地仓库使用git reset –hard [commit_id]将本地仓库重置为需要撤销的版本,然后使用git push origin -f 进行提交,这样可以强制远程仓库与本地仓库一致
  • 撤销commit注释(修改commit注释) 最近一次提交
    git commit --amend -m '备注信息' 即可覆盖上次信息合并为一次提交

参考资料

git各种情况的版本回退
Git撤销修改
Git中文网-GitLab中文网 - Git安装、git使用、git下载、git中文
非常不错的git-tips
三年 Git 使用心得 & 常见问题整理

-------------本文结束感谢您的阅读-------------
0%