如何轻松撤消git重基?冗长的手动方法是:
签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支
在我目前的情况下,这是可行的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用自己的两个分支重新建立了基础)。
澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。
如何轻松撤消git重基?冗长的手动方法是:
签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支
在我目前的情况下,这是可行的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用自己的两个分支重新建立了基础)。
澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。
当前回答
如果您在git rebase中搞乱了一些东西,例如git rebase--abort,而您有未提交的文件,它们将丢失,git reflog将不会有帮助。这件事发生在我身上,你需要跳出框框来思考。如果你像我一样幸运,并使用IntelliJ Webstorm,那么你可以右键单击->本地历史记录,并可以恢复到文件/文件夹的先前状态,无论你在版本控制软件中犯了什么错误。再运行一次故障保护总是很好的。
其他回答
使用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
对于多次提交,请记住,任何提交都引用导致该提交的所有历史记录。因此,在查尔斯的回答中,将“旧承诺”读为“旧承诺中的最新承诺”。如果您重置为该提交,那么导致该提交的所有历史记录都将重新出现。这应该是你想要的。
我通常做的是git reset#commit_hash
到最后一次提交,我认为rebase没有效果。
然后git拉动
现在,分支应该与主分支完全匹配,而重基提交不应该在其中。
现在,你可以在这个分支上随意选择提交的内容。
最简单的方法是找到分支的头部提交,因为它在reflog中的rebase开始之前。。。
git reflog
并将当前分支重置为它(通常需要注意的是,在使用--hard选项重设种子之前要绝对确定)。
假设ref日志中的旧提交是HEAD@{2}:
git reset --hard HEAD@{2}
在Windows中,您可能需要引用引用:
git reset --hard "HEAD@{2}"
您可以通过执行git-log head@{2}(Windows:git-log“head@{2}”)来检查候选旧标头的历史记录。
如果您没有禁用每个分支的reflog,您应该能够简单地执行gitreflog branchname@{1},因为在重新连接到最终头之前,rebase会分离分支头。我会再次检查这个,尽管我最近没有验证过。
默认情况下,为非裸存储库激活所有reflog:
[core]
logAllRefUpdates = true
实际上,在执行任何非平凡操作之前,我在分支上放置了一个备份标记(大多数重基是微不足道的,但如果它看起来很复杂,我会这样做)。
然后,恢复就像git reset一样简单——hard BACKUP。