有人知道如何轻松撤消git rebase吗?
想到的唯一方法是手动进行操作:
- git签出两个分支的提交父对象
- 然后从那里创建一个临时分支
- 手动选择所有提交
- 用手动创建的分支替换我重新建立基础的分支
在我目前的情况下,这是可行的,因为我可以轻松地发现两个分支的提交(一个是我的东西,另一个是我同事的东西)。
但是,我的方法给我的印象是次优且容易出错(例如,我刚刚使用自己的两个分支进行了重新基准化)。
有任何想法吗?
澄清:我说的是在重新部署一堆提交时进行的重新部署。不只是一个
有人知道如何轻松撤消git rebase吗?
想到的唯一方法是手动进行操作:
在我目前的情况下,这是可行的,因为我可以轻松地发现两个分支的提交(一个是我的东西,另一个是我同事的东西)。
但是,我的方法给我的印象是次优且容易出错(例如,我刚刚使用自己的两个分支进行了重新基准化)。
有任何想法吗?
澄清:我说的是在重新部署一堆提交时进行的重新部署。不只是一个
Answers:
最简单的方法是找到分支的头提交,就像在reflog中重新启动基础之前一样。
git reflog
并将其重置为当前分支(通常的警告是在使用该--hard选项重置之前必须绝对确定)。
假设旧的提交HEAD@{5}在引用日志中:
git reset --hard HEAD@{5}
在Windows中,您可能需要引用以下引用:
git reset --hard "HEAD@{5}"
您只需执行git log HEAD@{5}(Windows :),即可检查候选旧头的历史git log "HEAD@{5}"。
如果您尚未针对每个分支的更新禁用它,那么您应该能够简单地执行此操作,git reflog branchname@{1}因为在重新连接到最终头之前,通过一个变基将分支头分离。我会再次检查,尽管最近还没有验证。
默认情况下,针对非裸存储库激活所有引用日志:
[core]
logAllRefUpdates = true
git rebase --abort(-i没有意义有--abort)可以放弃尚未完成变基-要么是因为有冲突,或者因为它是互动或两者; 问题不在于撤销成功的重新建立基础。你要么使用rebase --abort或reset --hard根据自己的情况你在,你不应该需要做两件事。
git tag BACKUP。如果出现问题,您可以返回git reset --hard BACKUP
commit:,而不是rebase:。听起来很明显,但是让我有些困惑。
git reset --hard ORIG_HEAD意外变基之后,立即采取措施也不会吗?
实际上,rebase将您的起点保存到了,ORIG_HEAD因此这通常很简单:
git reset --hard ORIG_HEAD
但reset,rebase和merge所有保存自己的原始HEAD指针变成ORIG_HEAD这样,如果你所做的任何自底垫你试图撤消,那么你就必须使用引用日志的命令。
git rebase --abort尽管。
git 2.17.0。
git reset --hard ORIG_HEAD可以反复使用来回滚。假设,如果A ---将git reset --hard ORIG_HEAD
git rebase --abort吗?
查尔斯的答案有效,但您可能需要这样做:
git rebase --abort
清理后reset。
否则,您可能会收到消息“ Interactive rebase already started”。
将分支重置为其旧提示的悬挂提交对象当然是最好的解决方案,因为它无需花费任何精力即可恢复先前的状态。但是,如果您恰巧丢失了这些提交(例如,因为在此期间您对存储库进行了垃圾回收,或者这是一个新的克隆),则始终可以重新建立分支的基础。关键是--onto开关。
假设您有一个想象中的主题分支topic,master当提交的尖端master是0deadbeef提交时分支出来。在topic分支机构的某个时候,您做到了git rebase master。现在您要撤消此操作。就是这样:
git rebase --onto 0deadbeef master topic
这将接受所有未提交的提交topic,master并在之上重播它们0deadbeef。
使用--onto,您可以将您的历史重新排列成几乎任何形状。
玩得开心。:-)
--onto,并-i可以重新布置历史进入几乎任何形状任何责任。使用gitk(或在Mac上为gitx)查看制作的形状:-)。
如果您已将分支推送到远程存储库(通常是它的原点),然后成功完成了一次完整的rebase(没有合并)(git rebase --abort给出“ No rebase in progress”),则可以使用以下命令轻松重置分支:
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
使用reflog对我不起作用。
对我有用的类似于此处所述。在.git / logs / refs中打开文件,该文件以经过重新基准化的分支命名,并找到包含“ rebase finsihed”的行,如下所示:
5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
检出该行上列出的第二个提交。
git checkout 88552c8f
一旦确认其中包含我丢失的更改,我便分支了,松了一口气。
git log
git checkout -b lost_changes
遵循@Allan和@Zearin的解决方案之后,我希望虽然可以发表评论,但我的信誉不高,所以我使用了以下命令:
而不是做git rebase -i --abort (注意-i),我不得不简单地做git rebase --abort(没有的-i)。
同时使用-i和--abort同时使Git向我显示使用/选项列表。
因此,此解决方案的以前和当前分支状态是:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
如果您成功地根据远程分支重新建立了基础,并且git rebase --abort仍然无法进行操作,那么您仍然可以采取一些技巧来保存您的工作,而不必强制执行。假设您的当前分支被错误地重新建立了基础your-branch并正在跟踪origin/your-branch
git branch -m your-branch-rebased #重命名当前分支git checkout origin/your-branch #签出到已知起源的最新状态git checkout -b your-branchgit log your-branch-rebased,比较git log your-branch并定义缺少的提交your-branchgit cherry-pick COMMIT_HASH 每次提交 your-branch-rebasedremote/your-branch您应该只推送your-branch如果您在分支机构,则可以使用:
git reset --hard @{1}
不仅有HEAD的参考日志(由获取git reflog),还有每个分支的参考日志(由获取git reflog <branch>)。所以,如果你是master那么git reflog master就会列出所有更改该分支。你可以参考由变化master@{1},master@{2}等等。
git rebase 通常会多次更改HEAD,但当前分支只会更新一次。
@{1}只是当前分支的快捷方式,因此它等同于master@{1}on master。
git reset --hard ORIG_HEAD如果您git reset在互动过程中使用过,将无法使用rebase。
git reset --hard origin / {branchName}
是重置所有通过rebase完成的本地更改的正确解决方案。
origin/branch可能会丢失HEAD与该点之间的更改。一般来说,您不希望这样做。
如果您在git rebase中弄乱了某些东西,例如git rebase --abort,当您有未提交的文件时,它们将丢失并且git reflog无济于事。这发生在我身上,您将需要在这里跳出框框。如果像我一样幸运并使用IntelliJ Webstorm,那么right-click->local history无论您使用版本控制软件犯了什么错误,都可以并且可以恢复到文件/文件夹的先前状态。再次运行故障安全总是好事。
git rebase --abort中止活动的基准,它不会撤消基准。同样,同时使用两个VCS是一个坏主意。它是Jetbrains软件中的一个不错的功能,但您不应同时使用两者。最好只学习Git,特别是在有关Stack Git的Stack Overflow问题上回答时。