草庐IT

撤消 git rebase

HuntsBot 2023-08-11 原文

问题描述:

如何轻松撤消 git rebase?想到的唯一方法是手动进行:

git checkout 两个分支的提交父级

然后从那里创建一个临时分支

手工挑选所有提交

用手动创建的分支替换我重新设置的分支

在我目前的情况下,这是可行的,因为我可以轻松地发现来自两个分支的提交(一个是我的东西,另一个是我同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用我自己的 2 个分支重新设置了基础)。

澄清:我说的是重放多个提交的rebase。不止一个。

解决方案1:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

最简单的方法是找到分支的头部提交,因为它是在 reflog 中开始变基之前立即…

git reflog

并将当前分支重置为它(通常需要注意的是在使用 --hard 选项重置之前绝对确定)。

假设 ref 日志中的旧提交是 HEAD@{2}:

git reset --hard HEAD@{2}

在 Windows 中,您可能需要引用参考:

git reset --hard "HEAD@{2}"

您只需执行 git log HEAD@git log “HEAD@{2}”(Windows: git log “HEAD@{2}”)即可检查候选老头的历史记录。

如果您没有禁用每个分支 reflogs,您应该能够简单地执行 git reflog branchname@{1},因为 rebase 在重新连接到最终头之前会分离分支头。我会仔细检查这一点,尽管我最近没有验证这一点。

默认情况下,所有 reflogs 都会为非裸存储库激活:

[core]
    logAllRefUpdates = true

Git reflog 很棒,请记住您可以使用 git log -g 获得更好的格式化输出(来自 Scott Chacon 的 progit.org/book 的提示)。

Per Allan 的回答低于 git rebase -i --abort 也是必需的。仅以上是不够的。

@Zach:git rebase --abort(-i 对 --abort 没有意义)是为了放弃尚未完成的变基——要么是因为存在冲突,要么是因为它是交互式的,或者两者兼而有之;这与撤消成功的变基无关,这就是问题所在。您可以使用 rebase --abort 或 reset --hard,具体取决于您所处的情况。您不需要同时使用这两种方法。

以防万一,请先进行备份:git tag BACKUP。如果出现问题,您可以返回它:git reset --hard BACKUP

如果您进行了大量提交,您正在寻找的 HEAD@{#} 将以 commit: 开头,而不是 rebase:。听起来很明显,但它让我有点困惑。

解决方案2:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

实际上,rebase 会将您的起点保存到 ORIG_HEAD,所以这通常很简单:

git reset --hard ORIG_HEAD

但是,reset、rebase 和 merge 都将原始 HEAD 指针保存到 ORIG_HEAD 中,因此,如果您在尝试撤消变基后执行了这些命令中的任何一个,那么您将必须使用 reflog。

如果 ORIG_HEAD 不再有用,您还可以使用 branchName@{n} 语法,其中 n 是分支指针的第 n 个先前位置。因此,例如,如果您将 featureA 分支重新设置为 master 分支,但您不喜欢重新设置的结果,那么您可以简单地执行 git reset --hard featureA@the official Git docs for revisions 将分支重置回它之前的位置做了rebase。您可以在 the official Git docs for revisions 阅读有关 branch@{n} 语法的更多信息。

这是最简单的。不过,用 git rebase --abort 跟进它。

@Seph 你能解释一下为什么你建议跟进 git rebase --abort 吗?

@Seph我同意UpTheCreek,因为在我的情况下没有必要。当交互式变基期间事情变得奇怪时,也许需要它?我建议任何人先尝试 git status 看看它是否提到了变基。无论如何,做 git rebase --abort 应该是无害的。如果没有正在进行的变基,它只会抱怨“fatal: No rebase in progress?”而失败。

是否可以先检查 ORIG_HEAD 的提交是什么?

解决方案3:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

Charles’s answer 有效,但您可能希望这样做:

git rebase --abort

在 reset 之后进行清理。

否则,您可能会收到消息“Interactive rebase already started”。

那不是问题。问题询问如何撤消已完成的变基。

解决方案4:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

将分支重置为其旧提示的悬空提交对象当然是最好的解决方案,因为它无需花费任何努力即可恢复先前的状态。但是如果你碰巧丢失了这些提交(例如,因为你同时垃圾收集了你的存储库,或者这是一个新的克隆),你总是可以再次重新设置分支。关键是 --onto 开关。

假设您有一个名为 topic 的主题分支,当 master 的尖端是 0deadbeef 提交时,您从 master 分支。在 topic 分支上的某个时刻,您执行了 git rebase master。现在您要撤消此操作。就是这样:

git rebase --onto 0deadbeef master topic

这将获取 topic 上所有不在 master 上的提交,并在 0deadbeef 上重放它们。

使用 --onto,您可以将您的历史重新排列成几乎任何形状。

玩得开心。 😃

我认为这是最好的选择,因为它具有灵活性。我将 b1 从 master 分支,然后将 b1 重新定位到一个新的分支 b2,然后想将 b1 恢复为再次基于 master。我只是喜欢 git - 谢谢!

这是这里最好的选择!它保留了我在当前分支上的所有更改,并删除了所有不需要的更改!

出于某种原因,你的回答让我意识到我可以做一个 git rebase -i commitish 然后编辑我不满意的提交:)

