推送和抓取分支
我們在本地倉庫上有 master
分支,但是如何將本地分支推送到遠程分支呢,使用命令git push
即可:
例如,現在我們的本地倉庫中有兩個分支:master
和 dev
, 現在將兩個分支推送到遠程倉庫(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
分支上開發,就必須創建遠程 origin
的 dev
分支到本地,使用下面的命令即可創建遠程分支到本地:
$ 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教程