Git Merge
最后更新
git merge 把另一个分支上的提交并入当前分支。如果当前分支没有分叉,Git 会执行快进(fast-forward),只是把分支指针往前移。如果两个分支都有新提交,Git 会创建一个合并提交,把两段历史连在一起。和 rebase 不同,merge 会原样保留两个分支的历史。
在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。
语法
| 命令 | 作用 |
|---|---|
git merge feature | 把 feature 合并到当前分支 |
git merge --no-ff feature | 始终创建合并提交 |
git merge --ff-only feature | 只有能快进时才合并 |
git merge --squash feature | 把该分支的所有提交压缩成一个 |
git merge --abort | 取消有冲突的合并 |
快进合并与合并提交
| 情况 | Fast-forward | Merge commit (--no-ff) |
|---|---|---|
| 会创建新提交 | 否 | 是 |
| 保留分支的记录 | 否 | 是 |
| 发生在 | 当前分支没有分叉时 | 两个分支都有新提交时 |
解决合并冲突
当两个分支改动了相同的行,Git 会暂停合并。
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1 | 编辑有冲突的文件 | 选出正确的内容,删除冲突标记 |
| 2 | git add <file> | 标记冲突已解决 |
| 3 | git commit | 完成合并 |
git merge 常见问题
Git 怎么把一个分支合并到另一个分支?
先切换到要合并进去的目标分支(例如
git switch main),再运行 git merge feature。Git 会把 feature 上的提交并入 main:能快进时直接快进,两个分支都有分叉时则创建一个合并提交。快进合并和合并提交有什么区别?
如果另一个分支分出去之后,你的当前分支没有再前进,就会发生快进:Git 只是把指针往前挪,不产生新提交。如果两个分支都有新提交,Git 会创建一个合并提交,把两段历史连起来。用
--no-ff 可以强制总是创建合并提交,用 --ff-only 则要求必须能快进。怎么解决合并冲突?
合并出现冲突时,Git 会在相关文件里用
<<<<<<<、======= 和 >>>>>>> 标出冲突的部分。逐个编辑文件,保留正确的内容并删除这些标记,然后对解决好的文件执行 git add,再用 git commit 完成合并。怎么撤销或中止一次合并?
如果合并还在进行中(冲突尚未解决),运行 git merge --abort 即可取消,并恢复到合并前的状态。如果合并已经在本地完成,
git reset --hard ORIG_HEAD 会把分支退回合并前的位置(和 HEAD~1 不同,它在快进合并之后也能正确工作,但会丢弃尚未提交的改动)。如果合并已经推送,请使用 git revert -m 1 <merge-hash>。可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中运行
git merge,无需安装。Coddy 的免费互动 Git 课程也会一步步教你合并分支和解决冲突。