2017-06-15 37 views
0

TL; DR:從純理論的角度來看,是有可能的Git的合併過程中的一個文件報告衝突(不重訂)的一個分支進入主如果該文件從未被所有修改的分支(它是直接從主創建的)?Git:在合併源中從未修改過的文件上是否會存在合併衝突?

當我將我的開發分支合併回主人時,我常常遇到文件上的衝突,這些文件對於我來說我不記得曾經修改 - 甚至打開過。所以我想了解是否 - 給定Git如何工作,哪些我不太瞭解 - 這在實際情況下可能是實際可行的,或者如果這是不可能的,那麼我應該關注某些顯然修改工作樹中某些文件的內容沒有我注意到(f.ex.類似Eclipse中的Save Actions,自動格式化,行尾處理等)。

我只是在談論文件衝突,而不是樹衝突,或者其他任何可能涉及文件刪除或重新命名或移動的事情。

這是我的非常簡單的典型的工作流程的例子,例如:It使用用Eclipse(始終是最新的):

)創建從主一個Dev分支;我勾選了「爲推拉配置上游」複選框,並在「拉取時」列表框中選擇「合併」(其他條目爲「重新部署」,「保留合併提交的重新保存」,「交互重新配置」)。

沒有人會致力於該分支,本地和遠程,在所有只有我和只有一臺電腦。

)我檢查開發分支,並在幾天內我每天都會對其進行更改。每一次提交都使用「提交和推送」而不是「提交」來完成,因爲我希望我的所有提交都始終在遠程分支上。

在某些情況下,我的「提交和推送」的推送部分導致「拒絕 - 不快進」。在這種情況下,執行「Pull」並重復推送解決方案,並且一些同事說,必須先執行Pull以避免Push導致「不快速前進」,這是正常的。但這不是問題。

)現在需要將我的開發分支合併回主。我拉,切換回主,拉,選擇合併,選擇我的本地開發分支,在「合併選項」下我選擇「壁球」,在「快進選項」我離開默認「如果快進,只更新分支指針「(其他選項是」如果快進,創建合併提交「和」如果不是快進,失敗「)。

然後我單擊合併,然後得到「結果:衝突」,我去解決這些衝突,並且在某些情況下,既沒有在「我的」(主)下顯示爲紅色的衝突代碼,也沒有在「他們的「(我的開發部門)是我寫的東西。我從來沒有在任何部分修改過這個文件,但是當把這個文件從未改變過的分支合併到主文件中時,它的變化卻發生了衝突。

所以我的問題是,從純理論的角度來看,Git是否應該在分支合併到主文件時報告文件衝突,儘管該文件在分支上從未被修改過?如果是的話,我的工作流程是否符合上述情況之一?

這不是this的重複,因爲這是關於使用rebase。

+1

我們也遇到了無法解釋的衝突,我認爲我們在本例中對此進行了解釋:有人對其他分支進行了提交。由於其他分支是該產品的舊版本(但仍然保留),因此這一提交與我們最新分支上的代碼不兼容。然而,我們將舊分支合併到較新的分支以帶來錯誤修正,因此從舊分支到我們當前分支完成虛擬合併,使用「我們的策略」忽略更改,然後重新實現。後來的合併在合併到其他分支時產生了衝突。 –

+0

@ LasseV.Karlsen謝謝;我沒有足夠的技巧來判斷這樣的解釋是否表明事實上完全可能,當我的分支合併到主分支中時,對於那些從未在該分支上修改過的文件產生衝突,但它確實聽起來如此,更重要的是,讓我意識到可能有其他團隊成員可以做的事情 - 不是我的分支,而是主人 - 當我將分支合併到主人中時,最終會產生這些無法解釋的衝突;我會試着去理解這種可能性是否真的存在,因爲這可能是真正發生的事情。 – SantiBailors

+1

