Git全解析之遠程倉庫交互

- 1. Git全解析之遠程倉庫交互
- 1.1. 中央倉庫的概念
- 1.2. 本地分支與遠程分支
- 1.3. pull與fetch
- 1.4. 關于捐贈
Git全解析之遠程倉庫交互
中央倉庫的概念
雖然說git是分布式版本控制工具,但同樣有遠程倉庫的概念。出于各種目的,我們有時需要有一個共享的遠程倉庫,如GitHub上的倉庫,我們公司項目中用來測試和部署的倉庫等。一般的操作步驟是先在公共服務器上創建一個倉庫,然后每個開發人員都clone這個倉庫進行各自的開發,開發完成后再push到遠程倉庫進行測試部署。
從遠程倉庫clone項目:
[centos@bogon gitwork]$ [centos@bogon gitwork]$ git clone git@github.com:wustrive2008/gittest.git Initialized empty Git repository in /home/centos/gitwork/gittest/.git/ remote: Counting objects: 4, done. remote: Compressing objects: 100% (3/3), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (4/4), 4.15 KiB, done.
</div>
上面示例的遠程倉庫在github上,當然如果我們做的是公司的項目,出于安全性和訪問效率的考慮很少會將公司的私有項目放到github上。一般的做法是搭建自己的git服務器,這里推薦兩種git服務器工具:
這兩個工具網上都有很多教程。
說明:github也有付費的企業版,試用過,也很好用
本地分支與遠程分支
平時我們使用 git branch 查看的都是本地分支,如:
[centos@bogon gittest]$ git branch * master
</div>
但是當需要經常與中央倉庫同步代碼時,特別是分支很多時,需要查看本地當前有哪些遠程分支的引用,比便于在不同的分支之間進行切換開發。關于git分支的較好實踐可以參考: git flow
查看遠程分支的引用
[centos@bogon gittest]$ [centos@bogon gittest]$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master
</div>
上面的結果表示:
當前本地有一個master分支,并且有一個remotes/origin/master(遠程master)分支的引用,至于remotes/origin/HEAD分支可以理解為origin/master分支的一個引用。
其中origin為遠程倉庫引用的別名,此名稱可以修改,也可以有多個,可以參考git remote命令了解更多
接下來在本地創建一個develop分支,用于正常的開發流程:
[centos@bogon gittest]$ git checkout -b develop Switched to a new branch 'develop' [centos@bogon gittest]$ git br * develop master [centos@bogon gittest]$ git br -a * develop master remotes/origin/HEAD -> origin/master remotes/origin/master
</div>
在develop分支上進行開發,并提交:
[centos@bogon gittest]$ touch file1.txt [centos@bogon gittest]$ git add . [centos@bogon gittest]$ git commit -am "create file file1.txt" [develop 21053d7] create file file1.txt 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 file1.txt
</div>
開發完成后將develop分支推送到服務器:
[centos@bogon gittest]$ git push origin Counting objects: 4, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 311 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To git@github.com:wustrive2008/gittest.git 8a9a114..21053d7 develop -> develop
</div>
接下來正常的流程是測試人員拉取到遠程的develop分支,然后對develop分支上提交的內容進行測試,測試通過后,合并到master分支,最后推送到部署服務器進行上線部署。
[centos@bogon gittest]$ git checkout master Switched to branch 'master' [centos@bogon gittest]$ git merge develop Updating 8a9a114..21053d7 Fast-forward 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 file1.txt [centos@bogon gittest]$ git push origin master Total 0 (delta 0), reused 0 (delta 0) To git@github.com:wustrive2008/gittest.git 8a9a114..21053d7 master -> master
</div>
pull與fetch
如果要拉取遠程倉庫的代碼,需要用到pull與fetch命令這兩個命令的區別是pull=fetch+merge
先來演示一下git pull,有其他開發者已經在develop分支上提交了新的內容,現在需要同步到本地
[centos@bogon gittest]$ git br * develop master [centos@bogon gittest]$ git log commit 21053d768d7af0c5cf90f63dc105891726094b43 Author: wubaoguo <wustrive_2008@126.com> Date: Mon Jan 11 22:35:50 2016 +0800 create file file1.txt commit 8a9a114ecbacfd5555ee417ab1dbe02a20db9a03 Author: wubaoguo <wustrive2008@users.noreply.github.com> Date: Mon Jan 11 22:08:39 2016 +0800 Initial commit [centos@bogon gittest]$ git pull origin develop remote: Counting objects: 2, done. remote: Compressing objects: 100% (2/2), done. remote: Total 2 (delta 1), reused 1 (delta 0), pack-reused 0 Unpacking objects: 100% (2/2), done. From github.com:wustrive2008/gittest * branch develop -> FETCH_HEAD Updating 21053d7..2296978 Fast-forward 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 file2.txt [centos@bogon gittest]$ git log commit 22969782f467cd04410c9ed3cf5c80e3987d212b Author: wubaoguo <wustrive_2008@126.com> Date: Mon Jan 11 22:52:18 2016 +0800 create file file2.txt commit 21053d768d7af0c5cf90f63dc105891726094b43 Author: wubaoguo <wustrive_2008@126.com> Date: Mon Jan 11 22:35:50 2016 +0800 create file file1.txt commit 8a9a114ecbacfd5555ee417ab1dbe02a20db9a03 Author: wubaoguo <wustrive2008@users.noreply.github.com> Date: Mon Jan 11 22:08:39 2016 +0800 Initial commit
</div>
很清楚的看到,新的代碼已經拉取并合并到本地了,可以基于最新的代碼進行開發了。
如果開發者B說他向遠程倉庫推送了新的分支fixbug,需要你在此基礎上繼續修改bug,可以這樣做
[centos@bogon gittest]$ git br -a #可以看到這時本地并沒有新的分支與引用 * develop master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master [centos@bogon gittest]$ git fetch #拉取遠程所有的變動 remote: Counting objects: 3, done. remote: Compressing objects: 100% (1/1), done. remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:wustrive2008/gittest 21053d7..2296978 develop -> origin/develop * [new branch] fixbug -> origin/fixbug #注意這里拉取到一個新分支 [centos@bogon gittest]$ git br #這時本地并沒有fixbug分支 * develop master [centos@bogon gittest]$ git checkout fixbug #創建并切換到fixbug分支,引用origin/fixbug分支 Branch fixbug set up to track remote branch fixbug from origin. Switched to a new branch 'fixbug'
</div>
與遠程倉庫的交互操作基本就這些,還有一點要注意,推送之前最好先拉取一下,因為如果遠程分支版本比本地新,直接推送會失敗。
關于捐贈
如何覺得本文章對你有幫助,歡迎通過支付寶捐贈來支持博主
來自: http://wustrive2008.github.io/2016/01/11/版本控制/Git全解析之遠程倉庫交互/