18.6.2 分支user2/i18n变基
图 18-8 使用分支合并时版本库的分支状态
很显然,采用变基操作的分支关系图要比采用合并操作的简单多了,看起来更像是集中式版本控制系统特有的顺序提交。因为减少了一个提交,也会减轻代码审核的负担。
下面开发者user2就通过变基操作将特性分支user2/i18n合并到主线,具体操作过程如下。
(1)首先确保开发者user2的工作区位于分支user2/i18n上。
$cd/path/to/user2/workspace/hello-world/
$git checkout user2/i18n
(2)执行变基操作。
$git rebase master
First,rewinding head to replay your work on top of it…
Applying:Add I18N support.
Using index info to reconstruct a base tree…
Falling back to patching base and 3-way merge…
Auto-merging src/main.c
CONFLICT(content):Merge conflict in src/main.c
Failed to merge in the changes.
Patch failed at 0001 Add I18N support.
When you have resolved this problem run "git rebase—continue".
If you would prefer to skip this patch,instead run "git rebase—skip".
To restore the original branch and stop rebasing run "git rebase—abort".
变基遇到了冲突,看来这回的麻烦可不小。冲突是在合并user2/i18n分支中的提交"Add I18N support"时遇到的。首先回顾一下变基的原理,参见第2篇“第12章改变历史”的相关章节。对于本例,在进行变基操作时会先切换到user2/i18n分支,并强制重置到master分支所指向的提交。然后再将原user2/i18n分支的提交一一拣选到新的user2/i18n分支上。运行下面的命令可以查看可能导致冲突的提交列表。
$git rev-list—pretty=oneline user2/i18n^…master
d81896e60673771ef1873b27a33f52df75f70515 Fix typo:-help to—help.
10765a7ef46981a73d578466669f6e17b73ac7e3 Bugfix:allow spaces in username.
90d873bb93cd7577b7638f1f391bd2ece3141b7a Add I18N support.
0881ca3f62ddadcddec08bd9f2f529a44d17cfbf Refactor:use getopt_long for arguments
parsing
刚刚发生的冲突是在拣选提交"Add I18N suppport"时出现的,所以在冲突文件中标识为他人版本的是user2添加多语种支持功能的提交,而冲突文件中标识为自己版本的是修正两个Bug的提交及开发者user1提交的重构命令行参数解析的提交。下面的两个表格(表18-2和表18-3)是文件src/main.c发生冲突的两个主要区域,表格的左侧一列是冲突文件中的内容,右侧一列则是冲突解决后的内容。为了方便对照进行了适当排版。
将完成冲突解决的文件src/main.c加入暂存区。
$git add-u
查看工作区状态。
$git status
Not currently on any branch.
Changes to be committed:
仔细看看上面运行的git push命令,终于看到了引用表达式中冒号前后使用了不同名字的引用。含义是用本地的user2/i18n引用的内容(提交ID)更新远程共享版本库的master引用内容(提交ID)。
执行拉回操作,可以发现远程共享版本库的master分支的确被更新了。通过拉回操作本地的master分支也随之更新。
(1)切换到master分支,会从提示信息中看到本地master分支落后远程共享版本库master分支两个提交。
$git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits,and can be fast-forwarded.
(2)执行拉回操作,将本地master分支同步到和远程共享版本库相同的状态。
$git pull
Updating d81896e..c4acab2
Fast-forward
src/Makefile|21++++++++-
src/locale/helloworld.pot|46++++++++++++++++++++
src/locale/zh_CN/LC_MESSAGES/helloworld.po|62++++++++++++++++++++++++++++
src/main.c|18++++++—
4 files changed,141 insertions(+),6 deletions(-)
create mode 100644 src/locale/helloworld.pot
create mode 100644 src/locale/zh_CN/LC_MESSAGES/helloworld.po
特性分支user2/i18n也完成了历史使命,可以删除了。因为之前user2/i18n已经推送到远程共享版本库,如果想要删除分支不要忘了也将远程分支同时删除。
(1)删除本地版本库的user2/i18n分支。
$git branch-d user2/i18n
Deleted branch user2/i18n(was c4acab2).
(2)删除远程共享版本库的user2/i18n分支。
$git push origin:user2/i18n
To file:///path/to/repos/hello-world.git
-[deleted]user2/i18n
补充 实际上变基之后user2/i18n分支的本地化模板文件(helloworld.pot)和汉化文件(helloworld.po)都需要做出相应更新,否则hello-world的一些输出不能进行本地化。更新模板需要删除文件helloworld.pot,再执行命令make po。重新翻译中文本地化文件,可以使用工具lokalize或kbabel。具体的操作过程就不再赘述了[1]。
[1]在本篇第20章"20.3.1 StGit"一节会弥补这一遗憾,完善Hello Word的本地化。