【问题标题】:How to merge a branch into master without changes?如何在不更改的情况下将分支合并到 master 中?
【发布时间】:2018-05-20 02:16:57
【问题描述】:

我想将集成分支合并到master中,但我不想为了好看而改变任何东西。

集成分支是灰色的。这个分支包含很多变化,我想弄个花招。要重置它,何时从 master 中分离出来,因为我可以看到最后的更改并将它们与 master 一起提交。因此 master 将包含来自集成分支的最新版本文件,但集成仍将与 master 分离。

我想将集成合并到 master 中,只有可视化(没有更改),以便在历史记录中看起来不错,因为我已经对单个提交进行了更改。

最后一个问题是:如何在 master 中合并集成而不对 master 进行更改,只影响历史(视觉上)?

我想这样做是因为:

  • 在我从主项目结构拆分集成后修改了,现在我有很多冲突。手动合并更容易。之后我只想在 master 上“合并”集成而不进行更改(因为已经存在)。

【问题讨论】:

  • 这不清楚 - 你是说你已经将更改压缩/重新定位到 master
  • 试试git merge -s ours
  • 很清楚,我在那里写道,我在与 master 分离时重置了集成,所以我有最后一个文件版本。我手动将这些更改放在 master 上(在 Visual Studio 中)。之后,我想将集成“合并”到 master 中,只是为了看起来不错。
  • 听起来你想签出集成,软重置提交 2,并存储更改,签出 master,然后弹出存储。 --- 还是会有冲突,还不如正常合并。
  • 我有,但我可以一次性完成最后的更改。不通过集成提交。最后一个问题是:如何在master中合并集成而不对master进行更改,只影响历史(视觉上)

标签: git git-branch git-extensions


【解决方案1】:

我同意,在几乎所有情况下,您都不应该按照 OP 的要求去做,但我确实相信有时候它确实有意义。我不会用我的理由来避免关于版本控制纯度的争论。

有很多方法可以做到这一点,但这里有一种。请注意,此命令使您能够真正搞砸您的生活(git 历史),所以要小心。

git reset "$(git commit-tree -p "$BRANCH_NO_CONTENT_CHANGE" -p "$BRANCH_PRETENDING_TO_MERGE_FROM" -m "Administrative (no-change) merge of $BRANCH_PRETENDING_TO_MERGE_FROM" "$(git log -n 1 --pretty=format:%T "$BRANCH_NO_CONTENT_CHANGE")")"

在 OP 的上下文中,BRANCH_NO_CONTENT_CHANGE 是主控,BRANCH_PRETENDING_TO_MERGE_FROM 是集成。

我也在“反向”中使用了它,我有一个魔法分支,魔法分支发生了魔法,我想让魔法分支的内容与施主分支相同(更改最后一个变量的最后一个实例出现在其他名称,更改合并提交消息 s/no-change/overwrite/,并忽略名称的语义)。除了保留历史,有点像强制推进。

我强烈建议仔细检查文件的位置、名称和内容,并在推动这些更改并将你的罪孽永久化之前进行测试。

【讨论】:

    【解决方案2】:

    这是我做到这一点的一种方式。这假设我们在 current-branch 上并将 branch-to-merge 合并到我们当前的分支 (current-branch)。

    第一:

    git merge branch-to-merge
    

    此时,如果我们遇到合并冲突,只需提交包括冲突在内的所有内容而不修复它们,这无关紧要。因此,如果我们有冲突,无论如何都要提交它:

    git add every thing
    git commit # conclude the merge, don't worry about conflict markers
    

    现在让我们获取这个新合并提交的提交哈希。运行

    git log
    

    查看历史记录并复制合并提交的哈希值。假设这个提交是12345abc。现在我们将把 current-branch 重置为合并之前的先前提交,以便我们将文件恢复到我们想要的状态:

    git reset HEAD~ --hard
    

    这使我们的分支与我们开始时的状态完全相同。如果我们环顾四周(例如,参见 git log),我们会看到我们撤消了合并提交并返回到我们之前的提交。

    但是!

    该合并提交仍存储在 git 的内部历史记录中。现在,让我们恢复那个提交(在这个例子中是12345abc),而不改变我们文件的内容,以便我们的文件保持我们想要的相同状态:

    git reset 12345abc --soft
    

    现在,如果我们运行git status,我们将看到有阶段性的变化。这些更改是我们原始提交的文件,完全符合我们的要求!

    现在,让我们修改合并提交,使其具有我们原来的文件集:

    git commit --amend --no-edit
    

    最后一个命令使用--amend 覆盖了当前提交(恰好是合并提交),而不是进行新的提交,并且因为我们的原始提交的文件状态已经到位,git 用我们的替换了合并提交的文件先前提交的文件。太好了!

    --no-edit 标志指定只保留相同的提交消息。

    完成!

    我没有尝试过@SethRobertson 的方法,它可能工作得很好,但我喜欢我的方法,因为它的脚本更少,并且使用一系列基本命令来实现相同的目标。

    【讨论】:

      【解决方案3】:

      为了实现这一点,您需要执行的步骤是:

      • 结帐集成分支
      • 用 master 做一个 rebase (git pull --rebase master)
      • 推送集成分支
      • 结账大师
      • 合并集成分支
      • 推送主分支。

      但这只有在集成不是公共分支时才有效。如果是,那么你将改写它的历史,并不是一件好事。如果它是公开的,那么你唯一能做的就是将它与 master 合并,但你不会有线性历史。

      【讨论】:

      • 如果集成分支包含与已经放置在 master 上的相同更改,则 rebase 将产生 0 次提交。
      • 这不是我问题的答案,因为如果我在 master 上重新集成,我会遇到冲突。当我软重置集成将保留未暂存的文件时,我将手动进行更改,然后我想伪造集成和主文件之间的合并,只是为了看起来不错。
      • 我的文件路径和文件内容完全不同。
      • @Alex - 这个用例没有任何意义。你为什么不想做一个真正的合并?
      • 因为有很多冲突。我更改了文件位置,如果我想合并它会弹出一个保留我们的,删除他们的,保留基本文件的弹出窗口。我不想保留任何文件,如果我删除一个文件,我将丢失更改(糟糕的 git merge),如果我重置它,我有文件的最新版本(我想要的,但我想合并它而不改变主人的任何东西)。如何合并而不改变主人的东西?只是为了在视觉上看起来不错。如果我手动输入最后一个版本的文件,我需要 5 分钟,如果我需要合并我有很多弹出窗口、合并和冲突,我需要 1 小时
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2017-04-24
      • 2017-03-24
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多