有人知道如何轻松撤消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-branch
git log your-branch-rebased
,比较git log your-branch
并定义缺少的提交your-branch
git cherry-pick COMMIT_HASH
每次提交 your-branch-rebased
remote/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问题上回答时。