2014-03-13 107 views
2

我們是一羣開發人員,他們從SVN切換到Git,認爲它會更簡單,更標準。不幸的是,直到現在我們只遇到了失敗和問題。Git合併不便

我們不需要功能分支。我們有一個名爲「開發」的分支,所有開發人員都共享。

我們習慣了TortoiseSVN,所以我們決定和TortoiseGit一起爲UI做準備。

提交和推送很好。拉操作出現問題。 SVN很棒,即使在本地更改下載了新版本,自動合併了可能的內容並要求解決衝突的文件。在Git下,如果你使用相同的文件進行本地修改,那麼就停在那裏(即使它可以自動合併)。你有兩個選擇,要麼提交你本地的修改(即使你的工作已經完成了一半),這些修改會污染「顯示日誌」窗口,其中包含大量無用的提交,或者存儲,拉取,彈出存儲,這些操作與SVN所做的操作類似一些無用的步驟。有更好的方法嗎?

隱藏彈出操作嘗試自動合併(很好),但在真正的衝突事情變壞。在SVN下很容易,你有一個新的文件,另一邊的本地文件在差異視圖的另一邊,只是固定你的本地並保存它並標記爲解決。在Git下,你有四個文件,「正常」文件,BASE文件,REMOTE文件和LOCAL文件。一個完全混淆的事情是,「遠程」文件(他們的)實際上是包含你所做更改的隱藏文件,所以它不能幫助清晰。

因此,您選擇打開合併工具的「編輯衝突」菜單選項。 TortoiseGitMerge界面不太友好,KDiff3在網上被廣泛使用,所以我們決定使用它。所以你按合併按鈕創建一個「合併」選項卡,並在衝突線上,你可以按A,B,C按鈕。到現在爲止,沒關係。問題是,當你保存這個結果文件時,它會保存在file.cs.LOCAL.cs下(而不是file.cs?)。然後,在TortoiseGit下,無論您選擇「已解決」,「解決使用我的問題」或「使用他們的解決方案」,它只是刪除您的合併文件,併爲您提供最終文件的錯誤版本(未完成合並工作)。我們設法得到它的唯一方法是對合並文件進行臨時備份,標記爲已解決並重新備份備份。我勒個去?在我們的工作流程中,我們做錯了什麼?

+0

聽起來像你使用Git太像SVN而不是Git,並沒有利用Git在本地提交更改並在與其他開發人員共享這些更改之前重寫本地歷史記錄的能力。另外,你能不能分開你的最後一段,這太大了,不容易消化。 – 2014-03-13 19:00:51

+0

除非使用'pull --rebase'(即在遠程更改之前添加我的更改),否則在執行(本地)更改時拉(在新的遠程更改中)是沒有意義的。每個開發者*可以*擁有儘可能多的本地分支,並且只將它們合併到主要的分支中進行發佈。也許尋找有效使用git的工作流的建議,就像[atlassian](https://www.atlassian.com/git/workflows)中的那些建議一樣。 – vonbrand

+0

感謝紙杯蛋糕的回覆。你正在談論推動之前多次提交?我們可以做到這一點,並且工作得很好(即使我想不出爲什麼我會這麼做)。正如我所提到的,問題出在Pull上。按照建議拆分我的最後一段。 vonbrad:rebase看起來很有趣,除了邏輯上你會想在本地增加遠程更改,而不是相反。你爲什麼說這不合乎邏輯?我正在開發一項功能,其他人正在更新應用程序的其餘部分,我希望在處理我的功能時看到其更改處於活動狀態。 – Dunge

回答

2

我會嘗試給出一些指針和提示。首先我會說這個。如果你只是需要svn-features,那麼去git是沒有意義的。在這些情況下svn很好。 git可以做很多更強大的事情,但你必須做到這一點,任何其他方式最好是麻煩的。

這就是說。如果你的長期目標是充分採用git思維,那麼它可能有助於「只是這樣做」,就像svn一段時間,並逐漸改變你的想法。

當你做一個git pull它實際上做的兩件事情

git fetch 
git merge 

git fetch 
git rebase 

這取決於配置設置或選項--rebase之一。在當地的一家分店(甚至是當地的主人),我更喜歡做基調,但是當涉及到衝突時,「他們」和「我的」是非常混亂的,但是這裏發生了什麼。

  1. git會先退你的工作副本和HEAD回到您的本地分支,起源分支分歧
  2. 然後應用所有提交的從源頭。
  3. git然後會嘗試重新應用您的提交一個接一個。如果現在發生衝突,它會打電話給你的變更,然後再重新申請「他們的」,這是正確的,但很混亂。想想「我的」就是已經在工作副本中的東西,「他們的」就是將要添加的東西,而且更有意義。

當你做一個合併,而不是一個rebase那麼這是另一種方式。您的更改已經在工作副本「我的」中,並且正在合併的更改是「他們的」。不幸的是很混亂。

我從來沒有使用kdiff3或TortoiseGIT,所以我不能幫助那裏,但我會說這個,如果你使用命令行工具發生衝突,原始名稱的文件將充滿衝突標記,就像svn一樣。使用任何工具,你舒服來解決衝突,然後

​​

git add <conflict file> 
git commit 

取決於如果你變基或合併來解決衝突,繼續前進。

+0

這很有幫助。 Rebase看起來像典型的解決方案,因爲它不會通過大量無用的「合併」提交來污染文件日誌。我發現要在.gitconfig中添加配置行。但是我當然不能要求所有的開發者使用控制檯命令,所以我希望TortoiseGit可以。現在,它仍然沒有解釋爲什麼合併工具不能如預期的那樣工作。 – Dunge

+0

是的TortoiseGit拉命令似乎忽略配置(使用它自己的參數)和Rebase菜單選項要求在進入之前隱藏我的更改..所以我仍然混淆了。 – Dunge