當我們合併到主分支(您的案例中的主分支)時,我們特別使用'-s our'策略合併了「忽略來自其他分支的更改」。然而,當後來將這個分支合併到一個特性分支中以使其更新以修復我們**引入的合併衝突時,我們也收回了我們特別想要的那個其他分支的所有合併衝突忽視。最終,當這個策略合併之前我們沒有創建更多的功能分支時,問題就消失了,但當它持續時,這是一個痛苦。 –

回答

1

更新 - 意識到我忘了要回直接回答這個問題......


首先第一件事情:如果你有拉,然後才能推動,那麼別人正在提交在你修改並推動的分支上。根據你的描述,我不能100%肯定 - 我需要知道具體的命令和配置設置 - 但我敢打賭,這意味着你誤認爲沒有其他人正在向你的分支承諾。

我提到這個是因爲你問git是否理論上可以做點什麼,因爲你的觀察說它可能正在發生......但是那些觀察不是自洽的,所以不能完全正確。

當分支沒有變化時可以發生合併嗎?

不符合您所描述的條件。 ...好的,你說的是「理論上的」,所以我會承認,如果你出於某種原因使用了代碼爲惡意的替代合併工具,我不能證明這是不可能的。但鑑於我的上述評論,我會說我不相信這是發生在這裏。

說你有

R -- x1 ... xN -- A <--(master) 
\ 
    o1 ... oN -- B <--(branch) 

,你想說的話的branch合併爲master。如果存在於文件foo一個衝突,則根據定義,這意味着

(A)有一個變化p1這是x1A之間施加foo某處,

(B)有一個變化p2這是o1B,和

之間施加 foo某處

(C)p1p2被視爲 「重疊」

現在可以有很多方法讓p2隱藏在圖表中的...後面。例如,也許有人創建branch2branch,做了一些更改,併合並branch2回到branch。但合併回branch仍然是「在那種情況下別人更改提交到branch(和合並的外觀承諾會當你要拉你可以推前的一個例子)。

那麼如何分辨什麼是真正發生了什麼?

如果git的報告發生衝突,你可以得到一些想法是什麼它通過查看衝突標記的想法。如果它只是一個你不記得了變化的事情,也許他們會看起來很熟悉?但聽起來這不是這種情況。

(以下命令假定合併仍是未完成的;如果合併以來,一直致力於,那麼你會使用類似master^..branch;點在部分..有指master提交合並之前之前。 )

所以,你可以看到提交過影響的文件(但不是master)的東西,如

git log master..branch -- path/to/conflicted/file 

如果不把它清除掉,另一步是將嘗試

git blame master..branch -- path/to/conflicted/file 

(如果需要,您可以包含-L選項以將衝突標記的branch一側上標識的線路清零;請參閱git blame文檔。)

這應該告訴你誰,何時以及在哪些提交中。

+0

感謝您的好評!它將需要一段時間來處理它。與此同時,我很樂意解決我觀察中缺乏一致性的問題,但我需要清楚這是什麼;如果是這樣的說法,儘管衝突除我之外沒有人承諾開發分支,但我必須證實這一點,這是我提出這個問題的主要原因,但是下次發生衝突時我會嘗試截取衝突的截圖和分支歷史顯示沒有人在那裏犯下;如果不一致的地方在其他地方,請將我指給他們。 – SantiBailors

+0

我還必須確認,儘管實際需要拉動以避免導致「拒絕,不快速前進」,但沒有人承諾過該分支;當我推送時,我經常會得到「拒絕」,所以我拉,然後再次推送,這次它成功了,而我推送的遠程分支只有我(和本地分支)提交,因爲問題),從創建開始。我也會在下次發生這種情況時嘗試使用屏幕截圖來記錄這一點。 – SantiBailors

+0

我對Git的有限理解在這裏肯定起着很大的作用; re _...然後別人在你修改並推送的分支上進行提交,是否包含除了包含我試圖推送的提交的當前簽出分支以外的分支?我仍然有理由相信,我有這個問題的所有分支,本地和遠程,只接收來自我的提交,但我從不驗證是否f.ex。雖然我有分支機構A檢出,我推動,但分支B仍然從我的本地回購已經unpushed提交(儘管,我總是點擊「提交和推送」),但不太可能。 – SantiBailors