图解远程版本库开发周期 —— Git 学习笔记 22
圖解遠程版本庫開發周期
文章目錄
- 圖解遠程版本庫開發周期
- 克隆版本庫
- 快進推送
- 非快進推送
- fetch 命令
- merge 命令
- push 命令
- 參考資料
克隆版本庫
假設服務器上有一個簡單的版本庫:
最近的 2 次提交用 A 和 B 表示。
這時候,你把這個版本庫克隆到了本地:
克隆之后,我們看看這個克隆到本地的版本庫都有些什么:
- 原始版本庫中的所有提交都復制到克隆版本庫。
- 克隆版本庫中有一個名為 origin/master的遠程追蹤分支( remote-tracking branch)。
- 在克隆版本庫中, origin/master分支指向原始版本庫中 master 指向的提交,也就是 B。
- 克隆版本庫中創建了一個新的本地追蹤分支( local-tracking branch),稱為 master 分支。這個 master 分支指向 origin/master指向的提交,也就是 B。
克隆后,Git 會選擇新的 master 分支作為當前分支,并自動檢出它。因此,除非切換分支,否則克隆后所做的任何修改都會影響 master 分支。
在圖中,原始版本庫和派生的克隆版本庫中的開發分支都由深灰色作為背景色,而遠程追蹤分支則用淺灰色作為背景色。在 Git 的實現中,深灰色背景的分支屬于 refs/heads/ 命名空間,淺灰色背景的分支屬于 refs/remotes/命名空間。
請注意,本地追蹤分支和遠程追蹤分支都是私有的,并只存在于各自的版本庫中。
快進推送
在本地的 master分支工作的時候,本地的 master 會向前移動,而 origin/master 是不可以移動的。正如下圖所示,你的開發使 master 分支變長了:在提交 B 的基礎上多出 2 個新的提交 —— X 和 Y。
在你開發期間,如果原始版本庫沒有任何變化,那么你可以很容易地把 X 和 Y 推送到上游:Git 會把你的提交傳輸到版本庫,并把它們添加到 B 的后邊,然后 Git 會對 master 分支執行一種特殊的合并操作 —— 快進(fast-forward),快進本質上是一個簡單的線性歷史記錄推進操作。如下圖所示:
非快進推送
但是,在你開發期間,任何其他有權訪問原始版本庫的開發人員可能已經做了進一步開發,并把他的修改推送到該版本庫。如下圖:
在這種情況下,我們說版本庫的歷史記錄在提交 B 處分叉(diverged 或 forked)了。當你嘗試推送,Git 會拒絕并用一條錯誤消息告訴你有關的沖突,例如:
$ git pushTo /tmp/Depot/public_html! [rejected] master -> master (non-fast forward)error: failed to push some refs to '/tmp/Depot/public_html'那么,什么是你真正想要做的?你是想覆蓋其他人員的開發工作,還是想要合并兩組歷史記錄?
提示
如果你想覆蓋所有其他變化,也是可以的。只要在你的 git push 中使用 -f選項即可。不過我建議你不要這么做。
fetch 命令
更多的時候,你不想覆蓋別人的提交,只是想添加你自己的修改。在這種情況下,你必須在推送之前在你的版本庫中合并兩組歷史記錄。這時候,就該 fetch 命令大顯身手了。
要讓 Git 合并兩組歷史記錄,那么這兩組歷史記錄必須存在于同一個版本庫的兩個不同分支上。現在你的提交 X 和 Y 本身就在你的版本庫里,為了把 Origin 中的提交 C 和 D 納入你的版本庫,你可以用 git fetch命令進行抓取。這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。
注意,引入 C 和 D 這組歷史記錄并不能改變由 X 和 Y 代表的歷史記錄。所以,你沒有必要擔心 fetch 之后會覆蓋你的工作成果。fetch 之后,這兩組歷史記錄同時存在于你的版本庫中,形成一幅比較復雜的圖,簡單來說就是在 B 處分叉了。你的歷史記錄由 master 分支代表,遠程歷史記錄則由 origin/master 遠程追蹤分支代表。
merge 命令
既然這兩組歷史記錄已經存在于一個版本庫中了,那就整合它們吧。
提示
你不能把 master 分支合并到 origin/master 分支,因為 origin/master 是遠程引用,遠程引用是只讀的。 雖然可以 git checkout 到某個遠程引用,但是 Git 并不會將 HEAD 引用指向該遠程引用。因此,你永遠不能通過 commit 命令來更新遠程引用。Git 將這些遠程引用作為記錄遠程服務器上各分支最后已知位置狀態的書簽來管理。
所以,我們要做的就是把 origin/master 分支合并到 master 分支。
git merge origin/master假設合并過程很順利,沒有任何沖突,現在,你的版本庫已經包含了 origin 版本庫和你的版本庫中的最新變更。但是反過來是不成立的:origin 版本庫里依然沒有你的變更。
push 命令
為了讓其他人員共享你的變更,你可以用 git push 命令把合并后的歷史記錄從你的master 分支上推送回 origin 版本庫。推送后如下圖所示:
最后,你可以看到 origin 版本庫已經更新了你的開發,你的版本庫和 origin 版本庫已經完全更新并再次同步了。
【End】
參考資料
《Git 版本控制管理(第2版)(人民郵電出版社)》
總結
以上是生活随笔為你收集整理的图解远程版本库开发周期 —— Git 学习笔记 22的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html tab切换jquery,jQu
- 下一篇: fetch 与引用规格(refspec)