9

我有两个分支机构,“私人”和“公共”。我在私人和定期工作,我想替换“公共”分支中的所有内容,以便在“私人”中获得文件的干净副本。

因为我不希望“私人”的历史转到“公共”,所以我使用git merge --squash,但我仍然手动一个一个地解决合并文件。有一个更好的方法吗?

4

2 回答 2

11

我认为

git merge -X theirs private

就是你要找的。当然,您可以随意添加--squash

于 2013-02-06T18:55:00.487 回答
6

如果同一行在提交的两个文件上都发生了更改,则压缩合并不会改变存在冲突的事实。

要完全丢弃“public”分支上的所有内容并接管“public”的确切状态,您可以执行以下操作之一:

  1. 使用ours其他几个提交中指出的合并策略(不是策略选项):
    1.a 假设您在分支“私有”(否则,做git checkout private
    1.b git merge -s ours public
    1.c git checkout public
    1.d git merge --ff-only private
    1.e (可选:两者分支现在指向合并提交;如果您希望“私有”指向合并之前的提交,请执行:) git checkout private; git reset --hard private@{1}(请注意,这使用 reflog,并且只有在您同时没有更改“私有”时才会这样工作)

  2. 手动检查“他们”的一面:
    2.a 假设您在“公共”分支上(否则,git checkout public
    2.bgit merge --no-commit private将准备合并提交,但无论是否存在合并冲突,都将在提交之前停止
    2. cgit checkout -f private -- .检查“私人”的当前状态
    2.dgit add .将冲突标记为已解决(如果有)
    2.egit commit保存合并提交;“public”现在将具有与“private”完全相同的内容

编辑:请注意,这是我如何“覆盖”而不是“合并”的倒置情况,Git 中另一个分支上的一个分支?

编辑 2:如果你想隐藏你的单个公共提交,你--squash当然也可以在这里使用开关(分别在步骤 1.b 和 2.b 中)

于 2013-02-06T15:31:43.467 回答