1. 程式人生 > >git檔案衝突合併的幾種情況

git檔案衝突合併的幾種情況

本文描述了git衝突的幾種常見情況和解決方案,老鳥請直接忽略本文。
假設衝突檔案是 test/TestCase.php

  下面分5種情況討論。

1、本地不變。
  然後遠端別人有更新。
  git pull
  這種最簡單,沒有衝突,本地工作區直接更新
 
2、我本地修改,但是不add。
然後遠端別人有更新,此時 :    
git pull,
git會告訴你:
error: Your local changes to the following files would be overwritten by merge:
        tests/TestCase.php
  此時,我 
   git checkout -- tests/TestCase.php
  千萬注意,上條命令會導致你自己的修改丟失了!!
  然後git pull.成功。
  這種情況下,你自己的修改完全丟失。本地接受了遠端的修改。
 
3、我本地修改,但是已經add了。
  然後別人遠端更新,
  git pull
  這種情況,和上面幾乎一樣。
  git reset HEAD test/TestCase.php 
  上面這條命令可以理解為add命令的逆命令。即,取消add操作。
 
  然後繼續
  git checkout -- tests/TestCase.php
  千萬注意,上條命令會導致你自己的修改丟失了!!
  然後git pull.成功。
  這種情況下,你自己的修改完全丟失。 本地接受了遠端的修改。

   
4、我本地修改,add 且 commit了
  然後別人遠端更新,
  git pull
  注意:這種情況和第2,第3種情況不同。git會認為你的commit也很重要。同等重要。
突然發現,自動進入vi介面。
Merge branch 'master' of https://github.com/xxxx
這什麼意思呢?就是git會主動再幫你新增一個commit。
先讓你寫點註釋,並且它已經幫你寫了幾句話
那自己寫點東西,然後儲存退出vi
請注意,這個commit是在本地的,還沒有發到遠端。
這個commit會自動合併 你新增到程式碼,和 別人遠端更新的程式碼,
所以,之後請自己檢查一下這個程式碼有無問題。

  如果都沒有問題,則你現在
  git push
  這個命令可以把你的本地改動推送到遠端。
  push之後,遠端得到你和他人的所有更新。push之前,僅本地得到你和他人的所有更新。
 
5、使用分支功能。
  git的分支功能很強大,應該多使用。
  上面幾種情況都沒有使用分支。使用分支會更好。
  首先,我本地新建並切換分支branch_1,自己起有意義名字,並修改檔案。
  git checkout -b branch_1
   
  vi test/TestCase.php
  git add tests/TestCase.php
  git commit -m "change test"
 
  現在,別人已經更新了遠端主分支程式碼(沒更新就極其方便了,也不必說了,快速更新)
  我想把分支合併到主分支。
  我應該,先回到主分支,並更新。
  git  checkout master
  git pull
 
  然後,在本地,把我的修改分支合併上去。
  git merge branch_1
  自動進入vi介面,讓你寫註釋。
 
  然後會合並好。
  類似提示:
  tests/TestCase.php | 3 ++-
  上面,兩個加號表示檔案增加了兩行,一個減號表示檔案減少了一行。
 
  此時,注意,凡是進入vi介面後,
  最好自己再檢查一下程式,檢查那些被提示修改過的檔案,(這是一個好習慣,但我從來不遵守)
  如果認為正確,最後,
  git push,推送到遠端。
 
  push之後,遠端得到你和他人的所有更新。push之前,僅本地得到你和他人的所有更新。

==========
總結,大部分情況下,都推薦使用第5種,使用分支的方法,來管理檔案修改衝突。