[英]GIT: revert selected commits since a certain commit, release, then reapply them
對於X和Y的兩個錯誤修正,有大量提交提交,這些修正已推送到遠程存儲庫中的發行分支。 在提交a之后,完成了分支的最后一個穩定版本。
錯誤修正X已完成,但錯誤修正Y仍在進行中。 x提交與y提交混在一起。
初衷是為了釋放錯誤修正X和Y在一起,但事情發生了變化,它的決定,我們現在需要釋放X的修補程序。
從概念上講,這意味着我必須刪除所有自提交a以來的y提交,並保留所有x提交-然后從分支中釋放bugfix X-然后重新應用所有y提交,以便可以在bugfix Y上恢復工作。
我想到的一個解決方案是,從commit a分支,然后選擇x1 , x2和x3到新分支,然后從那里釋放。 但是,不幸的是,這是不可能的,因為我必須從該分支中釋放出來,然后再繼續處理它(不要問我為什么,我只是這樣做:))
這不是我以前使用GIT遇到的問題,因此我不確定有哪些潛在的模式可以解決它。 那么, 實現目標的最優雅的方法是什么?
我想要一個使用最少步驟的解決方案,在應用分支之前保留分支的真實歷史記錄( 即,我嚴格不能變基! ),並且不需要手動文件編輯(合並可能除外)。
最優雅的方法是重新設置--interactive
更新由於您已經澄清了這甚至不是一個選擇,因此顯然您已經revert
並左cherry-pick
(就像會計師一樣:沒有刪除,但有“櫃台預訂”)。
這可能會很乏味。 但是,您可以使用UI來發揮自己的優勢。 或者您可以使事情自動化:
如果您可以“ 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
然后放開那個 。 它仍將來自當前分支,該分支已經具有兩個y1
, y2
提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.