使用git show-ref命令查看所包含的引用
bluceshang@bluceshang:~/gittemp$ git show-ref
38074841cf56acdfef2f638ea686f1fd49f17d51 refs/heads/branch_1.0
a974d7c2df090893f474f7784637b1f84eeeac15 refs/heads/master
a974d7c2df090893f474f7784637b1f84eeeac15 refs/remotes/origin/master
e7564d5348cd1b482fcefa01b1d0716adad29458 refs/tags/hello_1.0
f65ebb922cabc0def4b3d5c8432472f40ac3b3aa refs/tags/old_practice
注:以refs/remotes/開頭的是遠程版本分支在本地的映射refs/heads/開頭的是分支refs/tags/形頭的是里程碑.
"快進式推送",就是要推送的版本庫的提交是建立在遠程版本庫相應檓的現有提交基礎上的,即遠程版本庫相應分支的最新提交是本地版本庫最新提交的祖先提交.
強制推送,參數-f. git push -f
git pull 命令包含了兩個動作:獲取遠程版本庫的最新提交,以及將獲取到的遠程版本庫提交與本地提交進行合併.
非快進式推送濫用會造成項目的空難,所以要禁用非快進式推送,在receice.denyNonFastForwards設置爲true.
git config receive.denyNonFastForwards true
git pull = git fetch + git merge;
合併操作:在大多數情況下,合併操作只須提供一個<commit>作爲參數,合併操作將<commit>對應的目錄樹和當前工作分支的目錄樹內容進行合併,合併後的提交以當前分支的提交作爲第一個父提交,以<commit>爲第二個父提交.合併操作還支持將多個<commit>代表的分支和當前的分支進行合併,過程類似.
默認情況下,合併後會自動提交,如果提供--no-commit選項,合併後的結果會放入暫存區,用戶可以對合並的結果進行檢查,更改,然後手動提交.
git自動合併:1.修改了不同的文件中內容,2.修改了同和個文件中不同地方的內容,3.一個用戶重命名了文件,而另一個用戶修改了文件中內容,在三種情況git默認合併都會解決.
git合併過得是通過.git目錄下
- 文件.git/MERGE_HEAD記錄所合併的提交ID
- 文件.git/MERGE_MSG記錄合併失敗的信息
- 文件.git/MERGE_MODE標識合併狀態.
bluceshang@bluceshang:~/gittemp$ git ls-files -s
100644 10236e 1 README
100644 10236e 2 README
100644 10236e 3 README
每一行分爲四個字段,前2個分別是文件的屬性和SHA1,第三個字段是暫存區編號,當合並衝突發生後,全用到0以上的暫存區編號.- 編號爲1的暫存區用於保存衝突文件修改之前的副本,即衝突雙方共同的祖先版本,可以用1<filename>訪問 git show :1:README
- 編號爲2的暫存區用於保存當前衝突文件在當前分支中修改的副本,可以用:2:<filename>訪問 git show :2:README
- 編號爲3的暫存區用於保存當前衝突文件在合併版本(分支)中修改的副本,可以用:3:<filename>訪問 git show :3:README
$cat README
User1 hacked
<<<<<<< HEAD
Hello,user2.
=======
Hello,user1.
>>>>>>> a12133212332123443212343221dewsw
User2 hacked.
User2 hacked again.
衝突有2種方法解決:1.手動解決.2用圖形解決git mergetool