gpt4 book ai didi

git - 撤消 Git Rebase

转载 作者:IT王子 更新时间:2023-10-29 01:10:13 24 4
gpt4 key购买 nike

我执行了 git rebase master在我的分支上,直到我将它推送到 Remote 后才意识到这不是我想要的。只有我自己和另外 1 个人在从事该项目,所以我知道他们没有提取最新的更改。

在 StackOverflow 上阅读其他问题,它说使用 git reflog然后 git reset --hard HEAD@{n}到 rebase 之前。我这样做是为了转到我在 rebase 之前创建的提交,但它没有将事情恢复到以前的状态。

我错过了一步吗?有没有办法让另一个人强制 push 他的 repo 以将事情恢复到原来的状态?

谢谢

最佳答案

Makoto already noted ,您可能不应该费心撤消此 rebase :这可能是您想要的。尽管如此,请继续阅读以了解如何撤消它。

使用分支的 reflog,因为它更容易阅读。 (HEAD reflog 具有相同的信息,但其中包含更多内容,因此更难找到您要查找的内容。)

例如,如果我刚刚重新定位 mybranch , 我会看见:

$ git reflog mybranch
nnnnnnn mybranch@{0}: rebase finished: refs/heads/mybranch onto biguglysha1
ooooooo mybranch@{1}: commit: some sort of commit message
...

姓名 mybranch@{1}因此(目前)与 ooooooo 同义,旧缩写为SHA-1。每次你对分支做一些事情(比如 git reset ) @{...} 里面的数字部分会改变,而 SHA-1 是永久的,所以使用 SHA-1(完整或缩写)进行剪切和粘贴会更安全一些。

如果你那时:
$ git checkout mybranch # if needed

和:
$ git reset --hard ooooooo  # or mybranch@{1}

你应该有原来的回来。这是因为 rebase只需复制提交,然后移动标签。在 rebase 之后,但在重置之前,提交图看起来像这样,其中 A通过 C是“你的”提交:
          A - B - C              <-- (only in reflog now)
/
... - o - o - o - A' - B' - C' <-- mybranch (after rebase)

git reset simple1 删除当前分支标签并将其粘贴到提供的 SHA-1 上(如果需要,首先将 reflog 名称转换为 SHA-1)。因此,在 reset 之后:
          A - B - C              <-- mybranch, plus older reflog
/
... - o - o - o - A' - B' - C' <-- (only in reflog now)

请注意,现在,post- reset ,rebase 制作的提交副本是仅在 reflog 条目中找到的“废弃”副本。原件已被遗弃,现在在 mybranch 下认领。再次。

考虑这些东西的方法是绘制提交图(新提交指向它们的父提交),然后用指向提交图的长箭头绘制分支标签。除了添加 之外,图表从不改变新品 提交,它们具有新的和不同的大而丑陋的 SHA-1(这就是为什么我使用像 A BC 这样的字母,并在副本上添加像 A' 这样的添加剂)。 SHA-1 保证是唯一的 3 并且是永久的,但是带有长箭头的标签会一直被删除和重新指向。 (如果你在白板上这样做,你通常应该使用黑色作为提交图,使用一种颜色或多种颜色作为标签。)

1嗯, git reset不只是移动标签,除非您添加一些命令行标志。默认情况下,它移动标签并重置索引;与 --hard ,它会移动标签并重置索引并清除您的工作树。与 --soft它只是移动标签,单独留下索引和工作树。与 git 一样,还有更多的标志可以进一步扭曲其含义,但这些是三大标志: --soft , 没什么又名 --mixed , 和 --hard .

2如果 git 只添加东西,你的 repo 会随着时间的推移变得越来越大。所以,最终,“无法访问”的提交——那些没有标签的提交,甚至没有任何剩余的 reflog 条目,指向它们,并且没有被一些有标签的提交或其他一些指向的提交所指向——最终,当 git 运行时,这些无法访问的提交(以及任何其他无法访问的对象)会被删除 git gc自动为你。您可以强制提前删除它们,但很少有充分的理由去打扰。

3Git 本身依赖于保证。任何两个不同的对象都以相同的 SHA-1 结束,这在数学上是可能的,但极不可能。如果发生这种情况,git 会中断。4 如果分布足够好,那么概率是 2160 中的 1,这真的很小。这是一件好事,因为 "Birthday paradox"很快地提高了可能性,但是因为它开始时很小,所以它一直很小,实际上它从来都不是问题。

4按照设计,“破坏”是 git 只是停止添加对象,所以到目前为止一切都还好。然后,您必须迁移到已设计用于处理数十亿对象存储库的任何新系统、“下一代”git 或其他任何系统。

关于git - 撤消 Git Rebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32490288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com