Git全解析之遠程倉庫交互

jopen 8年前發布 | 17K 次閱讀 Git 版本控制系統
文章目錄
  1. 1. Git全解析之遠程倉庫交互
    1. 1.1. 中央倉庫的概念
    2. 1.2. 本地分支與遠程分支
    3. 1.3. pull與fetch
    4. 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服務器工具:

  1. Gitolite
  2. GitLab

這兩個工具網上都有很多教程。

說明: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全解析之遠程倉庫交互/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!