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 <远程分支名>
|
老子忘记当前分支是基于哪个分支创建的了
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
|