我想将集成分支合并到master中,但我不想仅仅为了看起来不错而改变任何东西。
积分分支是灰色的。这个分支包含了很多改动,我想搞一招。要重置它,当与主服务器分离时,因为我可以看到最后的更改并将它们与主服务器上的一次提交一起放置。因此,master 将包含集成分支中文件的最新版本,但集成仍将与 master 分开。
我想将集成合并到master中,只有视觉效果(没有更改),以便在历史记录中看起来不错,因为我已经通过该单一提交进行了更改。
最后一个问题是:如何在 master 中合并集成而不对 master 进行更改,仅影响历史记录(视觉上)?
我想这样做,因为:
这是我的一种方法。这假设我们位于
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 的方法,它可能工作得很好,但我喜欢我的方法,因为它不太脚本化,并且使用一系列基本命令来实现同样的事情。
我同意,在几乎所有情况下,你都不应该按照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/,并忽略名称的语义)。 除了保存历史之外,有点像强制推动。
我强烈建议仔细检查哪些文件位于何处、名称和内容,并在之前进行测试,推动这些更改并使您的罪孽永远具体化。
git merge -s ours <branch-to-merge>
这会将
branch-to-merge
“合并”到当前分支,而不对该分支进行任何更改。但是仍然会使用正确的提交历史记录创建合并提交。
感谢Lasse V. Karlsen,他在评论中给出了正确答案,但因为它没有在任何实际答案中列出。我把它列在这里。
为了实现这一目标,您需要执行的步骤是:
但这仅在集成不是公共分支时才有效。如果是的话,那么你就会改写它的历史,不是什么好事。如果它是公开的,那么你唯一能做的就是将它与 master 合并,但你不会有线性历史记录。