2009-05-02 131 views
44

一位同事和我現在都在主分支上工作。我在我的工作樹中有一些我不想提交的代碼(調試語句等)。現在,如果他提交更改一些這些相同的文件,我無法將它們合併:如何讓git合併處理我的工作樹的未提交更改?

$ git merge origin/master 
Updating 1b8c5c6..eb44c23 
error: Entry 'blah.java' not uptodate. Cannot merge. 

從顛覆背景的,我已經習慣了有我的工作樹自動合併時,我拉從庫中的變化如果有衝突,我會手動解決它們。

我發現這樣做在Git中的最快方法是:

$ git stash 
$ git merge origin/master 
$ git stash pop 

從本質上講,我消除了未提交的修改,執行合併,然後再應用更改。我怎麼能告訴合併自動合併我的工作樹與我試圖拉入的變化?

+3

如果你有合併衝突怎麼辦?如果您將在髒文件(您修改的文件)中合併衝突,會怎麼樣? 另請參閱Junio C Hamano(git維護者)博客中的「保持本地變化的樂趣」:http://gitster.livejournal.com/29060.html – 2009-05-02 18:01:39

+0

感謝您的鏈接。儘管如此,絕大多數時候,我希望沒有任何衝突或者很小的,我不介意用手工修復。無論如何,如果我犯了我的骯髒文件,我會面臨相同的衝突風險,除非我必須承擔之後不承擔責任的麻煩。 – 2009-05-02 18:28:11

+0

相關問題:http://stackoverflow.com/questions/18529206/when-do-i-need-to-do-git-pull-before-or-after-git-add-git-commit – leo9r 2016-04-11 23:07:43

回答

18

據我所知,你所能做的最好的就是你已經擁有的git stash。我也感到奇怪的是,合併只想處理乾淨的樹木。

36

忘掉你從顛覆中學到的一切。

在引入外部更改之前始終提交。

想象一下,你有一個大多數工作樹 - 可能不完美,但你正在取得一些進展。然後,你去做一個合併,你帶來的代碼只是造成了破壞(本身就是越野車,需要處理太多衝突等等)。如果你能解決這個問題,不是很好嗎?

如果你犯了,你可以。如果你不這樣做,你就會受苦。

請記住:你承諾的不是是你推動的,但你不承諾的東西很容易失去。

只是做安全和容易的事情,提前做出承諾並經常做。

2

您不能告訴git merge合併對本地存儲庫發生更改的文件所做的更改。這樣可以防止合併過程中出現嚴重錯誤時的變更。

使用CVS和SVN方法進行合併,如果在更新之前沒有手動複製文件,並且在合併時對它們進行了加擾,則必須手動重新編輯才能恢復到良好狀態。

如果您在進行合併之前提交更改或隱藏它們,則所有內容都是可逆的。如果合併不順利,您可以嘗試多種方式使其合併,並使用效果最好的方法。

如果您確實提交了實驗性或調試性更改,您可以使用git rebase在您通過git merge獲得提交後移動它們,以便更容易擺脫它們或避免意外將它們推送到存儲庫。

請注意,在推送到共享存儲庫的分支上使用git rebase會導致從該存儲庫中提取的所有人都感到悲傷。

在這些情況下,我更喜歡使用git stash,但是如果合併更改了我已編輯但未提交的文件,我只會使用它。