閱讀165 返回首頁    go 技術社區[雲棲]


關於git中分支的困惑

先說下我對git倉庫結構的理解,就以我是一個git用戶而言,
倉庫分為:
遠程倉庫(blasd(remote) repository)和本地倉庫(local repository)
本地倉庫有分為:
工作區(workspace),中間狀態(staged),本地倉庫(local repository)
中間狀態介於工作區和本地倉庫的中間狀態,比如,在工作區增加了一個test.txt文件,已經add了,
但是還沒有commit的狀態。
現在大家可能還沒有看到到底解決的是什麼困惑,大家一步步跟著來吧。
1. clone 代碼代碼到本地
地址是一個測試遠程倉庫:https://github.com/com360/android-app.git
輸入以下命令:

1
 $git clone https://github.com/com360/android-app.git

在clone完之後,git會自動為你將此遠程倉庫命名為origin,origin隻是為遠程倉庫起的一個別名,運行git remote –v 可以查看origin的含義;並且git會建立一個指向遠程倉庫origin的master 分支的標識,git使用
(遠程倉庫名)/(分支名) 這樣的形式表示遠程分支,所以origin/master指向的是一個我們clone到本地的遠程分支,被代表為遠程創倉庫和分支。
同時,git會建立一個本地master分支,它指向的是從遠程倉庫的分支下載到本地的副本。

2.查看分支有哪些
輸入如下命令:

1
2
3
4
5
6
$ git branch -a
* master
  remotes/eoecn/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
su@SUCHANGLI /e/eoe_client/android-app (master)

git branch -a 用於查看所有的分支。
*master就是你本地的分支
remotes/eoecn/master和remotes/origin/master是遠程分支
是和eoecn/master,origin/master相同的意思
可以隻看遠程倉庫的分支

1
2
3
4
5
$ git branch -r
  eoecn/master
  origin/HEAD -> origin/master
  origin/master
su@SUCHANGLI /e/eoe_client/android-app (master)

3.比較分支的不同

1
$ git diff origin/master master

上麵的命令就是比較遠程的分支和本地分支的不同
為了驗證remotes/origin/master和origin/master指向是相同的可以使用上麵的命令

1
$ git diff origin/master remotes/origin/master
  1. 提交更新到遠程倉庫 如下命令:
1
$ git push origin master

其中origin指定了你要push到哪個遠程倉庫
正常的形式其實是:,冒號前表示本地分支的名字,冒號後表示遠程倉庫的分支的名字。
上麵的命令省略了遠程倉庫分支的名稱,如果省略了代表遠程的分支的名字使用本地分支的名字。
上麵的命令等價於

1
$ git push origin master:master

遠程分支和本地分支的名字相同,可以省略遠程分支的名字
注意:如果遠程沒有master分支的話,就會新建一個以此名字命名的遠程分支
也可以這樣寫:

1
$ git push origin master:refs/for/branch1 

在本地倉庫中找到名字為master的分支,用他去更新遠程倉庫下麵名字為branch1的分支

還有一個小技巧,你不知道當前分支的名稱的話,可以用前麵的命令去查看
如果不想查看,可以這樣

1
$ git push origin HEAD:refs/for/branch1 

使用HEAD作為當前分支的代表符號

如果本地分支名稱給省略了,代表用空的分支去更新遠程分支,間接的實現對遠程分支內容的刪除
例如:

1
$ git push origin :branch1

看到這裏就明白了要解決的問題,哪個代表本地分支,哪個代表遠程分支。
如果錯誤,歡迎指正。

最後更新:2017-04-03 12:56:36

  上一篇:go 如何讓AlertDialog 在點擊確定或者取消時不消失
  下一篇:go 老毛桃U盤裝XP,ntldr is missing