(English)
使 feature branch 始终包含 master branch 的最新代码,并保持 git 线索清晰。
要达成上述目标不难,每天不间断 merge 最新代码到 feature branch 就行了。但是,这样做的副作用就是 git history 线索混乱,从master合并过来的代码会不断插入到现有的代码线索中,feature branch 上自身的 commit 东一个西一个不能放在一块,不便 review,不便合并整理。
每日通过 rebase 集成 master branch 的最新代码。先更新 master 分支,再 checkout 到工作分支通过 rebase 更新。
参考指令:
git stash // if needed
git checkout master
git pull --rebase
git checkout your_branch
git rebase master // solve the conflict if needed
推送到远程库:也要检查集成 master branch 的最新代码,并清理提交记录。 参考指令:
git rebase -i HEAD~n // 整理提交,n 为需要整理的提交次数,从最后一次提交数起
git checkout master
git pull --rebase // 保证 master 是当前最新
git checkout your_branch
git rebase master // solve the conflict if needed
git push origin --delete your_branch // if this branch is in the remote repository
git push origin your_branch
多用 rebase 可以显著减少一般提交(commit)记录和合并(merge)记录,但时间隔的太长的分支,用 merge 可能会减少处理 conflict 的难度。一般说,feature branch 到 master branch 的合并记录是有意义的,可以标识和区分一个 ticket 的代码,而 master branch 到 feature branch 的合并记录看起来更像是无谓合并,而且会使线索混乱,用 rebase 更好。
在你执行合并(merge)或变基(rebase)操作之前,可以使用 git branch bak_bransh
创建一个备份分支备用。
如果有多个同事工作在同一个分支,你在执行rebase
时要特别小心可能带来的冲突。
解决 rebasing/merging 时的冲突
$ git add the_file_you_changed
$ git rebase --continue
如果你想取消rebase
,可以执行这个: git rebase --abort
清理本地 git 库
$ git remote prune origin
$ git gc --prune=now
附:
git remote prune origin
(from Curt Tudor’s mail)git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }' | grep Cao
(from Robert Seaton’s mail)注:本文最早大约是2016年初写给公司同事参考使用,考虑到无敏感性而有通用性,略作修改后在这里发布。