165
技術社區[雲棲]
關於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 |
$ 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