以前用不好 Git,很多不优雅的 commit,因为总总无奈,被提到了生产,作为代码洁癖症患者,就特别难受。
如今大悟,积累了一些 Git 的「奇技淫巧」,仿佛打开了金手指,整个人就一种感觉 ——— 一切尽在掌握 :P
不过切记,生产分支代码,不要做任何破坏性的操作。
1. 临时代码不想提交,但马上要切一个新分支改东西
这种情况可以先用 git stash
把代码暂存起来,新分支改完内容后再切回当前分支,再使用 stash pop
把暂存区的代码取出来。还可以使用 stahs list
查看暂存区的其它缓存。
- 关键命令如下:
git stash
git stash pop
git stash list
2. git pull 后,代码提交线分叉了
这里要介绍 fetch 和 rebase 两个命令,简单来说,git pull=git fetch + git merge
,因为 git merge,代码合并就会产生2条提交线。解决这个问题,可以用下面的命令git fetch + git rebase
代替 git pull
,如此一来,提交线就是直直的一条了。
- 关键命令如下:
git fetch
git rebase feature
不过这样用,如果 feature 分支起点落后于 master 分支, rebase 的时候,feature 的 commit 会落后于 master 新提交的 commit。如果想让提交线看起来正常一点,可以先在 feature 上 rebase master,再切到 master rebase feature。
- 关键命令如下:
git fetch
git checkout feature
git rebase mater
git checkout mater
git rebase feature
3. 想把一条 commit 从 master 里删掉
可以用下面的 git revert
命令,而不是再提交一个修改 commit.
- 关键命令如下:
git revert <commitHash>
现在你又想把这一次 commit 拿回来了,这时你可以用 git cherry-pick
命令。
- 关键命令如下:
git cherry-pick <commitHash>
4. commit 了自己不想提交的信息
可以用下面的命令,修正一下最后一次提交的备注。
- 关键命令如下:
git commit --amend
5. 已经 commit 但不小心又删除了,且没有备份
可以用 git reflog
命令,找回丢失的代码,这可能是你最后的救命稻草。
- 关键命令如下:
git reflog
git reset --hard <commitHash>
6. 一个功能 feature 提交了太多次 commit 感觉不优雅
This is super power, 可以重构提交线,其威力不亚于坐上时光机,回到过去改写历史。
找到要合并 commit 的前一个 commitHash, 用 git rebase -i
命令, 通过将 commit 前面的 pick 改为 squash 或 s,pick 的 commit 会被保留,s 的 commit 会并到上一条 commit 上,如此就可以达到合并 commit 的目的。
基于这个命令,你可以将多条 commit 并为一条或者两条或者多条,当然也可以互换 commit 的位置。
注意:合并代码后,可能需要用 git push -f
强制推送,如果本地有一些代码被提交到远端了。
- 关键命令如下:
git rebase -i <rebasePreCommitHash>
...
git push -f
- 如下面的例子所示,有4个commit,将 commit-2 合并到 commit-1,将 commit-4 合并到 commit-3,成为新到2个commit。
pick b979183 commit-1
s 0a1c8b2 commit-2
pick 628359a commit-3
s 628359a commit-4
# Rebase 6174d2d..628359a onto 6174d2d (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
.....
- 最后再说一个更具破坏性的 trick,这样做很危险,千万不要在生产分支上搞这个操作。
如果期间 merge 了代码,导致 rebase -i 的时候特别麻烦,或者 commit 多到发指,可以用 git reset --mixed <rebasePreCommitHash>
将想要合并的改动恢复到暂存区,然后 commit 一次搞定。
- 关键命令如下:
git reset --mixed <rebasePreCommitHash>
git commit -m <commit-all>
7. 便捷到来回切换分支(one more)
方便的切回上一个分支
- 关键命令如下:
git checkout -
最后,祝你 Git 用的开心,玩的愉快 :)