jjzjj

git - 撤消 Git Rebase

coder 2023-06-24 原文

我执行了 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/

有关git - 撤消 Git Rebase的更多相关文章

  1. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  2. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  3. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  4. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  5. ruby-on-rails - 撤消 "rails generate scaffold"后是否需要撤消 "db:migrate"? - 2

    我是RoR的新手,我正在学习MichaelHartl的教程(所以请随意更正我在您认为合适的地方使用的术语)。在第2章中,我通过运行以下行创建了一个Users表:$railsgeneratescaffoldUsername:stringemail:string$bundleexecrakedb:migrate然后,我运行了下面的代码来尝试创建一个Microposts表(但是,我拼错了没有“r”的Micropost!)...$railsgeneratescaffoldMiropostcontent:stringuser_id:integer$bundleexecrakedb:migrate

  6. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

  7. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  8. Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart - 2

    亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour  systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g

  9. ruby - RSpec Git Bash Windows——缺少颜色? - 2

    我在Windows上使用GitBash来完成我的大部分Rails工作,每次我运行bundleexecrspecspec它都会提醒我“你必须geminstallwin32console才能使用Windows上的颜色”,然后以纯黑色和白色运行RSpec。但是我确实安装了win32console,当我在列表中运行gemlist时,它有win32console(1.3.0x86-mingw32)。RSpec工作正常,但我希望它有一些颜色。我用谷歌搜索了这个并找到了多种解决方案,但似乎没有一个适合我。有人可以写出在GitBashforWindows上使用RSpec获取颜色的“循序渐进”方法吗?

  10. ruby - 在 Ruby 中撤消 zip - 2

    这个问题在这里已经有了答案:HowtounzipanArray?(1个回答)关闭8年前。在Python中,我可以通过返回zip来获得zip的“逆”a=[1,2,3]b=[4,5,6]c=zip(a,b)#[(1,4),(2,5),(3,6)]如果我改为从c开始,我可以使用以下方法返回a和bc=[(1,4),(2,5),(3,6)]a,b=zip(*c)但是,在Ruby中,似乎只有一个zip方法,因此我不确定我能否以完全相同的方式做到这一点......Ruby中是否有某种类似的好习惯用法可用于“解压缩”列表的列表?我知道你可以做c[0].zip(*c[1..-1])本质上在语义上是一样的

随机推荐