【问题标题】:missing commits after git rebasegit rebase 后缺少提交
【发布时间】:2015-01-06 05:45:28
【问题描述】:
A-B-C  Master
 \D-E  Feature

在执行rebase 命令后git checkout feature -> git rebase master 我从feature 分支的所有提交都消失了,所以我有A-B-C 提交。 feature 分支在变基后看起来像 master。此外,rebase 不会给出任何错误,但它不会显示“commits are replayed”消息,我认为它通常会在 rebase 期间显示。你知道是什么导致了这种行为吗?

一旦我注意到我的提交消失了,我就运行以下命令来查找 git 历史记录中丢失的代码:git rev-list --all | xargs git grep expression 这个命令返回了一个提交哈希,但是当我运行 git log 时这个哈希不存在(因为 rebase) .如果我这样做git reset --hard missing-hash,我可以再次看到原始(正确)feature 代码。运行 rebase master 再次重现同样的问题。

编辑:我刚刚注意到我有一些额外的提交,比如 WIP on commit-messageindex on commit-message 当我做 git reset --hard missing-hash 时它可以与 git stash / git stash apply 相关吗

【问题讨论】:

  • 我知道如何取回我的文件。 “合并大师”也可以使用。我想找出可能导致这种变基命令行为的原因
  • 这些提交 D 和 E 在其内容上是否与 master 的提交相同? (在这种情况下,它们将在变基期间被跳过)
  • 它们与 master 不同,否则我不会注意到 rebase 后代码中缺少任何内容。附言在变基之前我做了几次'git commit --amend'。
  • 我同意 VonC 的观点,即在你的 rebase 期间你不会看到倒带和重放的唯一方法是,如果 master 和 feature 之间的共同祖先提交是 C(E),并且 B-C 是相同的提交D-E。

标签: git github rebase


【解决方案1】:

关于变基如何工作的同一页上也是如此。在您的示例中,git基本上是在尝试在C之后一一添加和D和E。 D & E 上的 rebase 提交将不是原件,而是带有新哈希的克隆。原始文件仍然存在,但只是悬空而没有引用它们的分支(垃圾收集最终会删除它们)。变基后,您可以通过查看git log ORIG_HEAD 来查看变基提交的“原始”版本

但是,在此过程中可能会发生异常。 Git 将智能地跳过已经在“基础”(在这种情况下为 master)中的任何提交 - 这可能会发生分支被合并、恢复、然后重新合并。

如果它发现添加到基础的提交在其内容中相同匹配,它也会跳过任何提交 - 已经在历史记录中的提交 - 即使哈希值不同 - 如果合并分支,可能会发生这种情况, 变基,然后再次合并。

我怀疑是几种情况之一。

  1. 您的功能分支可能已合并到主分支。
  2. 您的功能分支已经与 master 匹配。

1) git 分支 -- 包含功能

这将列出在其历史记录中包含您的功能分支的所有分支。如果 master 在该列表中,则您的分支已经合并。这里无事可做。

虽然这可能看起来不正确,但有几个原因。

一个原因是您可能看不到当前主代码中的更改。这可能有几个原因。如果分支之前已合并到 master 中,然后又恢复了,那么提交已经存在,但被否定了 - 即使重新合并,那些恢复的提交也不会返回 - 您需要恢复实际的恢复提交。

2) git checkout 功能; git rebase --keep-empty 功能

--keep-empty 将强制 git 保留您的提交,即使它们不包含任何“新”内容或更改。这不是修复或解决方法,但如果您在执行此操作后在历史记录中看到这些提交 - 那么这意味着您的提交不会丢失。他们被故意跳过。你可以自己决定是否要保留空的。

如果是这种情况,那么我会看看这个分支过去是否已经合并。例如,它可能已合并为不同分支的一部分。也许 Bob 认为他需要你在他的 bobs_feature 分支中的 feature 分支的工作 - 他的分支在你的分支之前就已经掌握了,现在你的分支基本上是无关紧要的。另一种情况可能是它在过去被合并到 master 中,然后又被还原。这里的答案是恢复还原提交本身——有点像在点击撤消后点击重做。

【讨论】:

  • 感谢您解释可能的原因。我遵循的工作流程是从 master 为每个 jira 票证创建功能分支。然后当其他票证(我自己的或其他票证)合并到 master.If I有一些正在进行的更改,我做 git stash->rebase master->git stash apply。我很确定我做了 smth,这不是我以为我在做的事情。也许在错误的分支上应用了 stash 或其他 smth(如果我是新的,我不会不问)。从你写的内容来看,这很可能是:'如果分支先前已合并到 master 中然后恢复,则提交已经存在但被否定'
  • 在这个特性上,我确实从 master 做了几个“rebases”。
  • 我会尝试通过 git history/reflogs 来检查我是否能弄清楚你提到的事情是否发生了。但是它包含太多的分支和提交,因此非常困难/耗时。至少现在我知道可能发生了什么,而不是下次我看到它时一无所知(这不是我第一次发生)
  • 如果您的分支过去已合并,并且您当前的分支尚未重新设置基础,请尝试使用 --contains 标志与您的功能分支中的 has 。这至少会证实怀疑。如果分支已被重新定位,则提交哈希将更改并且搜索将不起作用。
猜你喜欢
  • 2016-10-03
  • 2020-08-12
  • 2013-03-03
  • 1970-01-01
  • 2017-11-04
  • 2018-12-26
  • 2018-07-15
  • 2023-02-08
  • 2016-01-13
相关资源
最近更新 更多