将 dev
分支的代码同步到 master
分支并排除特定目录,有几种常见的方法。这里提供两种主要思路:
重要前提:
- 确保工作区干净:在进行任何合并操作前,请确保你在
master
和 dev
分支上的工作目录是干净的(没有未提交的更改)。可以使用 git status
查看。
- 拉取最新代码:确保
master
和 dev
分支都是最新的。
git checkout master
git pull origin master
git checkout dev
git pull origin dev
—
方法一:使用 --no-commit
合并后手动处理 (推荐用于一次性操作)
这种方法允许你先将 dev
分支的更改合并到 master
的索引(暂存区)中,但不立即提交。然后你可以从暂存区移除不想要的目录,并恢复这些目录到 master
分支之前的状态。
步骤:
切换到 master 分支:
git checkout master
合并 dev 分支,但不自动提交:
git merge dev --no-commit --no-ff
--no-commit
:执行合并,但不要自动创建新的合并提交。这会将 dev
的更改应用到你的工作目录和暂存区。
--no-ff
:即使可以快进合并,也创建一个合并提交,这样可以保留 dev
分支的历史。
处理可能的冲突:
如果在上一步中出现合并冲突,你需要先解决所有冲突,然后使用 git add <resolved-files>
将解决后的文件标记为已解决。在解决完所有冲突之前,不要进行下一步。
从暂存区移除不想合并的目录,并恢复它们:
# 将这两个目录从暂存区移除 (如果它们在dev分支上有改动)
git reset HEAD plugins/AuthorisationCentre
git reset HEAD plugins/WorkWeChat
# 丢弃这两个目录在工作区的更改,恢复成 master 分支合并前的状态
git checkout -- plugins/AuthorisationCentre
git checkout -- plugins/WorkWeChat
git reset HEAD <path>
:将指定路径的文件/目录从暂存区移除,但保留工作目录中的更改。
git checkout -- <path>
:将指定路径的文件/目录从工作区恢复到 HEAD
(即 master
分支在合并操作开始前的状态)的状态。
检查状态:
git status
你应该会看到其他来自 dev
分支的更改仍然在暂存区,而被排除的两个目录应该没有被暂存,并且它们的内容与 master
分支合并前一致。
提交合并:
git commit -m "Merge dev into master, excluding plugins/AuthorisationCentre and plugins/WorkWeChat"
如果你在第3步解决了冲突并 git add
了文件,那么这一步的提交会自动包含它们。
推送 master 分支 (可选):
git push origin master
—
方法二:使用 .gitattributes
和自定义合并策略 (推荐用于长期、重复性排除)
如果你经常需要从 dev
合并到 master
时排除这些目录,可以配置 Git 在合并时对这些目录使用 “ours” 策略,即总是保留当前分支(master
)的版本。
步骤:
在 master
分支创建或修改 .gitattributes
文件:
确保你在 master
分支。在你的项目根目录下创建或编辑 .gitattributes
文件,添加以下内容:
plugins/AuthorisationCentre/** merge=ours
plugins/WorkWeChat/** merge=ours
/**
表示目录下的所有文件和子目录。
merge=ours
指示 Git 在合并时,对于匹配这些路径的文件,总是保留当前检出分支(即 master
)的版本。
配置 “ours” 合并驱动 (如果尚未配置):
你需要在你的 Git 配置中定义 ours
合并驱动。通常,这只需要一个简单的占位符,因为 Git 内部知道如何处理它。
# 为当前仓库配置
git config merge.ours.driver true
# 或者全局配置 (如果你想在所有项目中使用)
# git config --global merge.ours.driver true
提交 .gitattributes
的更改到 master
分支:
git add .gitattributes
git commit -m "Configure merge strategy to keep master's version of specific plugins"
git push origin master
现在进行正常的合并:
git checkout master
# 确保 master 是最新的 (已经包含了 .gitattributes 的更改)
git pull origin master
git merge dev
当 Git 合并 dev
分支时,它会看到 .gitattributes
中的规则。对于 plugins/AuthorisationCentre
和 plugins/WorkWeChat
目录下的任何更改,它会自动采用 master
分支的版本,有效地“排除”了来自 dev
分支对这两个目录的更改。
处理其他可能的冲突并提交:
如果 dev
分支中除了这两个目录外还有其他文件与 master
冲突,你需要正常解决它们。解决后,提交合并:
# 如果有冲突,解决后 git add <resolved-files>
git commit -m "Merge dev into master" # Git 会自动生成合并提交信息,你也可以自定义
推送 master 分支 (可选):
git push origin master
—
选择哪种方法?
- 方法一 更适合一次性操作,或者当你不希望在仓库中留下关于合并策略的配置时。它更直接,但需要手动操作。
- 方法二 更适合当你需要总是或经常在从
dev
(或其他特定分支)合并到 master
时排除这些目录。它是一劳永逸的配置,但会引入 .gitattributes
文件和合并驱动配置。
重要提醒:
- 在执行这些操作之前,强烈建议先在一个测试分支或者本地副本上进行尝试,确保结果符合预期。
- 如果这两个目录在
dev
分支中是新增的,而 master
分支中不存在:
- 方法一:
git reset HEAD ...
和 git checkout -- ...
会有效地阻止这两个新目录被添加到 master
。
- 方法二:
merge=ours
策略意味着如果这些路径在 master
上不存在,它们也不会从 dev
被引入。
选择最适合你工作流程的方法。对于大多数情况,如果只是偶尔需要,方法一可能更简单直接。