文檔 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF 學習筆記,並以gitee.com爲例實踐。
git clone
在gitee.com上創建一個新倉庫A,勾選創建readme文件。
那麼 倉庫A 創建之後默認會有一個名爲master的分支。
在本地執行 git clone 之後,本地的分支情況如下:
創建一個名爲origin的本地倉庫,拉取遠程倉庫A的所有數據及提交。
分別創建一個名爲orign/master 和另一個名爲 master 的分支,和遠程倉庫A的master分支指向同一個提交。
關於master和 origin/master的區別,及origin的說明可以見上面文檔鏈接:
git push
當前所在分支爲master分支,嘗試在本地創建一個新提交。這樣本地的master比遠程倉庫的master分支多了一個提交。
將本地master的提交推到遠程master分支的操作:
git push origin master
git push 說明
根據以上描述,git push origin master 實際上等價於 git push origin master:master
假如在本地創建了一個 a_branch分支(遠程沒有),那麼使用 git push origin a_branch 這個命令,那麼遠程倉庫會創建一個新分支,同樣的本地也會創建 origin/a_branch 分支。
git fetch
現在假如兩個人協同作業,兩個都clone了遠程倉庫,並在master分支上進行開發。
USERA 做了一個提交,git push origin master 成功。
假設USERB 這個時候不知道 USERA做了提交,USERB 也做了一個新提交,當userb執行 git push origin master的時候,會出錯:
截圖中的 hint 簡單翻譯如下:更新被拒絕了,這是因爲遠程倉庫裏有你本地沒有的work。這通常是由其它倉庫push到了相同的ref。你 may want to integrate遠程的改變,然後再嘗試做 push。
然後錯誤信息裏有 fetch first 和 git pull。
git fetch
執行 git fetch 之後,用gitg工具,可以看到本地的master分支和 origin/master 已經指向不同的提交。
origin/master指向的是userA最後的提交。而master是userb 最後的在本地提交。
再來嘗試一下 git pull
git pull
git pull 之後會提交你生成一個meger的提交:
git pull 之後的結果是:
git pull --rebase
不產生 mege提交,具體可以瞭解 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA