给「强迫症患者」的 Git 使用小贴士

给「强迫症患者」的 Git 使用小贴士

以前用不好 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 改为 squashs,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 用的开心,玩的愉快 :)