跳到主要内容

合并 Commit

2024年04月27日
柏拉文
越努力,越幸运

一、认识


二、合并 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-1commit-4 之间的所有 commit 合并。所以, 我们的目标 commit-hashcommit-1commit-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分支