Git教程:推送和抓取分支(三)

推送和抓取分支

我們在本地倉庫上有 master 分支,但是如何將本地分支推送到遠程分支呢,使用命令git push 即可:

例如,現在我們的本地倉庫中有兩個分支:masterdev, 現在將兩個分支推送到遠程倉庫(github)上:git push origin <local branch name>

$ git push origin master
$ git push origin dev
注意:`origin` 是默認的遠程倉庫名字,後面的分支名字是本地倉庫中分支的名字,
       這樣,Git就會把本地分支推送到遠程倉庫對應的分支上(遠程倉庫沒有,則
       Git會默認創建一個)

在這裏插入圖片描述
此外,並不是所有的分支都需要推送到遠程倉,分支是否需要推送到遠程倉,視自己的情況需要而定。


抓取分支:

你可以往遠程倉推送自己的分支,同時也可以從克隆遠程倉到本地(相當於下載),現在,我們在另外一臺電腦上克隆倉庫 firstRep ,使用命令git clone <repository name>:,現在我在windows上使用Git bash模仿你的一位同事:

$ git clone git@github.com:xxxxx/firstRep.git
Cloning into 'firstRep'...
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (16/16), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 16 (delta 3), reused 16 (delta 3), pack-reused 0
Receiving objects: 100% (16/16), done.
Resolving deltas: 100% (3/3), done.

然後我們進入到倉庫,然後再來查看克隆到本地的分支情況,使用命令git branch:

$ cd firstRep

$ git branch
* master

ok,發現遠程倉中的 dev分支並不存在,其實在默認情況下,你的小夥伴使用git clone命令只能看到本地的 master 分支。

現在你的小夥伴想要在 dev 分支上開發,就必須創建遠程 origindev 分支到本地,使用下面的命令即可創建遠程分支到本地:

$ git checkout -b dev origin/dev
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.

看到Git此時告訴我們,我們可以使用這個本地分支 dev 分支來追蹤遠程庫中的 dev 分支。

現在他就可以在這個dev分支上工作,並且推送到遠程的 dev 分支。

例如:我們新創建一個 a.txt 文件添加並提交至倉庫中:

$ cat a.txt
test dev

$ git add readme.txt
$ git commit -m 'commit a.txt'
$ git commit -m 'commit a.txt'
[dev ca21716] commit a.txt
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

然後可以推送到遠程庫中的 dev 分支。

$ git push origin dev
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:xxxxxx/firstRep.git
   a688f95..ca21716  dev -> dev

現在我們在遠程倉中的 dev 分支看到的最新的提交是你的小夥伴提交內容。一切都是那麼優雅,如絲般順滑,但是到你這就可能會出錯了,繼續往下看。

碰巧你也新建了一個文件名一樣的文件 a.txt ,添加了一些內容,然後想要推送至遠程倉的 dev 分支:

$ cat a.txt
$ git add a.txt
$ git commit -m 'commit this txt'
[master 0ac9d23] commit this txt
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

然後試圖推送到遠程倉:

$ git push origin dev
To github.com:xxx/firstRep.git
 ! [rejected]        dev -> dev (fetch first)
error: failed to push some refs to '[email protected]:xxx/firstRep.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

可以看到推送失敗了,仔細的讀一下Git告訴我們失敗的原因:通常是因爲另外一個倉庫推送了同樣的文件至該分支上。

並且Git提示我們可以使用 git pull 抓取分支然後再推送:所以我們試着使用它提示的方法來抓取分支:

$ git pull origin dev
From github.com:xxxx/firstRep
 * branch            dev        -> FETCH_HEAD
Auto-merging a.txt
CONFLICT (add/add): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

可以看到出現衝突,於是我們可以解決衝突:git status 告訴我們衝突的文件:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both added:      a.txt

no changes added to commit (use "git add" and/or "git commit -a")

可以看到存在衝突:查看 a.txt 文件的內容:

$ cat a.txt
<<<<<<< HEAD
test pull
=======
test dev
>>>>>>> ca217161af9b857fdede6699404ad322a0bb17b2

可以看到Git使用不同的符號:<<<<<<<=======>>>>>>>,來標記出當前版本的a.txt 和 你的某個小夥伴提交的版本的 a.txt 的不同內容。

我們必須手動解決衝突:

//手動更改爲:test pull and dev
$ cat a.txt
test pull and dev

然後再提交修改然後推送:

$ git push
Counting objects: 2, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 337 bytes | 168.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:CoderCXF/firstRep.git
   c869bd5..fc6a2fd  dev -> dev

推送成功。在github 上也可以看到文件 a.txt 合併後的內容。

$ cat a.txt
test pull and dev

ok, 至此所有的問題都已經成功解決。


小結:

1、推送分支至遠程倉:git push origin <branch name>,如果推送失敗的話,先使用git pull 抓取分支,然後合併內容;

2、本地新建的分支如果不推送到遠程,對其他人就是不可見的;

3、如果需要自己關聯到別人創建的另一個分支,使用命令:
git checkout -b <branch name> origin/<branch name>,最好自己本地創建的分支和遠程分支名稱一樣;

4、建立遠程分支和本地分支的關聯:使用命令:
git branch --set-upstream branch-name origin/branch-name




參考:

【1】廖雪峯:Git教程

【2】Git獲取遠程服務器的指定分支

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章