Git合并了我的一切

时间:2017-09-19 21:37:02

标签: git merge

是否有一个git merge命令将另一个分支合并到当前分支中,但是不会更改任何文件?

或者换句话说,我想在分支A上创建一个新的提交:

  • 与分支A
  • 上的最新提交相同的树(文件)
  • 父提交应该是分支A的最新提交
  • 其他父提交应该是分支B上的最新提交

考虑两个长期运行的分支,一个矿井,一个矿井。我想将他们的分支合并到我的分支上,但由于代码实际上是这样做的,我想将它标记为合并。下次我再次合并时,它将不会回溯到将在此过程中创建的合并提交。

我知道-X mine / --strategy-option=mine,但只有在发生实际合并冲突时才会启动。不应在我的分支上应用添加/删除的文件。

2 个答案:

答案 0 :(得分:2)

如果您完全确定不需要theirs,则可以在不提交的情况下执行merge,然后按原样结帐mine,然后完成合并提交。

git merge --no-commit their-branch
git rm . -rf
git checkout HEAD -- .
git commit

git checkout HEAD -- .将覆盖任何冲突或自动修改的文件。此时执行git status应该会发现没有任何内容被修改,但您仍处于合并中。 commit然后完成您的非合并合并。

编辑:git rm . -rf

最初,我已经省略了此工作流程的任何部分,可以从theirs删除全部新文件,因为git checkout HEAD -- .会保留这些文件。

git rm . -rf可确保删除当时git已知的每个文件。这将包括删除theirs但不存在ours中存在的任何文件。然后,我们将checkoutours中的那些,并提交结果为空的合并。

答案 1 :(得分:2)

您可以使用所需的详细信息制作自己的提交对象。以下是我手动操作的方法

  1. git checkout A

    • A分支
    • 开始
  2. git cat-file commit A > mine.commit

    • 这将检索当前提交对象以用作起点。它在我们的新提交对象中具有我们想要的大部分内容。
  3. git rev-parse B

    • 您需要4.
    • 的输出
  4. 在您喜欢的文字编辑器中修改mine.commit

    • 这是您将提供满足您要求的信息的文件
    • tree行保持不变 - 这是此提交时存储库的状态
    • 第一个parent行保持不变 - 这是您的A分支的提交ID
    • 添加另一条parent行,其中包含从3.上方打印的哈希码
    • 根据需要修改authorcommitter行。更改底部的提交消息
  5. cat mine.commit | git hash-object -t commit --stdin -w

    • 这会将提交对象写入您的数据库并打印出其commit-id。
  6. git merge --ff-only <output from hash-object above>

    • 这应该会成功,并且您的A分支应该相应地更新