使用Git管理源碼時,如果項目需要和他人協(xié)作,通常需要一個或多個遠程倉庫(remote repository)。
遠程倉庫作為項目的版本庫,可以托管在自己搭建的Git服務(wù)器上的,也可以是托管在互聯(lián)網(wǎng)上的(例如GitHub、AzureDevops等)。
1. 管理遠程倉庫
1.1. 查看遠程倉庫
-
git remote -v:查看本地倉庫所有的遠程倉庫。仍然以gitsample為例:
$ git remote -v
origin https://github.com/efreykongcn/gitsample (fetch)
origin https://github.com/efreykongcn/gitsample (push)
命令返回了兩行信息,分別列出了fetch和push命令的對應(yīng)remote。這兩個命令隨后會介紹。
每一行信息的第一列為遠程倉庫的別名(默認為origin),第二列為遠程倉庫的地址。
為什么我們并沒有對gitsample添加過任何遠程倉庫,而倉庫里就已經(jīng)由遠程倉庫了?這是因為項目是從github clone初始的,clone的時候git會自動將被clone的源設(shè)置為本地倉庫的remote。
-
git remote show <遠程倉庫別名>查看指定遠程倉庫?,F(xiàn)在查看下origin
$ git remote show origin
* remote origin
Fetch URL: https://github.com/efreykongcn/gitsample
Push URL: https://github.com/efreykongcn/gitsample
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
1.2. 移除遠程倉庫
-
git remote rm <遠程倉庫別名>命令可以移除指定的遠程倉庫。
現(xiàn)在我們來將gitsample默認添加的remote移除:
$ git remote rm origin
再來查看遠程倉庫:
$ git remote -v
命令返回的結(jié)果是空的,可以確認
1.3. 為本地倉庫添加遠程倉庫
-
git remote add <遠程倉庫別名> <遠程倉庫url>命令可以添加遠程倉庫。
現(xiàn)在我們將github上的遠程庫添加回來:
$ git remote add githubek git@github.com:efreykongcn/gitsample.git
再查看遠程倉庫:
$ git remote -v
githubek origin git@github.com:efreykongcn/gitsample.git (fetch)
githubek origin git@github.com:efreykongcn/gitsample.git (push)
1.4. 修改遠程倉庫
-
git remote rename <當前遠程倉庫的別名> <想要改成的別名>:修改遠程倉庫的別名。
遠程倉庫又添加回來了,只是這次的別名為“githubek”。通常推薦默認同步的倉庫別名為origin,現(xiàn)在我們將別名改回來:
$ git remote rename githubek origin
-
git remote set-url <遠程倉庫別名> <遠程倉庫url>:修改遠程倉庫的url。
另外這次添加的遠程倉庫使用的是ssh,現(xiàn)在改回https:
$ git remote set-url origin https://github.com/efreykongcn/gitsample.git
再來查看:
$ git remote -v
origin https://github.com/efreykongcn/gitsample.git (fetch)
origin https://github.com/efreykongcn/gitsample.git (push)
2. 同遠程倉庫同步數(shù)據(jù)
2.1. 向遠程倉庫推送更新
使用git push命令可以向遠程倉庫推送更新。常見的幾種用法如下:
git push origin master
將本地當前分支的更新推送到遠程倉庫origin的master分支。使用這個命令時,如果分之間沒有建立跟蹤關(guān)系會報錯:fatal: The current branch master has no upstream branch.git push --set-upstream <遠程倉庫別名> <遠程分支名>
為本地的分支同遠程倉庫的分支建立跟蹤關(guān)系并將本地分支的更新(提交)推送到遠程倉庫關(guān)聯(lián)的分支。git push <遠程倉庫別名> <本地分支名>:<遠程分支名>
將指定的本地分支的更新推送到遠程倉庫的指定分支。這個命令不需要本地分支和遠程分支建立跟蹤關(guān)系。git push origin --delete feature-c3
刪除遠程倉庫orgin的feature-c3分支。效果等同于git push origin :feature-c3(推送空的庫到遠程倉庫)。如果遠程倉庫只有一個分支(默認分支),那么這個分支不允許被刪除,使用推送刪除命令時git會報錯。
git push --all origin
將本地所有的分支推送到遠程倉庫,包括本地新建但還沒有推送到遠程倉庫的分支。git push -f origin master:強制將本地的更新推送到遠程倉庫origin的master分支。例如,當本地發(fā)生過提交的回撤時(被本地回撤的遞交已經(jīng)被推送到遠程倉庫),需要使用-f這個強制參數(shù),否則不會成功。git push origin --tags
將本地的tag推送到遠程倉庫。需要注意的是,在使用push命令但是沒有指定--tags參數(shù)的情況下,git是不會將tag推送到到遠程倉庫的。
接下來將本地的更新推送到遠程倉庫:
$ git push --set-upstream origin master
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (12/12), 1.22 KiB | 249.00 KiB/s, done.
Total 12 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/efreykongcn/gitsample.git
4a567b9..23b2190 master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
2.2. 從遠程倉庫獲取更新
使用git fetch和git pull都可以從遠程倉庫獲取更新(commit)。不同的是fetch操作只獲取更新,但是不會將遠程倉庫的更新合并到本地倉庫。pull操作獲取更新然后將更新合并到本地倉庫,并且會用合并的結(jié)果更新暫存區(qū)和工作區(qū)。
一般推薦使用git fetch + git merge的方式來獲取更新并合并到本地。這兩個命令組合使用效果等同于git pull,但是fetch和merge之間可以通過diff來查看差異,確認沒有問題了再merge。
2.2.1. git fetch
-
git fetch <遠程倉庫別名> [<遠程分支名>]:從遠程倉庫獲取更新到本地倉庫,但是不更新暫存區(qū)和工作區(qū)。如果不指定分支名則獲取全部分支的更新。這個命令通常用來查看遠程倉庫的更新情況。
從遠程倉庫獲取了更新后,可以使用git diff <本地分支名> <遠程倉庫別名>/<遠程倉庫分支名>命令來查看本地分支和遠程分支的差異。
如果本地分支同遠程分支的提交有差異,可以使用git merge [<本地分支名>] <遠程倉庫別名>/<分支名>命令將遠程分支的提交合并到本地的分支。
示例:
$ git fetch origin #獲取origin全部分支的更新
$ git fetch origin master #獲取origin master分支的更新
$ git diff master origin/master
$ git merge origin/master #省略本地分支名,則會將origin/master合并到當前簽出的本地分支。
2.2.2. git pull
-
git pull <遠程倉庫別名> <遠程分支名>[:<本地分支名>]
從遠程倉庫指定分支拉取更細并合并到本地指定的分支。如果不指定本地分支名,則默認合并到當前簽出的分支。
示例:
$ git pull origin master
From https://github.com/efreykongcn/gitsample
* branch master -> FETCH_HEAD
Already up to date.