假设我们已经在本地 git 分支上执行了 git rebase 命令并将其推送到远程。
然后你意识到这不是你想要的。
我们会想知道采取哪些步骤来解决问题。
撤消 git rebase 的步骤
此代码将以快速而直接的方式撤消 git rebase:
如果我们有未提交的本地更改,则将它们全部备份,否则它们将丢失。
找出head提交
运行 git reflog 以查看我们之前的所有操作,然后找到分支的头部提交,就像在 rebase 开始之前一样。
提交 ID 将类似于 HEAD@{5}:
git reflog
重置为提交
在找出要返回的提交后,有必要使用 git reset 命令将当前分支重置为它。
请注意,在使用 --hard 选项运行 git reset 命令之前,我们必须确定,如下所示:
git reset --hard HEAD@{5}
给定的命令仅将本地分支移动到 HEAD@{5}。
推送到远程
现在我们可以使用 git status 检查本地分支的状态。
git status
如果我们看到给定的消息,则意味着本地分支和远程分支已经发生分歧,因为本地分支已返回到先前的提交,而远程分支仍在前面。
On branch myBranch Your branch and 'oroirn/myBranch' have diverged
要解决此问题,请强制远程分支返回本地分支所在的位置:
git push --force
重置分支
如果我们改变了主意,我们可以使用当前远程分支重置分支(假设远程的名称是 oroirn,默认情况下)如下:
git reset --hard oroirn/HEAD
什么是 Git Reflog
Git 保留分支更新的记录。
由于一种称为引用日志或者引用日志的机制,这是可能的。
git reflog 命令允许我们返回到提交,即使是那些没有被任何标签或者分支引用的提交。
重写历史记录后, git reflog 包含有关分支先前状态的信息,并允许在需要时返回该状态。
git rebase 命令
首先,这个命令是维护线性项目历史所必需的。
假设 master 分支在我们开始处理功能分支后立即进行。
我们希望在功能分支中检查主分支的最后更新,但主分支历史必须保持干净。
我们可以区分 git rebase 命令的两种模式。
它们是标准模式和交互模式。
在标准模式下,提交会自动在当前工作分支中进行并应用于传递的分支的头部。
我们当前的分支将被重新定位到 <base> 中。
交互式变基会话通过运行 -i 标志开始。
交互模式允许在过程中更改单个提交。
它让我们有机会通过更改、拆分和删除现有提交来清理历史记录。
它看起来更像是类固醇上的 git commit-amend。