簡體   English   中英

GIT:從特定提交開始,還原所選的提交,釋放,然后重新應用它們

[英]GIT: revert selected commits since a certain commit, release, then reapply them

對於XY的兩個錯誤修正,有大量提交提交,這些修正已推送到遠程存儲庫中的發行分支。 在提交a之后,完成了分支的最后一個穩定版本。

在此處輸入圖片說明 錯誤修正X已完成,但錯誤修正Y仍在進行中。 x提交與y提交混在一起。

初衷是為了釋放錯誤修正XY在一起,但事情發生了變化,它的決定,我們現在需要釋放X的修補程序。

從概念上講,這意味着我必須刪除所有自提交a以來的y提交,並保留所有x提交-然后從分支中釋放bugfix X-然后重新應用所有y提交,以便可以在bugfix Y上恢復工作。

我想到的一個解決方案是,從commit a分支,然后選擇x1x2x3到新分支,然后從那里釋放。 但是,不幸的是,這是不可能的,因為我必須從該分支中​​釋放出來,然后再繼續處理它(不要問我為什么,我只是這樣做:))

這不是我以前使用GIT遇到的問題,因此我不確定有哪些潛在的模式可以解決它。 那么, 實現目標的最優雅的方法是什么?

我想要一個使用最少步驟的解決方案,在應用分支之前保留分支的真實歷史記錄( 即,我嚴格不能變基! ),並且不需要手動文件編輯(合並可能除外)。

最優雅的方法是重新設置--interactive

更新由於您已經澄清了甚至不是一個選擇,因此顯然您已經revert並左cherry-pick (就像會計師一樣:沒有刪除,但有“櫃台預訂”)。

這可能會很乏味。 但是,您可以使用UI來發揮自己的優勢。 或者您可以使事情自動化:

更新我已經在Coliru上制作了完整的獨立演示Live

如果您可以“ grep”問題跟蹤器ID的提交,則可以使事情自動化。 這是一個演示示例,假設您在提交消息中使用了票證編號#724 (請注意,它如何通過執行a..HEAD (用相關的commit-id或標簽代替a來限制對grep的提交范圍:

$ culprits=$(git rev-list --grep='#724' a..HEAD)
$ do git revert --no-edit $culprits

現在釋放您!

$ git tag RELEASE_20130913   # or, maybe, do the release immediately
    $ git cherry-pick $culprits 

如果您搞砸了,只需git reset --hard 'commit' ('commit'指的是第一次revert之前的最后一次提交)。


原始答案:

最優雅的方法是重新設置--interactive

git rebase -i a

許多git gui工具使執行此操作異常容易(Windows上的TortoiseGit,非常好)。 但是,我完全可以按照命令行版本中的屏幕說明進行操作(讓您在文本編輯器中“編輯變基計划”)。

因此,您的基准將提出例如

pick a comment1
pick x1 comment2
pick y1 comment3
pick x2 comment4
pick x3 comment5
pick y2 comment6

只需重新排序:

pick a comment1
pick x1 comment2
pick x2 comment4
pick x3 comment5
pick y1 comment3
pick y2 comment6

注意:自從提交x1之后,這確實會重寫歷史記錄(但是尚未發布,因此您可能可以確定同事是否有問題,他們可能現在必須將其更改基於新的HEAD)。 公正的警告。

並做了!


重新設置基准后,只需標記新的修訂版x3 (帶有“ comment5”),例如

git tag release_20130912 HEAD~2

然后放開那個 它仍將來自當前分支,該分支已經具有兩個y1y2提交。

暫無
暫無

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

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