如何轻松撤消git重基?冗长的手动方法是:

签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支

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

澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。


当前回答

如果您在git rebase中搞乱了一些东西,例如git rebase--abort,而您有未提交的文件,它们将丢失,git reflog将不会有帮助。这件事发生在我身上,你需要跳出框框来思考。如果你像我一样幸运,并使用IntelliJ Webstorm,那么你可以右键单击->本地历史记录,并可以恢复到文件/文件夹的先前状态,无论你在版本控制软件中犯了什么错误。再运行一次故障保护总是很好的。

其他回答

如果您在git rebase中搞乱了一些东西,例如git rebase--abort,而您有未提交的文件,它们将丢失,git reflog将不会有帮助。这件事发生在我身上,你需要跳出框框来思考。如果你像我一样幸运,并使用IntelliJ Webstorm,那么你可以右键单击->本地历史记录,并可以恢复到文件/文件夹的先前状态,无论你在版本控制软件中犯了什么错误。再运行一次故障保护总是很好的。

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

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

如果您成功地重新基于远程分支,并且不能git rebase--abort,那么您仍然可以使用一些技巧来保存您的工作,并且不需要强制推送。假设您的当前分支因错误而被重新设置为分支,并正在跟踪源/分支

gitbranch-m your branch rebased#重命名当前分支git checkout origin/your branch#签出到源已知的最新状态git结帐-b您的分行检查git-log您的分支,将其与git-log分支进行比较,并定义分支中缺少的提交gitcherry-pickCOMMIT_HASH用于分支中的每个提交推动您的更改。请注意,两个本地分支与远程/您的分支关联,您应该只推送您的分支

尽管这些答案应该是自动的(至少大部分是自动的),但没有一个答案是完全自动的,这让我非常恼火。我创建了一组别名来尝试解决这个问题:

# Useful commands
#################

# Undo the last rebase
undo-rebase = "! f() { : git reset ; PREV_COMMIT=`git x-rev-before-rebase` && git reset --merge \"$PREV_COMMIT\" \"$@\";}; f"

# See what changed since the last rebase
rdiff = "!f() { : git diff ; git diff `git x-rev-before-rebase` "$@";}; f"

# Helpers
########
# Get the revision before the last rebase started
x-rev-before-rebase = !git reflog --skip=1 -1 \"`git x-start-of-rebase`\" --format=\"%gD\"

# Get the revision that started the rebase
x-start-of-rebase = reflog --grep-reflog '^rebase (start)' -1 --format="%gD"

您应该能够对其进行调整,以允许非常容易地返回任意数量的重基(处理参数是最棘手的部分),如果您连续快速地进行了多次重基,并在过程中搞乱了一些事情,这将非常有用。

注意事项

如果任何提交消息以“rebase(start)”开头(请不要这样做),这会让人感到困惑。通过为正则表达式匹配以下内容,可以使正则表达式更具弹性以改善情况:

--grep-reflog "^rebase (start): checkout " 

警告:未测试(正则表达式可能需要调整)

我之所以没有这样做,是因为我不是百分之百地认为重新启动总是从结账开始。有人能证实这一点吗?

[如果您对函数开头的null(:)命令感到好奇,这是为别名设置bash补全的一种方法]

git reset --hard origin/{branchName}

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