操蛋的 Git

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

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

branch

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

1
2
3
4
5
# 看一眼本地有哪些分支
git branch

# 删掉本地对应分支
git branch -d <本地分支名>

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

1
2
3
4
5
# 看一眼远程有哪些分支
git branch -r

# 删掉远程对应分支
git push origin --delete <远程分支名>

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

1
2
3
4
5
6
7
# 常规写法
git checkout -b <本地分支名> <远程分支名>



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

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

1
git reflog show <分支名>

commit

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

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

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

1
2
3
4
5
# 正常 add
git add <忘记提交的文件路径>

# 把这次提交合并到最新的一次提交中
git commit --amend --no-edit

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

1
2
3
4
5
6
7
# 本质上是让 head 指针指向上一次提交
git reset --soft HEAD@{1}



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

reset

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

1
2
3
4
5
# 重置当前分支到的最近的一次提交
git reset HEAD --hard

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

我要把文件移出暂存区

1
2
3
4
5
git reset head --mixed 



git reset head

merge

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

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

cherry-pick

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

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

1
2
3
4
5
6
7
8
9
10
11
# 应用场景:假设已修复 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 或者功能
  • 回滚某次发布

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

1
2
3
4
5
# 不上线该功能:把该功能对应的 commit id 并 revert,之后会产生一个新 revert 提交。
git revert <commit id>

# 最终还是决定要上: 只需对 revert 提交进行 revert
git revert <revert 提交的 commit id>

stash

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

1
2
3
4
5
6
7
# 给改动存储
git stash



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

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

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

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

1
2
3
4
5
6
7
8
9
# 切换到 feature 分支,把改动取出应用到 feature 分支并自动删除 stash
# 命令末尾加 <stash id> 应用指定的 stash
git stash pop



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

老子要手动删除 stash 信息

1
2
3
4
5
# 删除全部的 stash 信息
git stash clear

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

tag

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

1
2
3
4
5
6
# 创建 tag
git tag <标签名>

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

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

1
2
3
4
5
# 删除本地 tag
git tag -d <标签名>

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

log

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

1
2
3
4
5
6
7
8
# 查看每次提交文件
git log --name-only



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


操蛋的 Git
http://wszzf.top/2022/10/16/操蛋的 Git/
作者
Greek
发布于
2022年10月16日
许可协议