![](/img/trans.png)
[英]Moving merged commits back to old branch, reverting master and keeping changes
[英]Git revert in master reverting commits when merged into feature branch
我一直在一個單獨的分支big-feature
上開發一個主要的、長期的特性。 在其開發過程中,我也一直在對master
進行較小的無關更新(從技術上講,我一直在從master
對他們自己的分支進行較小的更新,然后將它們合並到master
。)
每次完成對master
的一些更改時,我一直習慣於將master
合並到big-feature
中,這樣功能分支不會偏離master
太遠,並且希望在 big feature 完成后合並會更容易。
但是,在最近的一些工作之后,我不小心將big-feature
合並到了master
中。 我試圖用revert
來糾正這個問題,實際上之前的代碼 state 似乎已經恢復了。 但是,我仍然看到master
的提交歷史中列出的big-feature
提交的完整歷史,以及頂部的merge
和revert
。
問題是,當我現在對master
進行小改動並嘗試將master
合並到big-feature
時,所有big-feature
的代碼都會恢復為master
的代碼。 我只能猜測master
的revert
被合並到big-feature
並刪除了big-feature
中的所有提交。
希望這是半連貫的。
問題:
master
合並到big-feature
中的策略是一個壞主意嗎? PS我還嘗試在錯誤合並之前將master
hard reset
為提交,但這並沒有從big-feature
中刪除所有提交,這讓我感到驚訝嗎?
我不小心將 big-feature 合並到 master 中。 我試圖用 revert 來糾正這個問題
這不是撤消合並的方法。
恢復是一個全新的提交,它是人為創建的,以便在未來的歷史中添加對之前的某個提交的否定。
撤消合並的方法是在您進行合並時所在的分支上,然后簡單地reset --hard
一次提交,即在合並提交之前的提交。 它沒有名稱,因此您必須使用HEAD~1
表示法或使用該提交的 SHA。 合並提交被丟棄,並且很快,我們就回到了合並之前的位置。
(你說你試過了,但你沒有給出你給出的實際命令,所以沒有理由認為你給出了正確的命令。)
在這個例子中,我在master
上創建了提交 A、B 和 C 並在feature
上提交了 Z,我已經將feature
合並到master
中——你可以看出這是因為(1)我在master
上,以及(2)合並提交是master
的一部分,而不是feature
的一部分:
* a65559d (HEAD -> master) merge commit
|\
| * c6c9d90 (feature) Z
* | caa732e C
* | 11bbc44 B
|/
* 92e934a A
請注意 SHA 編號。 假設我們對這一舉動感到遺憾。 因此,我們的目標是刪除a65559d
,以便將master
放回caa732e
,即我們合並feature
之前的位置。 我們目前在master
上,所以我們要做的就是說:
git reset --hard caa732e
結果:
* c6c9d90 (feature) Z
| * caa732e (HEAD -> master) C
| * 11bbc44 B
|/
* 92e934a A
正是我們想要的。
注意:僅當您能夠覆蓋歷史記錄時,此答案才適用。 只有在您沒有將更改推送到遠程或者您知道這不會影響其他開發人員的情況下才應該這樣做(例如,沒有或您可以與項目中的每個人交流您將要做什么做)
我該如何解決?
我假設當您將big-feature
合並到 master 時發生的事情是快進合並。
在這種情況下,使用git reset
重置為某些特定提交可能不起作用,因為我們來自master
和big-feature
的提交可能已經混合。 相反,我們可以使用git reflog
來查找 state 在我們進行合並之前所在的master
節點,然后將master
節點重置為該 state。
git reflog master # Show the history of updates to the tip of master.
# Find the line that says "master{n}: merge big-feature: Fast-forward"
# and note the reference number n
git switch master # checkout master if necessary
git reset --keep master@{n+1} # Now reset master to the reference just before merge
我定期將大師合並到大功能中的策略是一個壞主意嗎?
如果再次,您可以覆蓋歷史記錄,我建議您定期將您的feature
分支重新設置在master
上。 這為您提供了一個優勢,即在您的feature
分支上擁有干凈的歷史記錄,這使得與分支的交互更容易,包括在這種情況下。
我懷疑這里的問題是,當您現在將master
合並到big-feature
時,Git 正在拉動該合並還原提交,然后在功能上撤消了您在big-feature
中發生的一堆工作。 雖然可能有一種更優雅的方式來處理這個問題,但一個簡單的解決方案是從master
中挑選您希望也包含在big-feature
中的提交:
# from big-feature
git cherry-pick ABCD
以上假設ABCD
是master
中提交的 SHA-1 hash,它具有您想要引入big-feature
的次要修復。
使用這種方法需要更多的工作,因為您需要准確地確定需要輸入哪些提交,但它避免了不再適合您的合並蠻力方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.