2015年6月13日 星期六

Warning when Resolving Conflicts in Git

因為在公司出過兩次包了,覺得自己實在太智障了,為了嚴逞自己的錯誤,所以來這邊紀錄一下,希望有看到的人不要再跟我一樣。
基本上處裡Conflict的過程可以看到"連猴子都能懂的Git入門指南"的這兩篇 合併修改紀錄解決衝突
簡單說明一下情境:

  1. 大概有一段時間沒有跟遠端伺服器做合併的動作,只有Commit自己修改的東西到Local Reposity。
  2. 突然某天想Pull和Push跟遠端伺服器同步一下,結果發現有衝突了,基本上應該是Local Reposity和遠端伺服器上的Reposity兩邊有修改到相同的檔案,Git不知道該怎麼自動把遠端伺服器上的紀錄合併到自己的Local Reposity?
  3. 這時就得自己手動合併,重點來了,手動合併老實說是相當危險的事。然後注意這時在處理衝突的動作,都是在Working Copy的動作。衝突Resolve後,必須再Commit到Local Reposity上,最後再Push到遠端伺服器。
    注意:這時要解決衝突,一定會打開修改過檔案的列表視窗(TortoiseGit叫Check for modification),這時會發現莫名一堆檔案是被修改過的,而且不是自己改的。這些就是你當前Local Reposity和遠端伺服器上的Reposity的差異檔案,
    千萬不要把他們Revert!!千萬不要把他們Revert!!千萬不要把他們Revert~~~~
    我因為有潔癖,覺得Git怎麼會亂改我Working Copy的東西,覺得很不爽的全都Revert了之後,Commit加Push。隔天就出現哀嚎聲……
    照理說這些差異檔案,一般沒出現衝突的話,其實Git會自動幫你合併並Commit到你的Local reposity,如果Pull完後再看Git Log的話,就會發現一個Commit的log紀錄。所以如果當出現衝突後,Git無法知道怎麼合併,自然就只能把遠端檔案修改到Working Copy之後,由使用者自己決定哪些資料要合併,並且由使用者自己Commit合併之後的差異檔案到Local Reposity。
    如果在這時你把合併的資料Revert或亂搞,Commit並Push,因為你做了合併的動作,所以Git認為你的資料才是最新的,所以當你Push到遠端伺服器後,遠端伺服器的Reposity自然就會以你的更動為主,所以自然而然的遠端伺服器的資料也跟著被Revert或亂搞了。
  4. 最後結論就是,建議Pull之前先備份Working Copy內修改過的檔案,可以做Stash或者自己手動備份,不然Pull合併後看哪些要Commit就很麻煩,然後只處裡衝突的檔案就好,不要傻傻亂動其他人的東西…………

以上就是我搞爆公司Git的經歷與心得,希望有機會幫到看到這篇的人T_T

沒有留言:

張貼留言