[英]Git saying no changes when trying to merge
主分支提交:
git 日志 output
removedc1Changes(最新提交)
c2
c1
現在我使用 c1 commit hash 創建了一個名為 staging from master 的新分支: git checkout c1
暫存分支提交:
git 日志 output
c1
現在,如果我嘗試將 staging 分支合並到 master,它說沒有變化..
我知道這一定是因為兩個分支中都存在相同的提交,但在主分支中,它已被還原..
“事物就是事物本身,而不是其他事物。” Git 就是 Git,而不是你想象的 Git 或希望 Git 的樣子。 要使用 Git,您需要知道 Git 是什么。 合並,在 Git 中,是一個新的提交,它在兩個分支中執行自分歧點以來的所有更改。
您的分支機構之間的分歧點是c1
。 從那時起,一個分支添加了c2
並刪除了removedc1Changes
。 另一個分支添加了......什么都沒有。
正如 Git 告訴您的那樣,自分歧點以來,您的staging
分支沒有任何更改(因為您沒有在staging
分支上進行任何新提交)。 因此沒有什么可以合並的。
自c1
以來唯一的變化是c2
和removedc1Changes
on master
,它們已經在master
上。 所以合並沒有什么可做的。 自分歧點以來,兩個分支所做的更改已經存在於master
上。 執行合並的唯一方法是為 Git 創建一個實際上為空的新提交,即它與removedc1Changes
相同。
(這是另一種看待它的方式。正如您所說,這兩個分支確實都包含c1
。但是從那以后, master
撤消了c1
,並且staging
沒有做任何與此相矛盾的事情。)
因此,您的偽合並不是撤消您之前所做的還原的可行策略。 撤消還原的方法是還原它,或者硬重置到還原之前的狀態以將其擦除。
你有什么是這樣的:
master
v
*---*---*---*---c1---c2---c1r
^
staging
如果你想將staging合並到master中,git告訴你無事可做是正確的。
一切都在進行中,這個:
*---*---*---*---c1
^
staging
已經在 master 上了,在這里:
+---- here ------+ master
| | v
*---*---*---*---c1---c2---c1r
您需要做的是恢復 c1 的刪除,此命令:
git revert c1r
(c1r = hash 您稱為“removedc1Changes”的提交)
這會給你這個:
master
v
*---*---*---*---c1---c2---c1r---c1rr
^
staging
在這種情況下,您將再次看到 c1 引入的更改。
您不需要暫存分支。
另一種方法是將 master 重置為刪除 c1 之前的狀態,如下所示:
git reset --hard c2
這會給你這個:
master
v
*---*---*---*---c1---c2
^
staging
如果您的場景是 100% 准確的,master 提示處的提交是從 c1 中刪除更改,我會進行重置。 如果您在它之后有其他提交,我會改為執行還原。
git 合並不執行任何操作的原因是 git 不嘗試合並 state,它合並更改。 由於沒有對 staging 進行任何更改,而 staging 還沒有在 master 上進行,因此沒有要合並的更改,因此無需執行任何操作。
從討論來看,您想要重新應用 C1 提交更改。 我認為您可以使用 C1 提交的git cherry-pick
,這將復制原始提交,本質上是重新應用它。
git cherry-pick <C1 commit sha>
在合並到主分支(或創建 PR)之前,您可以在暫存分支上執行此操作。
請注意,這將保持歷史記錄不變,只是在頂部添加一個新的提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.