git 入門教程之本地和遠程倉庫的本質

本地倉庫遠程倉庫在本質上沒有太大區別,只不過一個是本地電腦,一個是遠程電腦.git

遠程倉庫不必定非得是 github 那種專門的"中央服務器",甚至局域網的另一臺電腦也能夠充當"中央服務器"的角色,由於它存在的最初目的只是方便你們交換彼此的提交記錄而已!github

因此本地倉庫和遠程倉庫的基本行爲應該是一致的,約定俗成的規定是遠程倉庫通常不直接參與平常開發工做,主要做爲項目託管中心.緩存

某些自動化持續集成環境中也可能會直接操做遠程倉庫,這時遠程倉庫就真的和本地倉庫沒什麼區別了!

我的開發經常使用命令

我的開發看重的是效率,同時兼顧下版本控制的話算是是錦上添花,git 的本地倉庫是本地備份,而遠程倉庫則是網盤備份.服務器

git init : 初始化本地項目

將本地項目初始化 git 項目,直觀表現是在該項目同級目錄下多了 .git 隱藏目錄,其存儲着 git 版本庫相關信息.分佈式

此後當前項目便具有了本地管理的能力,能夠與 git 進行交互.

git clone : 克隆遠程項目

git init 同樣的做用,也是建立本地倉庫,只不過 git init 是直接將本地項目做爲本地倉庫,而git clone 是將遠程項目克隆到本地並做爲本地倉庫.fetch

因而可知, git clonegit init 多了一層遠程倉庫的概念.

git add : 添加文件

將工做區的提交記錄添加到暫存區,暫存區是工做區和版本庫交互的橋樑,暫存區積累到必定量的提交記錄時能夠批量提交到版本庫,這一點暫存區有點像緩存.spa

git commit : 提交文件

將暫存區的版本提交到版本庫,從而造成工做區->暫存區->版本庫的基本鏈路,本地工做區的版本控制流程大體如此.版本控制

git push : 推送文件

若是是使用 git clone 命令克隆的本地項目,當工做到必定程度時可能須要將這部分工做成果推送到遠程倉庫,這時候使用 git push 命令完成本地版本的推送流程.code

若是是使用 git init 命令初始化的本地項目,可能沒有遠程倉庫,天然也就不須要推送.若是後來建立了遠程倉庫,那麼你天然是想要將本地倉庫推送到遠程倉庫的,所以你須要準確告訴 git 你要推送到哪一個遠程倉庫.
使用 git remote add origin git@github.com:username/repos.git 命令添加遠程倉庫信息,這樣就創建了本地倉庫和遠程倉庫的關聯,之後就能夠正常推送到遠程倉庫了.開發

團隊開發經常使用命令

團隊開發注重的不只是我的效率還有團隊的總體進度,隨着企業級開發的日趨複雜化,再也不是一我的可以獨立完成的,更況且時間也不容許慢慢完成,大多數公司採用的是人力換時間的方式,團隊並行開發來縮短整個項目週期,這種複雜需求下正是 git 大展拳腳的好機會.

項目總體採用並行開發模式,拆解成不一樣的功能模塊,每一個人負責各自模塊,模塊之間相對獨立但也不排除存在交集的可能性.對於每個個體開發者來講,既須要版本控制又須要團隊交流.這時候分支的做用就凸顯出來了.

根據項目的業務特色將其拆解成不一樣的功能模塊,這些功能模塊分別表明不一樣的分支,而這些功能模塊又組成了完整的項目,這就是主幹和分支的關係.

初始時項目是一個總體,中間拆解成不一樣功能模塊,最後再合併成一個整---"分久必分合久必分".

git branch <branch> : 建立分支

每個獨立的功能模塊被定義成一個單獨分支,建立分支的過程實際上是拆解項目的過程,建立本地分支後就在分支上開發特有功能,再也不關心其餘功能分支.

git checkout <branch> : 切換分支

模塊拆解完成並建立了相應的分支後,須要切換到既定分支上才能開展本身的工做.

git merge <branch> : 合併分支

沒有絕對的獨立,項目再怎麼拆分也是總體的一部分,確定須要和其餘功能模塊發生關係,某些狀況下須要其餘分支的工做成果合併到本身的本地倉庫中,這樣才能完成一次小規模的組裝.

能夠預期的是,當這種組裝足夠多的時候,最終便會演變成項目的終極形態,造成一個總體.

git fetch : 抓取遠程分支

合併目標分支首先須要可以獲取到目標分支的提交記錄,既然每一個功能模塊都是不一樣的項目成員負責開發的,也就不在咱們電腦上,因此咱們先要將目標分支下載到咱們本地電腦,而後才能合併該分支到本地分支.

git pull : 拉取遠程分支

"先下載目標分支再合併到本地分支,從而小規模組成更復雜更強大的功能",每一次的組裝過程都須要兩步操做者顯然不符合懶人思惟啊,git pull 就是這兩步操做的簡化命令,先下載再合併就是這麼簡單!

本地和遠程倉庫的碰撞

不管是我的開發仍是團隊開發,咱們幾乎習慣慣站在主動方的角度來思考問題,有沒有想過當遠程倉庫接收到咱們的git pushgit pull 請求時,遠程倉庫發什麼了什麼改變,這種改變對本地倉庫又有什麼影響?

遠程倉庫(遠程電腦上的本地倉庫)只是衆多分佈式電腦上本地倉庫中的一員,說它特殊也很特殊,充當着"中央服務器"做用,其他人統一從這裏下載或推送;說它普通也很普通,和本地電腦上的本地倉庫沒有什麼不一樣,由於它隨時可被任意電腦上的本地倉庫所取代!

揭開遠程倉庫的神祕面紗後,如今咱們只須要將其視爲普通的本地倉庫同樣對待便可,然而咱們本地電腦上已經有了本地倉庫,故而須要將遠程倉庫作一下簡單標識區分(origin)稱之爲遠程分支.

  • 先說說 git push 命令作了什麼?

    1. 對於本地來講,git 將本地倉庫的指定分支推送到遠程倉庫的相應分支,同時更新了本地倉庫的遠程分支.
    2. 對於遠程來講,git 接收到本地倉庫的推送請求時應該在相應分支上合併本地分支,同時更新遠程倉庫的相應分支.

只要本地的指定分支成功推送到遠程的相應分支時,對於本地來講,不管是指定分支仍是遠程分支(origin/master)都應該是最新狀態,由於已經與服務器同步了.

而遠程接收到這次推送請求時,應該嘗試合併這次推送請求,再更新本身的相應分支,遠程合併完成後再通知本地這次推送結果,如此一來,三端同步,皆大歡喜!

git-local-remote-push.gif

  • 再講講 git pull 命令發生了什麼?

    1. 對於遠程來講,接收到本地的拉取請求時,由於沒有新版本須要處理,因此無需任何操做.
    2. 對於本地來講,當遠程倉庫的相應分支下載到本地時應該更新遠程分支狀態,再嘗試合併到本地的相應分支.
git pull 命令或者說是 git fetch 命令是本地和遠程通訊的方式,因此 origin/master 會自動更新!

git-local-remote-pull.gif

小結

本地倉庫和遠程倉庫本質上沒有太大區別, git fetch 是本地倉庫和遠程倉庫之間的通訊途徑,本地倉庫中的遠程分支(origin/master)保存着它們之間最後一次的通訊狀態.

相關文章
相關標籤/搜索