Git暂存,标签和撤销更改

avatar
开发工程师 @西安众邦网络科技有限公司

当我们在开发项目的时候,突然来一个变更需要修改,但你又不想提交,这时我们除了将当前项目提交(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 -agit stash save -a “注释”)慎用
  • git add . 然后再使用 git stash git stash save “注释”来暂存修改
  • 添加 -u 参数 (git stash -u git stash save -u “注释”) 推荐
    注: stash@{id}里面的id默认从0开始

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

git stash list  
-------------------------  
stash@{0}: On masterOrder: masterOrder  
stash@{1}: On devOrder: devOrder 

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

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

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

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

-## git设置用户名和邮箱  
+## git配置 设置用户名和邮箱  
* `git config --global user.email xxx@163.com` 配置用户邮箱  
-* `git config --list 或 git config -l` 查看全局配置  
+* `git config --list 或 git config -l` 查看git系统配置  
+* `git config --global -l` 查看git全局配置  
+* `git config --global --unset user.name` 删除全局配置 

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

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

git stash drop 删除暂存区的stash

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

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

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

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

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

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

git tag 标签

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

  • **添加标签 **
git tag -a v1.1 -m "Release version" -a v1.1 标签名称 -m 后面时注释  
  • 查看所有标签
git tag --list 
  • 提交标签到远程服务器
git push origin --tags // 提交所有tag至服务器端    
git push origin v1.1 // 提交某个tag至服务器端

注:git push origin master操作不会推送标签到服务器端。

  • **切换到某个标签 **

git checkout [tagname]

切换到某个tag时, 不处于任何分支,处于有利状态,也未版本回退,请不要再次tag上修改,修改bug可以基于此tag创建分支并提交

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

git 撤销更改

  1. 本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改。
git checkout -- <filename>   
git checkout -- . (所有修改文件)  
  • 将工作区中的文件的修改撤销,只撤销还没有add到暂存区的文件,不会撤销暂存区的文件,只放弃了修改的文件,新增和删除的不会被放弃
  • 本地新增或删除了一堆文件(并没有git add到暂存区),想放弃修改
git clean -f <filename>
  1. 移除本地新增,修改或删除的未add的文件
  • 本地修改/新增了一堆文件,已经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 reset –hard [commit_id]  

将本地仓库重置为需要撤销的版本,然后使用

git push origin -f  

进行提交,这样可以强制远程仓库与本地仓库一致

  • 撤销commit注释(修改commit注释) 最近一次提交
git commit --amend -m '备注信息' 

即可覆盖上次信息合并为一次提交