在git rebase之后缺少提交

jon*_*nas 11 git github rebase

A-B-C  Master
 \D-E  Feature
Run Code Online (Sandbox Code Playgroud)

执行rebase命令后git checkout feature- > git rebase master我从feature分支机构提交的所有提交都会消失,所以我A-B-C提交了.在变基之后,feature分支看起来像master.此外,变基不会产生任何错误,但它不会显示"提交已重播"消息,我认为通常它会在变基期间显示.你知道可能导致这种行为的原因吗?

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

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

edd*_*oya 7

就这一点而言,关于rebase如何运作的同一页面上也是如此.在你的例子中,git基本上是尝试逐个添加C和C之后的D和E. D&E的rebase承诺不会是原件,而是带有新哈希的克隆.原始文件仍然存在,但只是悬空而没有引用它们的分支(垃圾收集最终将删除它们).在rebase之后,你可以通过查看看到重新提交的"原始"版本git log ORIG_HEAD

但是,在此过程中可能会发生异常.Git将智能地跳过已经存在于"base"中的任何提交(在本例中为master) - 这可能发生分支被合并,还原,然后重新合并.

它也会跳过任何提交,如果它发现添加到基础的提交完全匹配,在它们的内容中 - 已经在历史记录中的提交 - 即使哈希值不同 - 如果合并了一个分支,则会发生这种情况,rebase,然后又合并了.

我怀疑是少数情况之一.

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

1)git branch --contains功能

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

有几个原因,这可能看起来不正确.

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

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

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

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