Git 中的一些抓狂经历,平时遇不到,一遇到就很操蛋。

部分参考:Oh Shit, Git git-flight-rules

branch

本地分支太多了,老子要删掉。

# 看一眼本地有哪些分支
git branch 
 
# 删掉本地对应分支
git branch -d <本地分支名>

远程分支有点多余,老子要删掉。

# 看一眼远程有哪些分支
git branch -r
 
# 删掉远程对应分支
git push origin --delete <远程分支名>

要从远程分支 checkout 一个新分支

# 常规写法
git checkout -b <本地分支名> <远程分支名>
 

 
# 简写
git checkout --track <远程分支名>

老子忘记当前分支是基于哪个分支创建的了

git reflog show <分支名>

commit

老子提交信息打错了,要把提交信息改一下

# 输入命令根据提示修改提交信息
git commit --amend

老子提交之后(还未 push),发现还有东西忘记提交了

# 正常 add
git add <忘记提交的文件路径>
 
# 把这次提交合并到最新的一次提交中
git commit --amend --no-edit

靠,点错了。这个文件不应该提交,撤回这次提交(未 push)

# 本质上是让 head 指针指向上一次提交
git reset --soft HEAD@{1}
 

 
# 让 head 指针指向上一次的 commit 
git reset --soft <commit id>

reset

我要让当前分支恢复成最初的样子

# 重置当前分支到的最近的一次提交
git reset HEAD --hard
 
# 重置当前分支到的远程分支的最新一次提交
git reset <远程分支名> --hard

我要把文件移出暂存区

git reset head --mixed 
 

 
git reset head

merge

靠,merge 错分支了,我要恢复 merge 前的状态

# ORIG_HEAD 变量保存了 merge 前的 HEAD 变量
git reset --hard ORIG_HEAD

cherry-pick

  • 摘樱桃,把一次或多次 commit 应用到当前分支

oh shit! 最新的提交解决了一个历史 bug,其他分支代码也要修改这个 bug。

# 应用场景:假设已修复 bug 的分支是 bug-fix,需要修改 bug 的分支是 release-1.0
 
# 1.切换到需要修改 bug 的分支
git checkout release-1.0
 
# 2.使用 cherry-pick
git cherry-pick <bug 修复的 commit id>
 

 
git cherry-pick bug-fix

revert

  • 用于撤销历史的某次更改,例如:bug 或者功能
  • 回滚某次发布

产品加了个没卵用的功能,现在要上线,这个功能还要不要?

# 不上线该功能:把该功能对应的 commit id 并 revert,之后会产生一个新 revert 提交。
git revert <commit id>
 
# 最终还是决定要上: 只需对 revert 提交进行 revert
git revert <revert 提交的 commit id>

stash

我要把改动文件暂存起来,不想提交这些文件

# 给改动存储
git stash
 

 
# 给改动取名并存储
git stash save <自定义名称>

忘记了 stash 中存储了哪些改动

# 列举所有的 stash 信息
git stash list

我要取出改动,应用到 feature 分支

# 切换到 feature 分支,把改动取出应用到 feature 分支并自动删除 stash
# 命令末尾加 <stash id> 应用指定的 stash 
git stash pop
 

 
# 把改动取出应用到 feature 分支,stash 不会删除
# 命令末尾加 <stash id> 应用指定的 stash 
git stash apply

老子要手动删除 stash 信息

# 删除全部的 stash 信息
git stash clear
 
# 删除指定的 stash 信息
git stash drop <stash id>

tag

我去,tag 怎么用啊,老板跟我说打个 tag

# 创建 tag
git tag <标签名>
 
# 将创建的 tag 推到远程仓库
git push origin <标签名>
 

丢,手抖打错了 tag 名称,怎么删了这个 tag 啊

# 删除本地 tag
git tag -d <标签名>
 
# 删除远程仓库中的 tag
git push --delete origin <标签名>

log

嗨,忘记上次提交改了哪些文件

# 查看每次提交文件
git log --name-only 
 

 
# 查看每次提交的文件,以及对文件进行的操作
git log --name-status