合并 Commit
一、认识
二、合并 Commit
2.1 创建临时分支
基于 xx分支
通过 git checkout -b temp-xx分支
创建一个临时的分支来保存当前状态,以防出现意外。
git checkout -b temp-xx分支 // 保存 xx 分支状态
git checkout xx分支 // 切换 xx 分支状态
2.2 确定合并的 commit-hash
基于 xx分支
通过 git log
或者 git log --oneline
查看合并目标 commit-hash
git log --oneline
2.3 基于 commit-hash 合并 Commit
我们通过 git rebase -i 目标 commit-hash 的之前一个 commit-hash
或者 git rebase -i 目标 commit-hash^
来合并目标 commit-hash
之后的所有 Commit
。因为 git rebase -i commit-hash
不包含这次 Commit
,所以需要是前一个。而 comit-hash^
表示这个 comit-hash
之前的一个 comit-hash
。
比如说, 我们 git log --oneline
查看该分支提交记录, 记录如下:
933ba20 (HEAD -> bolawen-1, origin/bolawen-1) commit-4
341c268 commit-3
e4fab35 commit-2
8622ddf commit-1
518dc98 (origin/master, origin/HEAD, master) 推送
我们的目标是将 commit-1
到 commit-4
之间的所有 commit
合并。所以, 我们的目标 commit-hash
是 commit-1
的 commit-hash
。但是 git rebase -i commit-hash
合并命令不包含 commit-hash
,所以需要目标 commit-hash
的前一个, 就是 (origin/master, origin/HEAD, master) 推送
这个的 commit-hash
518dc98
。
因此,合并命令为: git rebase -i 518dc98
或者 git rebase -i 8622ddf^
2.3 编辑交互式 rebase 列表并标记
编辑交互式界面, 将第一个 Commit
保持为 Pick
, 其他 Commit
设置为 f
, f
作用为使用该 Commit
变更, 但是会被合并到前一个 Commit
当中,且会抛弃本次 Commit
中的 Commit Message
。 下面是快速将 2-n
行的 Pick
修改为 f
的方法:
1. 针对n
值比较小的时候: 如果有两到三行 Commit
时, 可以快速的通过 VIM
快捷键来改, 比如:
pick commit1-message
pick commit2-message
pick commit3-message
我们借用 VIM
快捷键,快速编辑, 操作如下:
// 1. 移动光标到第 2 行行首,执行 rf, 意思是将当前光标位置字符替换为 f
rf
// 2. 向后移动光标, 执行 x, 意思是删除当前光标位置字符
x
2. 针对n
值比较大的时候: 如果有 n
多个 Commit
,此时, 一个一个的改成 f
有点慢。比如:
pick commit1-message
pick commit2-message
pick commit3-message
pick commit4-message
pick commit5-message
所以, 我们借用 VIM
批量替换, 替换语句如下:
// :起始行号,结束行号s/pick/f/g
:2,5s/pick/f/g
// 或者
// :其实行号,最后一行s/pick/f/g
:2,$s/pick/f/g
结果如下:
pick commit1-message
f commit2-message
f commit3-message
f commit4-message
f commit5-message
可以看到,我们借助 VIM
批量替换语法快速的完成交互式编辑。提高了合并 Commit
效率。
2.3 合并成功且代码无影响删除临时分支
git branch -d temp-xxx分支
三、回滚合并之后的 Commit
如果发现合并之后代码有丢失或者没有合并成功,想要恢复之前的状态,我们可以通过以下步骤来完成。
3.1 确定合并的 commit-hash
基于 xx分支
通过 git log
或者 git log --oneline
查看合并的 commit-hash
git log --oneline
3.2 基于合并 commit-hash 回退到合并之前的状态
git reset --hard 合并commit-hash^ // 合并commit-hash^ 表示 合并commit-hash 之前的一个 commit-hash
git push -f
3.3 xx分支 同步 temp-xx分支 代码 恢复之前状态
git rebase temp-xx分支
git push -f
git branch -d temp-xx分支