撤消Git Rebase

用户名

git rebase master在分支上执行了一个操作,直到将其推到远程之后才意识到这不是我想要的。只有我自己和另外1个人在从事该项目,因此我知道他们尚未提出最新更改。

在阅读有关StackOverflow的其他问题时,它表示要使用git reflog,然后git reset --hard HEAD@{n}在重新设置基准之前使用。我这样做是为了完成在重新设置基准之前创建的提交,但是并没有将事情恢复到以前的状态。

我错过了一步吗?有没有办法让另一个人强行推回他的存储库,以恢复到原来的状态?

谢谢

星期二

正如Makoto已经指出的那样,您可能不应该不理会这个变基:它可能就是您想要的。尽管如此,请随时阅读有关如何撤消它的内容。


将reflog用于branch,因为它更易于阅读。HEADreflog具有相同的信息,但是其中包含很多东西,因此很难找到您想要的东西。)

例如,如果我刚刚进行了基础调整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简单地复制提交,然后移动标签。底垫后,但复位前,提交图形看起来像这样,在A通过C是“你”的提交:

          A - B - C              <-- (only in reflog now)
        /
... - o - o - o - A' - B' - C'   <-- mybranch (after rebase)

然后git reset简单地1擦除当前分支标签,并将其粘贴到提供的SHA-1上(如果需要,首先将reflog名称转换为SHA-1)。因此,在之后reset

          A - B - C              <-- mybranch, plus older reflog
        /
... - o - o - o - A' - B' - C'   <-- (only in reflog now)

请注意,现在,resetre-base重新构造的提交副本是仅在reflog条目中找到的“已放弃”的提交副本。原来被遗弃的原件现在mybranch被要求赔偿。

考虑这些问题的方法是绘制提交图(新提交指向其父提交),然后绘制带有长箭头的分支标签,这些分支标签指向提交图。该图从不进行2次更改,只是添加了 新的提交,这些提交具有新的和不同的丑陋的SHA-1(这就是为什么我使用诸如A BC代替字母,并A'诸如副本添加添加剂)的原因。SHA-1保证是唯一3,并且是永久性的,但是带有长箭头的标签会一直被擦除并重新指向。(如果在白板上执行此操作,则通常应将黑色用于提交图,并将颜色或几种颜色用于标签。)


1好吧,git reset除非您添加一些命令行标志,否则它不仅仅可以移动标签。默认情况下,它将移动标签重置索引。使用--hard,它将移动标签重置索引清理您的工作树。有了--soft,标签可以移动了,而索引和工作树就没有了。随着git的发展,还有更多的标志使含义更进一步,但是那是三大标志:--soft,什么也没有--mixed,和--hard

2如果git只添加了东西,那么您的仓库将随着时间的推移而增长。所以,最终,“无法访问”的提交,那些没有标签,甚至没有任何剩余的引用日志条目,指着他们,而不是指向的一些承诺是不会有一个标签,或其他一些指向的commit-最终,当gitgit gc自动为您运行时将删除这些无法访问的提交(以及任何其他无法访问的对象)您可以强制将它们更早地删除,但是很少有充分的理由要打扰。

3 Git本身取决于保证。从数学上讲,任何两个不同的对象都可以使用相同的SHA-1结束,但在数学上是不可能的。如果发生这种情况,git会中断。4如果分布足够好,则概率是2 160中的1,这确实很小。这是一件好事,因为“生日悖论”非常迅速地提出了可能性,但是由于它起步如此之小,它仍然很小,而且在实践中从来都不是问题。

4根据设计,“中断”是git只是停止添加对象,因此到目前为止一切都还不错。然后,您必须转到设计用于处理数十亿个对象存储库的新系统,“下一代” git或其他任何系统。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章