2013-01-09 70 views
0

我們剛剛從Subversion切換到Git。Git複製代碼

今天早上出現的問題是,我們選擇了一個分支到主的提交,所以maser會有一個錯誤修復。然後我們將主人合併到分支。

當我們嘗試編譯時,所有來自櫻桃選擇提交的添加都在代碼中兩次。

挑選的提交包括添加了幾行代碼,最終在代碼中兩次結束。幸運的是,它們是完整的函數,所以它拋出了一個編譯器錯誤。

從來沒有發生衝突。

我們如何避免這種情況。這是一個主要問題。

謝謝。

+1

你應該嘗試'git-flow'工作流。 (說明:http://nvie.com/posts/a-successful-git-branching-model/工具:https:// github。com/nvie/gitflow)在這種情況下,「正確」的方式會爲舊代碼中的錯誤(不是在特性分支上開發的錯誤)創建一個新的分支,並將其合併到主機和功能中分支 - 然後git可以正確跟蹤提交。 – millimoose

+0

@millimoose nvie工作流程似乎並不適用於所有情況。開發分支似乎不太適合持續交付。 – ArtB

+0

不幸的是,挑選櫻桃有時是唯一的答案。很多時候,我們會發現一個影響所有分支的bug,我們需要將修復放在所有分支中,但我們不希望來自任何分支的其他更改。這就是爲什麼櫻桃採摘首先存在。 –

回答

5

從Git的觀點來看,Cherry-pick是另一種提交方式。即當您合併時,您將合併回原始應用之上的新提交

也就是說,您使用散列ABC創建提交。你挑選它,創建一個新的提交DEF。然後合併回DEFABC

在上面,我可能會希望你簡單地對master進行提交(比如說),然後把它交給你的分支。

This blog post有更多信息。

請注意,它會在主分支上創建一個新的提交。如果在 master上運行「git log」,您將看到與提交相同的 消息的不同散列。爲什麼?

這是因爲Git如何模擬提交的內容。提交是整個存儲庫的完整快照,並且提交的哈希提供了反映整個目錄中每個文件的狀態 - 它是所有哈希的散列值的 。

所以很明顯,因爲主分支機構不具有所有提交的從 的特性分支,它的一個完整快照在修正錯誤 應用將產生不同的哈希比 的功能進行完整的快照時間當時在那裏應用了bugfix。因此, 不同的哈希值。

但是,當你做合併功能分支到主,這不會 問題;你修補程序 的單個文件的散列值將是相同的,因爲它們的內容將是相同的,所以 將不會在該文件的主文件上更新。

This blog post詳細描述了類似的情況以及如何使用git rebase來避免此類問題。

+0

我原以爲Git會意識到提交的內容是相同的,不會重複。這可能是個不錯的選擇。 –

+0

查看上面的博文和我突出顯示的摘錄。 –

+0

問題不在於有兩個提交具有相同的更改。我們已經習慣了來自Subversion的。問題是,當我們合併回來時,Git應用相同的更改兩次,以便在源文件中有兩次相同的代碼行。 –