rebase用法 - git undo rebase




撤消git rebase (10)

使用reflog對我不起作用。

對我有用的東西與here描述的類似。 打開以重新分支的分支命名的.git / logs / refs中的文件,找到包含“rebase finsihed”的行,如:

5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

簽出該行上列出的第二個提交。

git checkout 88552c8f

一旦確認,這包含了我失去的變化,我分支並鬆了一口氣。

git log
git checkout -b lost_changes

有誰知道如何輕鬆撤消git rebase?

想到的唯一方法是手動進行:

  • git checkout兩個分支的提交父級
  • 然後從那裡創建一個臨時分支
  • 櫻桃 - 手工挑選所有提交
  • 用手動創建的分支替換我重新定位的分支

在我目前的情況下,這將是有效的,因為我可以很容易地發現兩個分支的提交(一個是我的東西,另一個是我的同事的東西)。

然而,我的方法讓我感到不理想和容易出錯(假設我剛剛用自己的2個分支進行了重新定位)。

有任何想法嗎?

澄清:我正在談論一個重播,在此期間重播了一堆提交。 不僅僅是一個。


假設我將master重新綁定到我的功能分支,並且我得到了30個新的提交,這些提交會破壞某些功能。 我發現通常最簡單的方法就是刪除糟糕的提交。

git rebase -i HEAD~31

最近31次提交的交互式rebase(如果選擇的方式太多則不會受到影響)。

只需要刪除你想要刪除的提交,並用“d”而不是“pick”標記它們。 現在刪除了提交,有效地刪除了rebase(如果只刪除了剛剛進行rebased時提交的提交)。


如果您已將分支推送到遠程存儲庫 (通常是它的原點)然後您已經完成了成功的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

如果你在git rebase --abort了一些東西,例如git rebase --abort ,當你有未提交的文件時,它們將會丟失並且git reflog將無濟於事。 這發生在我身上,你需要在這裡開箱即思考。 如果您像我一樣幸運並使用IntelliJ Webstorm,那麼您可以right-click->local history ,無論您使用版本控制軟件犯了什麼錯誤,都可以恢復到文件/文件夾的先前狀態。 另一個故障安全運行總是好的。


如果您尚未完成rebase,並且在其中間,則以下工作:

git rebase --abort

實際上,rebase將你的起點保存到ORIG_HEAD所以這通常很簡單:

git reset --hard ORIG_HEAD

但是, resetreset rebasemerge都將您的原始HEAD指針保存到ORIG_HEAD因此,如果您已經嘗試撤消的rebase中已經執行了任何這些命令,那麼您將不得不使用reflog。


對於多次提交,請記住任何提交都會引用導致該提交的所有歷史記錄。 所以在查爾斯的回答中,將“舊提交”稱為“舊提交的最新內容”。 如果重置為該提交,則會再次出現導致該提交的所有歷史記錄。 這應該做你想要的。


我很驚訝這裡沒有人提到過這個。 Rebase將舊狀態ORIG_HEADORIG_HEAD ,因此您可以通過運行以下命令恢復最後一個rebase:

git reset --hard ORIG_HEAD

查爾斯的答案有效,但你可能想這樣做:

git rebase --abort

reset後清理。

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


根據@Allan和@Zearin的解決方案,我希望我可以簡單地做一個評論,但我沒有足夠的聲譽,所以我使用了以下命令:

而不是做git rebase -i --abort (注意-i )我不得不簡單地做git rebase --abort沒有 -i )。

同時使用-i--abort會導致Git向我顯示使用/選項列表。

因此,此解決方案的先前和當前分支狀態為:

[email protected] /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

[email protected] /my/project/environment (branch-123)
$




undo