在 git rebase --hard 之后,为什么我的主题分支没有改变?

After git rebase --hard, why didn’t my topic branch change?

我不小心用 DEV b运行ch 重新设置了 b运行ch 的基址,然后将其推送到远程存储库。通过变基,我选择了当前更改,因此我的本地更改被覆盖了。

我在 rebase 中丢失了我之前的提交,但 运行 git log 找到了它。然后我运行git checkout commitId甚至git reset --hard commitId。但是,在这两种情况下,我的代码库仍然在我的 b运行ch.

上显示最新的 rebased 代码

如何将我的 b运行ch 恢复到之前的状态?

我怀疑这里的命令顺序有点混乱。如果你这样做

git checkout <commitId>

它将分离你的 HEAD 然后你的后续

git reset --hard <commitId>

没有影响,因为当前没有签出任何分支。

在重置之前检查你的分支,它会好的:

git checkout <yourBranchName>
git reset --hard <commitId>

超然什么?伙计,我的承诺在哪里?

检查提交的散列或对象名称会输入 git 文档中提到的 detached HEAD state

It is sometimes useful to be able to checkout a commit that is not at the tip of any named branch, or even to create a new commit that is not referenced by a named branch. Let’s look at what happens when we checkout commit b (here we show [three] ways this may be done):

$ git checkout v2.0      # or
$ git checkout master^^  # or
$ git checkout b

   HEAD (refers to commit 'b')
    |
    v
a---b---c---d  branch 'master' (refers to commit 'd')
    ^
    |
  tag 'v2.0' (refers to commit 'b')

Notice that regardless of which checkout command we use, HEAD now refers directly to commit b. This is known as being in detached HEAD state. It means simply that HEAD refers to a specific commit, as opposed to referring to a named branch.

正如您所观察到的,git 将愉快地使用分离的 HEAD 创建新的提交、变基、合并等,但是因为没有标记或分支指向生成的未命名分支,所以很容易丢失它.您可以使用 git log 找到您的原始提交。当你做了更彻底的手术后,git reflog 的输出是另一个值得一看的地方。

修复

按照您的问题中的描述修复您的分支将涉及以下顺序。

  1. HEAD 重新附加到您的分支(以下称为 topic/my-branch
  2. topic/my-branch 重置为之前的位置
  3. 修复 origin/topic/my-branch 之前的推送。
    • 要么用力推动一次完成所有操作,要么
    • 删除旧的远程分支并推送你的固定历史

重新连接 HEAD

而不是通过其 SHA-1 哈希,通过名称检查您的分支

git checkout topic/my-branch

修复本地分支

接下来,将它放回 git reset --hard 的位置。您将使用相同的命令,但上下文不同:git checkout 之后的 HEAD 指向 topic/my-branch 而不是直接指向 commitId

git reset --hard commitId

修复远程分支

你说你推送了你的 rebased 分支,所以更新远程存储库以反映你的更改。在一个命令中完成所有操作的方法是

git push --force origin topic/my-branch

远程存储库的管理员可能采取了拒绝强制推送的非常合理的步骤(原因见下文)。如果是这样,请尝试一系列

  1. 删除你在远端的分支,然后
  2. 推送您更正的本地分支

在过去糟糕的日子里,我们不得不删除不明显的远程分支

git push origin :topic/my-branch

但现在拼写为

git push --delete origin topic/my-branch

扫清道路后,现在推动您的分支机构将事情恢复到原来的状态。

git push origin topic/my-branch

如果您的遥控器上同时禁用了强制推送和删除,请向对该存储库具有管理权限的人员寻求帮助。

注意事项

大多数时候,您必须非常努力地说服 git 破坏工作。然而,git reset --hard、删除远程分支和git push --force都是利器——用得着用得着,用得着却很危险。与 rm -rf 一样,停下来考虑一下您是否真的是要执行的命令 运行。