如何在不采用其中更改的情况下将 git 分支声明为合并?
Posted
技术标签:
【中文标题】如何在不采用其中更改的情况下将 git 分支声明为合并?【英文标题】:How to declare a git branch as merged without adopting the changes in it? 【发布时间】:2021-04-06 11:41:33 【问题描述】:假设我们有两个 git 分支,a
和 b
(为了简单起见,它们都是本地的)。分支a
是我的工作,分支b
不是;我摸不着。
我想“声明”或“标记”将b
合并到a
,而不实际对分支a
中的代码进行任何更改。我不介意做出一个空提交来表示合并。动机是在分支b
上发生了多余的工作,因为它们发生了分歧,这些工作被在a
上完成的工作所包含。
假设这是一件“合法”的事情 - 做这件事的惯用方式是什么?
【问题讨论】:
如果您在分支good
上并且希望记录合并以表示不应再使用分支名称 bad
,但您希望保留其提交(无论是不是你以后保留它的名字)没有任何这些提交影响你的当前分支,你只需要git merge -s ours bad
。这很简单,所以这里的每个人都假设你想要相反的结果:忽略good
上的所有提交,同时保持good
,以便good
上的下一个提交匹配bad
上的提交。
逻辑上,那个应该是git merge -s theirs bad
,但git merge -s theirs
不存在。所以这最终成为一个普遍的问题。由于git merge -s ours
确实 存在,所以没有人希望您询问如何运行git merge -s ours
。 :-)
【参考方案1】:
我现在是这样做的:
git br a
git merge --no-commit b
(或git pull --no-commit remote-name-here b
,如果b
是远程的)
取消添加所有内容
编辑提交冲突以仅保留 a
版本
git commit
并更改评论以说明我在不采用更改的情况下标记为合并。
【讨论】:
【参考方案2】:我认为它可以很容易地制作成这样:
git commit-tree -p a -p b -m "not pulling b changes" a^tree
有了这个,你要求 git 创建一个新的修订对象,它有 a
和 b
作为父母,有 a
s 树作为它的树(所以与 a
没有区别)我在那里提供的评论(随意调整)。将创建对象,并将 id 打印在标准输出上。您可以检查它以确保它是您想要的:
git diff that-id a
git log that-id
gitk that-id
应该没有区别。然后你可以移动一个如果你喜欢它:
git branch -f a that-id
【讨论】:
您写道您认为这应该可行。那么,会,还是不会呢? :-) 试一试。第一个命令将创建一个不会被任何东西指向的对象,因此您不会破坏某些东西。第二个可以让你检查确实没有区别......你甚至可以检查它的日志,看看它是否和你想要的一样,【参考方案3】:没有惯用的方法,因为它不是一个常见的用例。假设您只是不想拥有未合并的分支,有一些解决方法可能对您有用,具体取决于您的情况:
-
删除分支
合并分支,然后还原合并提交(然后合并,但更改不存在)
还原分支上的所有提交,然后将其合并。
【讨论】:
我不是这个意思。重新措辞以澄清这个想法不是对b
做任何事情。以上是关于如何在不采用其中更改的情况下将 git 分支声明为合并?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不提交的情况下将本地服务器上的更改与远程服务器上的更改同步?
如何在 Wordpress 中创建框架以便在不更改 URL 的情况下将文章加载到首页?
如何在不首先克隆整个 repo 的情况下将文件添加到远程 Git repo (Github)