×

Git 合并案例:如何在两个分支中合并功能并排除某些修改

Falcon 2024-12-17 views:
自动摘要

正在生成中……

假设你正在维护两个版本的 WordPress 网站,一个是 4.x 分支(用于线上环境),另一个是 6.x 分支(用于未来版本的开发)。现在,在 4.x 分支中对 old-functions.php 文件做了修改,而你希望在将 4.x 分支的改动合并到 6.x 分支时,不接收 4.x 中对 old-functions.php 的修改,但仍保留其他功能。

目标

  1. 4.x 分支(stable)中的改动合并到 6.x 分支(main)。
  2. 忽略 4.x 中对 old-functions.php 的修改,而保留 6.x 中的版本。

步骤 1:使用 git merge 进行合并

首先,我们将 4.xstable)分支的更改合并到 6.xmain)分支,但我们希望避免 old-functions.php 的冲突。

1.1 切换到 main 分支

git checkout main

1.2 合并 stable 分支的改动

我们使用 git merge 合并 stable 分支的更改,但不立即提交:

git merge --no-commit --no-ff origin/stable
  • --no-commit:合并后不自动提交,允许你手动处理冲突。
  • --no-ff:强制创建一个合并提交,即使没有产生冲突。

1.3 解决 old-functions.php 的冲突

如果 old-functions.php 文件在 4.x 分支和 6.x 分支上都有修改,但你希望保留 6.x 分支的版本,可以使用 git checkout --ours 放弃 4.x 的修改:

git checkout --ours old-functions.php
  • --ours:保留当前分支(main)的版本,放弃合并分支(stable)的更改。

1.4 标记为已解决并提交合并

完成冲突解决后,使用 git add 标记 old-functions.php 文件为已解决:

git add old-functions.php

然后提交合并:

git commit -m "Merged stable changes into main, keeping 6.x changes"

1.5 推送到远程仓库

最后,将合并后的 main 分支推送到远程仓库:

git push origin main

步骤 2:使用 git cherry-pick 进行选择性合并

如果你只想从 4.x 分支中选择特定的提交(而非合并整个分支),git cherry-pick 是一个很好的选择。

2.1 切换到 main 分支

git checkout main

2.2 查看 4.x 分支的提交记录

使用 git log 查找你希望从 4.x 分支中引入的特定提交:

git log origin/stable

2.3 使用 cherry-pick 合并特定提交

使用 git cherry-pick 将你想要的提交应用到 main 分支:

git cherry-pick <commit-hash>

2.4 解决冲突

如果在 cherry-pick 时遇到冲突(比如 old-functions.php 的修改),可以使用以下命令保留 6.x 分支的版本:

git checkout --ours old-functions.php
git add old-functions.php

2.5 提交合并

完成冲突解决后,提交更改:

git commit -m "Applied selected changes from stable to main, excluding old-functions.php changes"

2.6 推送更改

将更改推送到远程 main 分支:

git push origin main

步骤 3:使用 git rebase 进行合并

如果你希望保持干净的提交历史,并将 4.x 分支的更改按顺序应用到 6.x 分支上,可以使用 git rebase

3.1 切换到 main 分支

git checkout main

3.2 执行 rebase

4.x 分支的提交变基到 6.x 分支上:

git rebase origin/stable

3.3 解决冲突并保留 6.x 的版本

如果在 rebase 时遇到冲突,使用以下命令保留 6.x 分支的版本:

git checkout --ours old-functions.php
git add old-functions.php

3.4 继续 rebase

完成冲突解决后,继续执行 rebase

git rebase --continue

3.5 推送更改

完成 rebase 后,将更改推送到远程仓库:

git push origin main

总结

通过上述步骤,你可以有效地将 4.x 分支的更改合并到 6.x 分支,并且选择性地放弃某些修改(如 old-functions.php 的修改)。这可以通过以下方法实现:

  1. 使用 git merge --no-commit --no-ff:合并更改并手动放弃特定文件的修改。
  2. 使用 git cherry-pick:选择性地合并特定的提交,忽略不需要的修改。
  3. 使用 git rebase:将提交按顺序应用到目标分支,确保提交历史干净。

这些方法都可以帮助你在多个分支间同步改动,同时保留特定的更改。

本文收录于