打理历史——rebase、stash、tag、cherry-pick
这是修整已有历史的手艺。威力大,也随之带来一条绝不能破的黄金法则。
学习目标
- 能用交互式 整理自己的历史
- 能把手头的活儿先搁一边,之后再取回来
- 能用 tag 标出发布点,用 cherry-pick 单独摘一个过来
从这里开始,动的是已经写下的历史。git rebase 把你的提交挪到另一个提交之上重新接好,把历史捋成一条直线。如果说 merge 留下的是「事情本来的样子」,rebase 整理的是「读起来的样子」。加上 -i(交互式),你能在公开之前把提交、改写信息或调换顺序。
只有一条黄金法则:已经和别人共享过的提交,不要 rebase。rebase 会新建提交,把原来的替换掉。所以如果别人正基于原来的提交在做事,历史就会分叉,收拾起来很麻烦。在自己的上、开 之前尽管用,之后就别用了。
git stash 把没做完的活儿先搁到架子上——突然来了紧急 bug、必须马上切分支时就用它。git tag 给某个提交钉上 v1.0.0 这样的名字,让你能精确找回发布时的。git cherry-pick 从别的分支上只摘一个提交过来。这三样都是「不整体、只取局部」时用的工具。
轻松理解
stash 是一个抽屉,可以把做到一半的活儿迅速放进去。rebase 把你的提交重新摞到最新的 main 之上,就像你是后来才开始的一样。tag 是给发布版本夹上的书签,cherry-pick 则只把一个提交抄到另一条分支上。
本步骤要掌握的命令
别光用眼睛看,去里真敲一遍。手记住了,工作时才使得出来。
git rebase -i HEAD~3- 交互式整理最近三个提交:合并、改信息、调顺序。
git stash push -m "작업 중"- 把当前改动连同备注收起来,好马上切换分支。
git tag -a v1.0.0 -m "첫 배포"- 给这个提交打上带说明的标签,标为发布点。
git cherry-pick <commit>- 只把别的分支上的某一个提交拿到当前分支来。
常见错误和改正方法
对已经 并共享的提交做 rebase,然后强制 push。队友们的历史就乱了。黄金法则:只 rebase 还没有人 过的、你自己的提交。要撤销已经共享的东西,用 revert。
这一栏由你自己标记,这里不打分。
要把这一阶段标记为已理解吗?
目前还不能取消,请在真正理解后再标记。
已标记为理解
这一栏由你自己标记,这里不打分。