Git 提交步骤文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
图例中,有主干 master,支线分支 branch。
其中,master 提交 ID 记录为:C1 → C2 → C3 → C4。
branch 提交 ID 记录为:C1 → C2 → C5 → C6。
Merge 操作
在 branch 分支上执行 git merge master 命令。
Merge 步骤将 master 代码与 branch 代码合并,那么需要处理两个分支之间的冲突,只需要处理一次,最终生成 C7 提交。最终 branch 分支的提交 ID 记录为:C1 → C2 → C3 → C4 → C5 → C6 → C7。其中 C3、C4、C5、C6 提交记录中的顺序由提交的时间决定。
Rebase 操作
Rebase 步骤rebase 操作的前提是 工作区 和 本地库 不能有任何修改存在。
rebase 分支前,先执行 fetch 下载最新的代码,否则可能会存在最终不能 push 的情况。
尽量少用 --force 或者 -f 参数,进行强制性操作。
首先会产生 rebase 分支(master)的备份,放到(no branch )临时分支中。再将支线分支(branch)的每一次提交修改,以补丁的形式,一个个的重新应用到主干分支上。这个过程是一个循环应用补丁的过程,期间只要补丁产生冲突,就会停止循环,等待手动解决冲突。这个冲突指的是上一个合并后版本与补丁之间的冲突。(例如:C5 补丁时,需要解决的是 C4 与 C5 的冲突,C6 补丁时,需要解决的是 C4 + C5 版本与 C6 之间的冲突),手动解决冲突完成,通过 git add 命令更新内容,执行 git rebase --continue 命令继续后续循环,通过 git rebase --skip 命令,可以跳过某一次补丁(存在上一轮冲突的解决方案中,已经包含了这一轮的补丁内容,这样会使补丁无效,需要跳过),通过 git rebase --abort 命令,可以在循环执行过程中,进行回滚,循环完成后执行命令无效。
循环完成后会更新 branch 分支,删除(no branch)临时分支。最终 branch 分支提交 ID 记录为 C1 → C2 → C3 → C4 → C5' → C6'。之前的 C5 和 C6 提交将被删除。
检查代码无问题后,通过 git push origin branch 命令更新提交内容。如果发现分支合并有错误,就只能删除本地分支,重新下载分支,重新进行 rebase 操作。
使用 Rebase 的必要性和注意事项:
使得历史变得更加清晰,保持了良好的版本迭代,容易追溯,方便回滚。
公共分支并行开发,rebase 可能会引发本地历史 commit 记录与服务端历史记录不一致,rebase 之后,只能强行用 --force 推送代码,这样做会进行非线性提交,强制更新服务端的历史记录,就很有可能会造成其他开发人员 commit 丢失的情况。因此一个分支多人维护情况下,尽量少用 rebase。
快捷操作:
在 branch 分支上执行 git pull origin master --rebase 命令,相当于执行:git fetch + git rebase
每次都加 --rebase 似乎有些麻烦,可以指定某个分支在执行 git pull 时默认采用 rebase 方式:
$ git config branch.master.rebase true
如果觉得所有的分支都应该用 rebase,那就设置:
$ git config --global branch.autosetuprebase always
这样对于新建的分支都会设定上面的 rebase=true 了。已经创建好的分支还是需要手动配置的。
高级应用:
可以使用 git rebase -i commitid 或者 git rebase --interactive commitid 进入 rebase交互模式。(从整个分支commit初始阶段置commitID设置位置)。
进入交互模式后,提供了一些交互命令。
#Commands:
#p, pick = use commit
#r, reword = use commit, but edit the commit message
#e, edit = use commit, but stop for amending
#s, squash = use commit, but meld into previous commit
#f, fixup = like "squash", but discard this commit's log message
- 交互模式下,直接置换提交的顺序就能达到重新排序的效果。
- 如果判断不会发生冲突,使用 squash 命令,可以合并当前提交与前一个提交,并且会调用编辑器合并 commit 信息。
- 如果指定 edit,可以修改当前 commit 信息或者提交的内容、分割当前分支。
- 交互模式下,可以直接删除提交。
- 交互修改完成后保存退出,通过 rebase --continue 完成 rebase 操作。
网友评论