簡體   English   中英

刪除/撤消 Sourcetree 上的合並

[英]Removing/undoing a merge on Sourcetree

我在我的項目中做了很少的更改(我正在處理遠程分支而不是主分支),我提交了它們並在 BitBucket 上創建了一個拉取請求並將分支合並到主分支。 我忘記在提交后推送我的更改。 現在,在嘗試將當前分支切換到我的遠程分支並恢復到合並之前的提交之后,我設法取回所有更改並將它們備份到我系統的其他地方。 我現在要做的是撤消我所做的錯誤合並。 每次單擊合並並選擇“反向提交”時,都會收到以下錯誤消息:

“錯誤:提交是一個合並,但沒有給出 -m 選項。

致命:還原失敗”

分支現在看起來像這樣:

在此處輸入圖像描述

我想刪除合並並將其置於不再顯示master(4 behind)的狀態。

此方法基於歷史刪除:

  1. 檢查你犯錯的分支
  2. 右鍵單擊要將分支重置為的提交
  3. 單擊“將當前分支重置為此提交”
  4. 選擇“Hard”模式並點擊“OK”
  5. 不幸的是,您需要終端來執行此操作。 輸入git push origin name_of_branch --force到終端(您可能需要輸入您的 git repo 用戶名和密碼才能接受命令)

更新:當前版本的源碼樹支持強制推送。 這意味着您不需要使用步驟 5 中提到的命令! 推動時可見一個標有“力”的復選框。 它通常被禁用。

如何啟用強制推送復選框:

  1. “工具”(在屏幕頂部的藍色欄中)
  2. “選項”
  3. “Git”選項卡
  4. “啟用強制推送”(第 2 部分)
  5. “好的”

推送時選中該復選框以修復源服務器上的錯誤。

這可能是最簡單的方法,但由於它基於歷史刪除,如果其他人正在處理該項目,請確保讓他們都知道您在做什么,這樣您就不會破壞任何人的 git 存儲庫。

更新 2:如果您使用 Visual Studio Code 作為代碼編輯器,我強烈建議您安裝“Git Graph”擴展。 它允許您執行源樹允許您執行的幾乎所有操作,但您可以直接在代碼編輯器中執行此操作! 使用 Git Graph 執行此操作的步驟與在 Source Tree 中執行此操作的步驟大致相同。

非常不幸的是,SourceTree 無法讓您輕松恢復合並提交(至少在 Windows SourceTree 1.5.2.0 中)。 但是,可以從命令行輕松完成恢復合並,但是您想通過添加與合並提交結果相反的另一個提交來恢復合並,還是只想從歷史記錄中刪除合並提交共?

如果您不與其他人共享您的master分支,最簡單的做法是簡單地進行硬重置以從歷史記錄中刪除合並提交。 但是,如果其他人已經擁有該合並提交的副本,那么當他們嘗試將他們的master副本與您的重寫版本重新同步時,您將為他們創建額外的工作。

所以你需要弄清楚你想使用哪個選項。 我將使用命令行給出兩者的步驟:

從歷史記錄中刪除提交

git checkout master
git push origin master --force

這將使用本地master分支的當前狀態覆蓋origin/master上的合並提交,從而刪除合並提交。

使用另一個反向提交來恢復提交

git checkout master
git merge origin/master
git revert -m 1 HEAD

這將使您的本地master分支與origin/master同步,然后您可以通過告訴git revert一個父級是應該被視為“主線”父級的那個來添加反向提交,它將創建相對於從另一個父提交帶來的更改的反向提交。

如果稍后您決定要再次從另一個父級引入更改,那么您需要添加另一個還原提交來還原您剛剛所做的還原提交(一種稱為“還原還原”的技術)。

也可以看看:

  1. 撤消 Git 合並?
  2. 如何“取消還原”已還原的 Git 提交? .
  3. git-revert(1) 手冊頁
  4. 如何恢復錯誤的合並

請按照以下步驟進行:

恢復合並提交

Master 與沖突/不需要的代碼合並並推入開發。

使用 Sourcetree 恢復:

  1. 選擇開發,選擇必須將分支恢復到的最后一個提交。
  2. 右鍵單擊該分支並選擇“Reset develop to this commit”
  3. 從彈出窗口中,從左下角的下拉菜單中選擇hard 完成。

此后不應有拉力。 如果發生任何拉動,請使用以下終端恢復。

現在將master合並到develop。

要使用終端恢復:

  1. 選擇開發,選擇必須將分支恢復到的最后一個提交。
  2. 從 Sourcetree 打開終端
  3. 輸入git reset --hard <commit_before_merge id long one>
  4. 如果源樹中出現任何拉計數,則鍵入git push -f ,然后完成。

合並master到develop。

我找到了另一種沒有命令行的方法,有點難看,但可以完成工作。

因此,對要回滾的提交進行硬重置,轉到項目文件夾(在 Mac 上使用 Finder 或在 Windows 上使用資源管理器)並復制整個文件夾。 您在此“復制”文件夾中的內容是您希望在此過程結束時到達的位置。

嗯...回到源代碼樹,然后簽出 Head(最新提交到您的遙控器),然后再次導航到項目文件夾,確保您可以看到隱藏文件夾,因為您必須能夠看到名為“.混蛋”

項目文件夾

從當前項目中刪除“.git”以外的所有內容,這意味着您當前的項目除了名為“.git”的文件夾之外什么都沒有,然后導航到“復制”文件夾並復制“.git”文件夾以外的所有內容並粘貼內容在您當前的項目中(僅包含“.git”文件夾的項目)

完畢。 轉到源代碼樹並提交更改,您的項目正是您想要的位置,並且所有更改都已刪除。

結束。


Obs1:現在刪除“復制”文件夾以清除您的電腦上的臟文件。

Obs2:此過程不會從 Git 中刪除您的更改,提交將在那里,您所做的是刪除您的更改並提交它。

非破壞性方法

我遇到了一種情況,我以前的解決方案不是一個選擇。 我無法強制推送掌握,即使我可以,這對其他開發人員來說也太具有破壞性了。

我發現了這種新方法,它可以 100% 保留 git 歷史記錄,並且對團隊中的其他開發人員完全沒有干擾。

  1. 在錯誤合並之前創建一個新分支
  2. Cherry-pick錯誤的合並提交到這個新分支(這會將合並轉換為正常提交)
  3. 恢復櫻桃選擇提交
  4. 合並新分支到master

而已!

(您可以通過右鍵單擊 git 歷史記錄中的提交並從上下文相關菜單中選擇選項來完成大部分操作)

更新:第 4 步沒有顯示任何更改?

如果發生這種情況:

  • 如果您可以直接提交給master,那么櫻桃選擇直接將revert commit 提交給master。
  • 如果您不能直接提交到 master,請從 master 創建一個新分支,然后將恢復提交選擇到該分支上,然后將該新分支合並到 master。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM