重新设置功能分支-但提交ID已更改

时间:2018-07-31 08:30:38

标签: git git-rebase

起点:

Dev: A -- B -- C
Feat:            \ -- D

然后将一些新提交提交到Dev

Dev: A -- B -- C -- NEW
Feat:            \ -- D 

然后意外地导致Dev上的提交哈希发生更改*(并与push--force一起更改) 大写字母和小写字母表示相同的补丁-但提交哈希不同:

Dev: a -- b -- c -- NEW
Feat:  A -- B -- C -- D

现在我想从rebase Feat Dev,但是相同的补丁被识别为不同的提交,并且rebaseA开始而不是{ {1}}:

D

请帮助!!!

*也许您可以告诉我如何将它们改回来:我在Dev上运行了一个交互式behavior: a -- b -- c -- NEW -- A -- B -- C -- D expected: a -- b -- c -- NEW -- D (and recognize that A and a are actually the same) ,以便仅使用rebase选项更改提交消息。然后我意识到提交哈希发生了变化,因此我回到了r-在使用reset进行交互式变基之前。但是现在提交消息已经过时了,但是提交哈希仍然不同!!!

3 个答案:

答案 0 :(得分:1)

在这种情况下,您应该使用cherry-pick而不是rebase

还原对dev的更改(您希望重新定位的位置,是新的更改)。

git reset --hard <last NEW changes commit>

通过本地dev分支与远程dev同步

现在cherry-pick从功能分支提交并应用于开发

git cherry-pick <commit-ids from feat branch> //commit ids seprate with space

答案 1 :(得分:0)

您如何准确地基于哪个分支和哪个命令?

您可以做的是,在使用feat分支时,使用dev重新构建feature分支

git rebase master

它应该可以正常工作。

如果一切都坏了,则可以使用git reflog。它将向您显示本地存储库中发生的事件的列表。在您犯错之前复制事件的哈希,然后运行

git reset --hard <reglog-sha>

它将重置历史记录上的所有内容

答案 2 :(得分:0)

您可能可以:

  1. 为您在分支“ feat”中所做的新更改创建补丁
  2. 删除“ feat”分支
  3. 从'dev'创建一个新的'feat'分支
  4. 将步骤1中的补丁应用于新的'feat'分支
  5. 强制推动新的“ feat”分支

现在,您将在'dev'上进行'feat'分支更改

例如,如果仅对“ feat”执行一次提交,则以下命令应起作用
(它也适用于n次提交。您需要在新分支上应用那么多补丁)

git checkout feat
git format-path HEAD~1
git branch -D feat
git checkout dev
git checkout -b feat
git am -3 patch-file-created-using-format-patch
git push -f origin feat