git pull和git merge區別&&Git沖突:commit your changes or stash them before you can merge. 解決辦法


http://blog.csdn.net/sidely/article/details/40143441

 

原文: http://www.tech126.com/git-fetch-pull/ 

Git中從遠程的分支獲取最新的版本到本地有這樣2個命令:
1. git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge

    
git fetch origin master
git log -p master..origin/master
git merge origin/master

    以上命令的含義:
   首先從遠程的origin的master主分支下載最新的版本到origin/master分支上
   然后比較本地的master分支和origin/master分支的差別
   最后進行合並
   上述過程其實可以用以下更清晰的方式來進行:

git fetch origin master:tmp (把遠程的master copy到本地的tmp
git diff tmp  (這里是比較當前分支和tmp分支,會顯示所有不同之處,有時只想顯示文件列表,
git diff branch1 branch2 --stat

 

  加上 --stat 是顯示文件列表, 否則是文件內容diff

git diff tmp 文件路徑 ,具體比較某個文件


git merge tmp (把本地的和tmp分支合並)

    從遠程獲取最新的版本到本地的tmp分支上
   之后再進行比較合並
 
 
 
git checkout source_branch <paths>...

但嚴格來說,這似乎不是合並,而是用另一分支"source_branch"的指定文件直接覆蓋當前分支的相應文件。

注意:在使用git checkout某文件到當前分支時,會將當前分支的對應文件強行覆蓋

如果不確定新文件是否能完全覆蓋master中的舊文件,可以新建一個master分支mastertmp,將變化的文件checkout到mastertmp,然后讓master與mastertmp進行合並。

 

有個問題:

root@i :/opt/nginx/html/  git fetch origin master:tmp
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 12 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
From ssh://bitbucket.org/ 
05eb1e3..c2cd20f master -> tmp
05eb1e3..c2cd20f master -> origin/master

為什么fetch到tmp分支上會跟新到master分支。

 


2. git pull:相當於是從遠程獲取最新版本並merge到本地

git pull origin master

上述命令其實相當於git fetch 和 git merge
在實際使用中,git fetch更安全一些
因為在merge前,我們可以查看更新情況,然后再決定是否合並
結束
 

git pull的作用是,從遠程庫中獲取某個分支的更新,再與本地指定的分支進行自動merge。完整格式是:

 

 
 
  1. $ git pull <遠程庫名> <遠程分支名>:<本地分支名>  

 

比如,取回遠程庫中的develop分支,與本地的develop分支進行merge,要寫成:

 

 
 
 在CODE上查看代碼片派生到我的代碼片
  1. git pull origin develop:develop  

 

如果是要與本地當前分支merge,則冒號后面的<本地分支名>可以不寫。

 

 
 在CODE上查看代碼片派生到我的代碼片
  1. git pull origin develop  
--

git命令之git fetch的用法

理解  fetch 的關鍵, 是理解  FETCH_HEAD.

這里需要解釋下什么是FETCH_HEAD??

FETCH_HEAD指的是某個branch在服務器上的最新狀態'.
每一個
執行過fetch操作的項目'都會存在一個FETCH_HEAD列表, 
這個列表保存在 .git/FETCH_HEAD 文件中, 其中每一行對應於遠程服務器的一個分支.
當前分支指向的FETCH_HEAD, 就是這個文件第一行對應的那個分支.

一般來說, 存在兩種情況:

  • 如果沒有顯式的指定遠程分支, 則遠程分支的master將作為默認的FETCH_HEAD.

  • 如果指定了遠程分支, 就將這個遠程分支作為FETCH_HEAD.

常見的git fetch 使用方式包含以下四種:

  • git fetch

這一步其實是執行了兩個關鍵操作:
創建並更新所有遠程分支的本地遠程分支.
- 設定當前分支的FETCH_HEAD遠程服務器的master分支 (上面說的第一種情況)

需要注意的是: 和push不同, fetch會自動獲取遠程`新加入'的分支.

  • git fetch origin

同上, 只不過手動指定了remote.

  • git fetch origin branch1

設定當前分支的 FETCH_HEAD' 為遠程服務器的branch1分支`.

注意: 在這種情況下, 不會在本地創建本地遠程分支, 這是因為:

這個操作是git pull origin branch1的第一步, 而對應的pull操作,並不會在本地創建新的branch.

一個附加效果是:

這個命令可以用來測試遠程主機的遠程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 拋出一個異常.

  • git fetch origin branch1:branch2

只要明白了上面的含義, 這個就很簡單了,

  • 首先執行上面的fetch操作
  • 使用遠程branch1分支在本地創建branch2(但不會切換到該分支), 
    如果本地不存在branch2分支, 則會自動創建一個新的branch2分支, 
    如果本地存在branch2分支, 並且是`fast forward', 則自動合並兩個分支, 否則, 會阻止以上操作.

  • git fetch origin :branch2

等價於: git fetch origin master:branch2

 (
https://ruby-china.org/topics/4768

而理解 fetch 的關鍵, 是理解 FETCH_HEAD.

這里需要解釋下什么是FETCH_HEAD??

FETCH_HEAD指的是: 某個branch在服務器上的最新狀態'. 每一個執行過fetch操作的項目'都會存在一個FETCH_HEAD列表, 這個列表保存在 .git/FETCH_HEAD 文件中, 其中每一行對應於遠程服務器的一個分支. 當前分支指向的FETCH_HEAD, 就是這個文件第一行對應的那個分支.

一般來說, 存在兩種情況:

  • 如果沒有顯式的指定遠程分支, 則遠程分支的master將作為默認的FETCH_HEAD.

  • 如果指定了遠程分支, 就將這個遠程分支作為FETCH_HEAD.

常見的git fetch 使用方式包含以下四種:

  • git fetch

這一步其實是執行了兩個關鍵操作:

  • 創建並更新所有遠程分支的本地遠程分支.
  • 設定當前分支的FETCH_HEAD遠程服務器的master分支 (上面說的第一種情況)

需要注意的是: 和push不同, fetch會自動獲取遠程`新加入'的分支.

  • git fetch origin

同上, 只不過手動指定了remote.

  • git fetch origin branch1

設定當前分支的 FETCH_HEAD' 為遠程服務器的branch1分支`.

注意: 在這種情況下, 不會在本地創建本地遠程分支, 這是因為:

這個操作是git pull origin branch1的第一步, 而對應的pull操作,並不會在本地創建新的branch.

一個附加效果是:

這個命令可以用來測試遠程主機的遠程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 拋出一個異常.

  • git fetch origin branch1:branch2

只要明白了上面的含義, 這個就很簡單了,

  • 首先執行上面的fetch操作
  • 使用遠程branch1分支在本地創建branch2(但不會切換到該分支), 如果本地不存在branch2分支, 則會自動創建一個新的branch2分支, 如果本地存在branch2分支, 並且是`fast forward', 則自動合並兩個分支, 否則, 會阻止以上操作.

  • git fetch origin :branch2

等價於: git fetch origin master:branch2

 git pull

只要理解了git fetch, git pull就太簡單了.

git pull 等價於以下兩步:

  • 經命令中的pull換成fetch, 執行之...
  • git merge FETCH_HEAD

唯一需要提及的一點是:

我認為pull操作, 不應該涉及三方合並 或 衍合 操作 換個說法: pull 應該總是 fast forward 的. 為了達到這樣一個效果, 在真正push操作之前, 我傾向於使用衍合, 在本地對代碼執行合並操作.

 

 

 

 

用git pull來更新代碼的時候,遇到了下面的問題:

error: Your local changes to the following files would be overwritten by merge:  
    xxx/xxx/xxx.php  
Please, commit your changes or stash them before you can merge.  
Aborting

出現這個問題的原因是其他人修改了xxx.php並提交到版本庫中去了,而你本地也修改了xxx.php,這時候你進行git pull操作就好出現沖突了,解決方法,在上面的提示中也說的很明確了。

1、保留本地的修改 的改法

1)直接commit本地的修改

2)通過git stash

git stash
git pull
git stash pop

通過git stash將工作區恢復到上次提交的內容,同時備份本地所做的修改,之后就可以正常git pull了,git pull完成后,執行git stash pop將之前本地做的修改應用到當前工作區。

git stash: 備份當前的工作區的內容,從最近的一次提交中讀取相關內容,讓工作區保證和上次提交的內容一致。同時,將當前的工作區內容保存到Git棧中。

git stash pop: 從Git棧中讀取最近一次保存的內容,恢復工作區的相關內容。由於可能存在多個Stash的內容,所以用棧來管理,pop會從最近的一個stash中讀取內容並恢復。

git stash list: 顯示Git棧內的所有備份,可以利用這個列表來決定從那個地方恢復。

git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了。

2、放棄本地修改 的改法

git reset --hard
git pull
轉自:http://www.letuknowit.com/post/144.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM