【问题标题】:Ramifications of forgetting slash in "git merge origin/branch"在“git merge origin/branch”中忘记斜线的后果
【发布时间】:2012-05-22 06:00:36
【问题描述】:

根据this article,我试图让自己养成在更新工作副本时显式获取和合并的习惯。但是,今天我在发出命令时打错了:

$ git fetch origin
$ git merge origin asdf

请注意,我在合并命令中使用了空格而不是正斜杠。因为无论如何它似乎已经达到了预期的效果,直到我已经推送它才注意到它在日志中添加了一个措辞奇怪的提交:

commit 65f0037bed926c338cb95e7437e7f7f407028d9f
Author: Me <my_email@example.com>
Date:   Mon May 14 09:36:44 2012 -0700

    Merge branch 'asdf', remote-tracking branch 'origin' into asdf

现在我想知道这是否真的有任何负面影响。似乎它将参数视为两个单独的分支规范以合并到当前分支中,并且“origin”将隐式扩展为“origin/asdf”——这正是我真正想要的。那时,我不知道为什么它甚至会允许“将分支 'asdf' 合并为 asdf”。

这只是一个令人尴尬的无操作吗?或者我是否在我的存储库历史记录中引入了一个可能有问题的构造?

编辑:git cat-file commit 65f0037b 的输出

tree 74ed9ead4b82e4e56bd5656ee10375f8f0fcb60d
parent 3bc2a37031a4a391aa4da64c22e3f55148cd23e2
author Me <my_email@example.com> 1337013404 -0700
committer Me <my_email@example.com> 1337013404 -0700

    Merge branch 'asdf', remote-tracking branch 'origin' into asdf

【问题讨论】:

  • 你能做到git cat-file commit 65f0037b吗?您可能已经执行了章鱼合并,或者其中一个提交可能只是快进了,并且您可能通过误导性的提交消息得到了想要的结果。从提交描述中很难判断。
  • @Charles Bailey:不幸的是,在我提出这个问题大约 45 分钟后,我决定谨慎行事,硬重置 + 重做有问题的合并。我意识到这可能会使这个问题无法明确回答,对此我深表歉意。然而,larsks 给出的答案,再加上我知道默认分支实际上是“origin/asdf”这一事实,让我相信合并确实巧合地(而且尴尬地)完成了我最初的打算。
  • 除非您故意将修剪时间设置为非常短并且在过去一小时内进行了 gc'ed,否则提交 65f0037b 应该仍然存在......这不再重要了。
  • @Neverender:它告诉我它只有一个父级(我无法从日志中看到),这意味着它不是真正的合并,只是具有误导性的常规提交提交消息。可能是提交中没有实际更改,或者更令人担忧的是,父信息丢失了。当您执行此操作时,您的本地克隆可能是最新的。

标签: git


【解决方案1】:

让我们从merge 命令的手册页开始:

   git merge [-n] [--stat] [--no-commit] [--squash]
           [-s <strategy>] [-X <strategy-option>]
           [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]

因此,在没有所有选项的情况下,merge 接受提交列表。如果您已经在分支 asdf 上并输入:

git merge asdf

...这是无操作的:将分支与自身合并意味着无事可做。如果你输入这个:

git merge origin

然后git 将查找与名为origin 的远程关联的默认分支。在branch -a的输出中:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

remotes/origin/HEAD 指向默认分支,所以:

git merge origin

相当于:

git merge origin/master

所以假设你的遥控器上的默认分支是master,当你输入时:

git merge origin asdf

你得到了:

git merge origin/master

如果默认分支是asdf,你得到:

git merge origin/asdf

【讨论】:

  • 不解释远程跟踪分支
  • 是的,我可以肯定地说 remotes/origin/HEAD 在这个例子中确实指向了 origin/asdf。我认为这意味着我最初的评估(意外获得预期结果 + 尴尬的无操作)是准确的。
猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2018-10-18
  • 2017-12-07
  • 2018-10-07
  • 2018-07-05
相关资源
最近更新 更多