我在一個名為 BR1 的功能分支中作業,它是從 master 分支出來的。此時master和我的分支有a.js內容的檔案:
1: console.log(`Hello Duck`);
創建 BR1 大約 20 天后,master 恢復到過去的提交。現在a.jsmaster中的內容改回了:
1: console.log(`Hello Dog`);
在此期間,我a.js在我的分支中添加了更多代碼:
1: console.log(`Hello Duck`); // this line was not changed
2: if (foo === bar) return; // added this line.
如何將我的 BR1 分支合并到 master 中,避免將a.js我的分支中的內容替換為 master。我想保留我沒有更改/添加的行上的主內容。我想要這樣的東西:
1: console.log(`Hello Dog`);
2: if (foo === bar) return; // add this line.
uj5u.com熱心網友回復:
在 Git 中,revert一詞與reset一詞具有不同的含義,并且它們不可互換。您還原一個承諾將通過創造一個新的提交其確實的承諾你正在恢復,有效地撤消更改相反。當您重置一個分支時,您會更改該分支所指向的提交,并且如果您將其向后移動到該分支上較舊的提交,那么此后的所有提交都會從該分支中??有效地洗掉。
鑒于這些定義,以下是沒有意義的:
master 被恢復到過去的提交。
我假設你的意思是:
master 被重置為過去的提交。
為什么這很重要?
如果改變這行已經提交恢復上master,然后當你合并你的分支到master你可能不得不您可以通過選擇確切的結果你想已經解決沖突(走的是較舊的第一行和你的新的第二線)。但是由于master被reset,您的分支在 Git 看來是所有更新的更改,因此 Git 將選擇您的所有更改而不提示解決沖突。
那你該怎么辦?
您可以執行多種操作,其中兩項是:
進一步考慮后,不要選擇此選項。
只需將檔案的第一行更改為它在當前此選項的問題在于您將帶回master分支上的樣子,然后在您的分支上提交它,并使用標題訊息“由于分支重置而更新”以及提交訊息詳細資訊中的更多資訊。現在,當您在分支中合并時,您不會影響由于重置而未完成的行。master重置時洗掉的提交,這些提交可能是有意洗掉的。這樣做:重建你的分支,就好像它是從當前的
master樣子中分離出來的。有多種方法可以做到這一點,但從概念上講,您可以從當前分支創建一個新分支master,然后將您的每個提交挑選到該分支上。對于您需要解決的第一個更改,您將在相關線路上遇到沖突。您還可以使用類似于以下內容的內容對您的分支進行“花式”變基:git rebase --onto current-master old-master使用 rebase,您還需要解決第一行中的沖突。
旁注:這是重置共享分支的原因之一,例如master令人不悅,因為它可能會弄亂所有基于它的分支,這正是您的情況。
uj5u.com熱心網友回復:
去做就對了。你必須告訴 Git 該對的正確結果,它會(正確地)注意到相鄰線的變化,并要求人工判斷它們是否以及如何互動。在像這樣的“他們不這樣做”的情況下,這可能會令人驚訝,但關鍵是,他們經常這樣做,而 Git 假設他們不這樣做將是一個非常糟糕的呼叫。
善用工具,像這樣的瑣碎案件需要兩秒鐘才能解決。
git init testmerge; cd $_
echo Hello Duck >t1; git add .; git commit -m duck
git checkout -b br1
echo new line >>t1; git commit -am newline
git checkout master;
echo Hello Dog >t1; git commit -am dog
git merge br1
并且 Git 報告了一個沖突,相鄰的行發生了變化。您進行沖突提交的順序無關緊要,重要的是兩個提示對重疊或鄰接線進行了更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360185.html
標籤:混帐 合并 git合并 git-rebase git-revert