解决方案5:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

如果您已将分支推送到远程存储库(通常是原点),然后您已成功完成变基(没有合并)(git rebase --abort 给出“没有变基进行中”),您可以轻松重置分支使用命令:

git reset --hard origin/{branchName}

例子:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean

解决方案6:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

实际上,在执行任何重要操作之前,我在分支上放置了一个备份标记(大多数变基都是微不足道的,但如果它看起来很复杂,我会这样做)。

然后,恢复就像 git reset --hard BACKUP 一样简单。

你实际上甚至不需要创建一个备份分支,你可以简单地使用 branchName@{n} 语法,这里 n 是分支指针的第 n 个优先位置。因此,例如,如果您将 featureA 分支重新设置为 master 分支,但您不喜欢重新设置的结果,那么您只需执行 git reset --hard featureA@the official Git docs for revisions 即可将分支重置回您之前的位置做了rebase。您可以在 the official Git docs for revisions 阅读有关 branch@{n} 语法的更多信息。

解决方案7:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

git reset --hard origin/{branchName}

是重置由 rebase 完成的所有本地更改的正确解决方案。

这是一个非常干净的解决方案。感谢您的发表。我总是在做 rebase 之前推送到远程,这篇文章保存了我的培根,因为我在一个大项目上已经过时了大约 3 天。谢谢 :)

如果有未推送的本地提交,这可能会导致问题。被警告

解决方案8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

使用 reflog 对我不起作用。

对我有用的方法与描述的 here 类似。打开 .git/logs/refs 中的文件,该文件以重新定位的分支命名,并找到包含“rebase finsihed”的行,如下所示:

5fce6b51 88552c8f Kris Leech  1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

签出该行列出的第二个提交。

git checkout 88552c8f

一旦确认这包含了我丢失的更改,我就松了一口气。

git log
git checkout -b lost_changes

谢谢老兄,你救了我的命。对我来说,我有 rebase (finish): 后跟 3 个提交 ID。第二个ID是正确的。

我列出了 2 个提交 ID,并说 rebase (finish)。因为我想要在我 rebase 之前提交,所以我在 rebase 之前的行上使用了 2nd 提交 id(=== 在 WITH rebase 行上的 1st 提交 id命令)。然后我使用了命令 git reset --hard 。中提琴!恢复得好像我从未执行过变基一样。提交 ID 的格式似乎是 idBeforeCommand idAfterCommand Who Date/time Command

解决方案9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

对于多次提交,请记住任何提交都会引用导致该提交的所有历史记录。所以在查尔斯的回答中,将“旧提交”读作“最新的旧提交”。如果您重置为该提交,则导致该提交的所有历史记录都将重新出现。这应该做你想要的。

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

解决方案10:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

如果您成功地针对远程分支重新设置基础并且无法git rebase --abort,您仍然可以采取一些技巧来保存您的工作并且没有强制推送。假设您当前错误地重新建立基础的分支称为 your-branch 并正在跟踪 origin/your-branch

git branch -m your-branch-rebased # 重命名当前分支

git checkout origin/your-branch # checkout 到源已知的最新状态

git checkout -b 你的分支

检查 git log your-branch-rebased,与 git log your-branch 进行比较,并定义 your-branch 中缺少的提交

git cherry-pick COMMIT_HASH 为 your-branch-rebased 中的每个提交

推动你的改变。请注意,两个本地分支与 remote/your-branch 相关联,您应该只推送 your-branch

解决方案11:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

如果您不想进行硬重置…

您可以从 reflog 签出提交,然后将其保存为新分支:

git reflog

在你开始变基之前找到提交。您可能需要进一步向下滚动才能找到它(按 Enter 或 PageDown)。记下 HEAD 编号并替换 57:

git checkout HEAD@{57}

查看分支/提交,如果正确,则使用此 HEAD 创建一个新分支:

git checkout -b new_branch_name

原文链接:https://www.huntsbot.com/qa/9rda/undoing-a-git-rebase?lang=zh_CN

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

