在git操作中,我們經常會用到fetch, merge, pull和push等命令,以下是一些我們需要注意的地方。
給大家准備了參考資料:
1. Whatʼs a Fast Forward Merge?:https://sandofsky.com/images/fast_forward.pdf
2. Understanding the Git Workflow:https://sandofsky.com/blog/git-workflow.html
3. Understanding Git: Merging:http://www.sbf5.com/~cduan/technical/git/git-3.shtml
- $ git pull origin test
- // git pull合並代碼的時候,若發生沖突,會處於merging狀態,檢查代碼,發現自己的分支低於主分支,這個時候想撤銷merge
- // 撤銷merge
- $ git reset --hard HEAD (or sha_1)
git pull = git fetch + git merge
在git倉庫中運行命令:git remote -v
可以看到fetch和push命令可以分別對遠程分支進行fetch和push操作,而pull不是直接跟遠程分支對話的。
fetch同pull的區別在於:git fetch:是從遠程獲取最新版本到本地,不會自動merge 而git pull是從遠程獲取最新版本並merge到本地倉庫 從安全角度出發,git fetch比git pull更安全,因為我們可以先比較本地與遠程的區別后,選擇性的合並。 git push 默認推送到master,如果有多個分支,則多個分支一起推送到遠程
git merge
git merge其實有很多參數的哦,我們來看看merge有哪些參數可以供我們選擇:
git merge -n <branch> 不會在合並后顯示合並前后的不同狀態
git merge –stat <branch> 跟上面的參數相反,它會在合並結束后顯示合並前后的不同狀態
git merge -e <branch> 在合並之前會調用配置的編輯器,您可以自己編寫commit,否則的話commit的內容就是git自動生成的
git merge –no-commit <branch>相當於一次快進式合並,不會生成一次提交,如下圖所示:
git merge –stat <branch> 在合並后會顯示不同的狀態,如下圖紅色框中部分:
git merge –no-stat <branch> 合並后不會顯示不同的狀態,如下圖:
git merge –quiet <branch> 無聲的合並(不會輸出任何信息)
git merge –ff <branch> 當合並是快進式合並的時候,僅僅是更新了分支的指針,不會產生合並提交,這也是默認的合並行為
git merge –no-ff <branch> 及時是快進式合並,也會創建一個合並提交
git merge –ff-only <branch> 只允許快進式合並
快進式合並和非快進式合並
何為快進式合並??
如果當前的分支和另一個分支沒有內容上的差異,就是說當前分支的每一個提交(commit)都已經存在另一個分支里了,git 就會執行一個“快速向前”(fast forward)操作;git 不創建任何新的提交(commit),只是將當前分支指向合並進來的分支。
快進式和非快進式的區別:
目前倉庫的狀態是,master分支上有了5次提交,然后基於master創建分支test,並在test上進行3次提交,接下來,我在master分支上對test分支分別進行快進式和非快進式合並。
先進行快進式合並, git merge test (默認為–ff合並),如下圖所示,我們看到一共是5+3=8個提交,分支的提交歷史也沒有“開叉”,即沒有多個父提交節點。
隨后,我回到master的第五次提交,然后對test進行非快進式合並,git merge –no-ff test
這時候,同快進式合並不同的是,在c5處產生了“開叉”,然后新生成了一個commit “Merge branch 'test'”,即多了一個父提交。
現在,大家應該對這兩種合並有了一種直觀的了解了吧。
非快進式合並
非快進式合並會生成新的提交,並“開叉”,可以讓我們的提交歷史更加的清晰!
http://www.cnblogs.com/hutaoer/archive/2013/03/14/3078869.html