当它说当前分支是最新的时如何重新设置基准,即使它不是?

Posted

技术标签:

【中文标题】当它说当前分支是最新的时如何重新设置基准,即使它不是?【英文标题】:How to rebase when it says that current branch is up to date even though it isn't? 【发布时间】:2016-11-30 16:59:12 【问题描述】:

我重新设置了我的分支,其效果是将一些提交置于我自己的之上。然后意识到我忘记了压缩一些提交,所以很难重置和压缩。现在我需要把这些提交带回来。但是变基再次告诉我当前分支是最新的,即使它不是。有没有办法解决这个问题?

编辑:

有两个分支:a 和 b。两者都是从 master 分支的。两者都与主人保持同步。分支 a 有一些变化。我希望分支 b 也有这些更改。我将分支 a 重新定位到 b。最新的提交来自分支 a。我的意思是在提交之前压缩三个提交。我硬重置到最新提交之前。然后我压扁了。现在我想以一种在将分支 b 合并到 master 时不会引起头痛的方式取回最新的提交。

我试过refloggit reset --hard HEAD@n 但同样的问题:当前分支是最新的。

【问题讨论】:

“我重新设置了我的分支,它的效果是把一些提交放在我自己的上面。”不是相反(将你的提交放在你重新建立的分支之上)? "so hard reset" 硬重置哪个分支到哪个版本? Undo your bad rebase 然后Rebase Properly When do you use git rebase instead of git merge?的可能重复 这个answer 将有助于了解重新定位的工作原理 【参考方案1】:

就我而言,--force-rebase 提供了帮助。我想,在你的情况下,它会是:

git checkout b
git rebase --force-rebase a

【讨论】:

【参考方案2】:

如果您有提交的 id,您可以使用交互式 rebase 并手动添加它们。

假设你的原始分支是master,你可以这样做:

git rebase -i master

你会收到这样的东西:

pick 000000 Name of a commit
pick 000001 Name of another commit

您可以添加另一个 pick bbbbbb 与您要添加的 commitId,类似

pick 000000 Name of a commit
pick bbbbbb
pick 000001 Name of another commit

如果你想压缩一个提交,你可以这样做:

pick 000000 Name of a commit
squash bbbbbb
pick 000001 Name of another commit

壁球操作会将您的较低提交附加到前一个提交,这意味着00000

【讨论】:

【参考方案3】:

如果你没有推送那个 rebase,你可以硬重置到远程仓库分支。

git reset --hard origin/your-branch-name

【讨论】:

请不要多次回答同一个问题。 @matt 它们是不同的选项,而不是重复。

以上是关于当它说当前分支是最新的时如何重新设置基准,即使它不是?的主要内容,如果未能解决你的问题,请参考以下文章

git rebase与git merge的区别

git rebase与git merge的区别

Git Bash - Git 将分支显示为最新的,而实际上它们不是最新的

当它不是时,数组是空的...... JavaScript [重复]

如何在 Git 的当前分支中获取最新的标签名称?

为啥 Git 说我的主分支“已经是最新的”,即使它不是?