有关撤消 git rebase的更多相关文章

  1. 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

  2. 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])本质上在语义上是一样的

  3. ruby - 撤消自动缩进 - 2

    当你使用带自动缩进模式的irb时,end语句会额外缩进一层deffoo...end而不是显示普通的缩进约定:deffoo...end因为你不能提前告诉irb你要在下一行越狱一个关卡。这个问题已经在其他地方得到解决,比如here或here,但都没有给出令人满意的答案。他们只是建议放弃。但是,如果我们可以最低限度地覆盖一些irb方法,以便自动缩进将插入空格而不是在提示区域,而是在您键入的行的开头,那么默认情况下,irb仍将插入空格,但我们将能够用退格键删除一些空格。这可能吗?或者,如果这不现实,那么是否可以让irb从屏幕上删除最后一行,并在您在包含end的行上按Enter后立即以适当的缩进

  4. ruby-on-rails - 如何恢复/撤消对 Activerecord 对象的本地更改? - 2

    有没有办法撤消/恢复对Activerecord对象的任何本地更改。例如:user=User.firstuser.name#"Fred"user.name="Sam"user.name_was#"Fred"user.revertuser.name#"Fred"我知道我可以执行user.reload但我不必访问数据库来执行此操作,因为旧值存储在对象的状态中。最好是Rails3解决方案。 最佳答案 如thisanswer中所述Rails4.2在ActiveModel::Dirty中引入了restore_attributes方法:user=

  5. ruby - 有没有办法在 Test::Unit 中撤消 any_instance 的摩卡 stub - 2

    很像thisquestion,我也在使用RyanBates的nifty_scaffold。它具有使用Mocha的any_instance的理想方面。在Controller后面的模型对象中强制进入“无效”状态的方法。与我链接到的问题不同,我没有使用RSpec,而是使用Test::Unit。这意味着那里的两个以RSpec为中心的解决方案对我不起作用。是否有通用的(即:与Test::Unit一起使用)删除any_instancestub的方法?我认为它导致我的测试出现错误,我想验证这一点。 最佳答案 碰巧,Mocha0.10.0允许uns

  6. ruby-on-rails - 在 Rails 中撤消脚手架 - 2

    有什么方法可以“撤销”Rails中脚手架命令的效果吗? 最佳答案 首先,如果您已经运行了由scaffold命令生成的迁移,则必须先执行回滚。rakedb:rollback您可以使用以下方式创建脚手架:railsgeneratescaffoldMyFoo(或类似的),并且您可以销毁/撤消它使用railsdestroyscaffoldMyFoo这将删除所有由generate创建的文件,但不会删除您手动进行的任何其他更改。 关于ruby-on-rails-在Rails中撤消脚手架,我们在Sta

  7. javascript - 撤消实现 - DOM 操作 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭6年前。Improvethisquestion是否有可用于在JavaScript中实现DOM元素操作的撤消/重做功能的库?我正在编写一个围绕DOM元素移动的prototype.js应用程序(memonaut),允许编辑和删除这些元素。每个操作的元素都有事件处理程序和其他对象。不确定我是否需要为此推出我自己的命令模式实现。当然,必须有可用的东西吗?如果没有,建议和指示将是一个很大的帮助。

  8. javascript - 如何使用撤消创建可观察数组? - 2

    我正在尝试将knockoutJS添加到我们网站的搜索页面。目前您打开了一个jQuery对话框,其中有许多您可以选择的标准复选框。有多个对话框具有多种类型的标准。当您打开对话框时,复选框不会生效,直到您点击“更新”按钮,如果您单击取消或只是关闭窗口,您所做的更改将被还原并且对话框将设置为之前的状态。我读了this和其他一些帖子。然而,这似乎只适用于ko.observable,我似乎无法让它与ko.observableArray一起工作。有没有人完成过这个或者有什么想法?我想做的一个例子:HTML:MaleFemaleCancelUpdateJavascript:varviewModel=

  9. javascript - 使用 Canvas 撤消/重做绘画程序 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我需要为我的绘画程序实现一个撤消/重做系统:http://www.taffatech.com/Paint.html我想出的想法是有2个数组堆栈,一个用于撤消,一个用于重做。每当您绘制并释放鼠标时,它都会通过推送将Canvas图像保存到撤消数组堆栈。如果你画别的东西然后释放它也会做同样的事情。但是,如果您单击撤消,它将弹出撤消数组的顶部图像并将其打印到Can

  10. javascript - 撤消 ( ctrl + z ) 功能以恢复隐藏的 div - 2

    fiddlehttp://jsfiddle.net/Q8F5u/3/我有多个div,每个div的顶部都有一个删除按钮以删除那个特定的div(实际上我必须隐藏而不是删除)。在div被删除后,我想按CTRL+Z取回它们。我已经成功地将它们带回来了。我使用的逻辑是,我正在推送已删除的divid到堆栈,每当我按ctrl+z时,我都会弹出最后一个堆栈中隐藏的divID并使用此ID恢复隐藏的div。这里是javascript:vardeletedBlocks=[];$('.delete').on('click',function(){vardeletedid=$(this).closest('di

随机推荐