http://blog.csdn.net/sidely/article/details/40143441php
原文: http://www.tech126.com/git-fetch-pull/ html
git fetch origin master
git log -p master..origin/master
git merge origin/masternginx
git fetch origin master:tmp (把遠程的master copy到本地的tmp)
git diff tmp (這裏是比較當前分支和tmp分支,會顯示全部不一樣之處,有時只想顯示文件列表,git diff branch1 branch2 --statgit
加上 --stat 是顯示文件列表, 不然是文件內容diff安全
git diff tmp 文件路徑 ,具體比較某個文件ruby
)
git merge tmp (把本地的和tmp分支合併)服務器
git checkout source_branch <paths>...
注意:在使用git checkout某文件到當前分支時,會將當前分支的對應文件強行覆蓋。ssh
若是不肯定新文件是否能徹底覆蓋master中的舊文件,能夠新建一個master分支mastertmp,將變化的文件checkout到mastertmp,而後讓master與mastertmp進行合併。ide
有個問題:工具
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分支。
git pull origin master
上述命令其實至關於git fetch 和 git mergegit pull的做用是,從遠程庫中獲取某個分支的更新,再與本地指定的分支進行自動merge。完整格式是:
好比,取回遠程庫中的develop分支,與本地的develop分支進行merge,要寫成:
若是是要與本地當前分支merge,則冒號後面的<本地分支名>可以不寫。
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
只要明白了上面的含義, 這個就很簡單了,
使用遠程branch1分支在本地建立branch2(但不會切換到該分支),
若是本地不存在branch2分支, 則會自動建立一個新的branch2分支,
若是本地存在branch2分支, 而且是`fast forward', 則自動合併兩個分支, 不然, 會阻止以上操做.
git fetch origin :branch2
等價於: git fetch origin master:branch2
用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)直接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的哪些節點都消失了。
二、放棄本地修改 的改法
git reset --hard git pull轉自:http://www.letuknowit.com/post/144.html