Git 遠端庫:Github 推送 push 克隆 clone、協作開發詳解
準備工作
-
要讓 GitHub 識別出你推送的提交確實是你推送的,需要建立 SSH Key。
-
建立 SSH Key:
ssh-keygen -t rsa -C "[email protected]"
郵箱地址任意,僅作註釋之用。鍵入回車後會要求你輸入一個 passphrase(密碼),這個可有可無,作用是防止有人取得你的計算機使用許可權,建議不用填直接跳過。
-
然後到計算機使用者主目錄裡找到 .ssh 目錄,裡面的 id_rsa 和 id_rsa.pub 兩個檔案就是SSH Key 的祕鑰對,id_rsa 是私鑰,不能洩露出去,id_rsa.pub 是公鑰,可以放心地告訴任何人。
-
登陸 GitHub,打開個人設定新增 SSH key,填上任意 Title,在 Key 文字框裡貼上公鑰。
推送到遠端庫 - git push
-
關聯遠端庫(先有本地庫):首先再 Github 網頁上建立一個新的庫,例如命名為 learngit。在本地倉庫中執行
git remote add origin [email protected]:<Github使用者名稱>/learngit.git
,將本地庫與遠端庫關聯。 -
origin 就是遠端庫的名字,這是 Git 預設的叫法,也可以改成別的,但是 origin 這個名字一看就知道是遠端庫。
-
下一步,把本地庫的所有內容推送到遠端庫上:
git push -u origin master
-
git push
的格式為git push <遠端庫名> <本地分支名>:<遠端分支名>
。 -
第一次推送 master 分支時加上 -u 引數,指定 origin 為預設主機,在以後的推送或者拉取時就可以不加任何引數使用
git push
了。
-
在 Github 上顯示的 commit 記錄中,如果本地倉庫設定的 Git email 地址是 Github 上已存在的賬號,則 push 到 Github 上後 commit 記錄裡會顯示相應的 Github 使用者名稱和頭像,而非 Git username。
可以嘗試設定
git config user.email "[email protected]"
,再git push
,Github 頁面上就會顯示是 linus torvalds 提交的程式碼,很有意思。
克隆遠端庫 - git clone
- 關聯遠端庫(先有遠端庫):
git clone [email protected]:<Github使用者名稱>/gitskills.git
,執行該命令後會在當前目錄下新建一個 gitskills 目錄,並將遠端庫克隆到本地的 gitskills 目錄中。
Github裡 git clone 和 download zip 的區別:git clone 包含
.git
目錄,即包含歷史版本資訊,而 download zip 沒有歷史版本資訊,相當於當前分支的最新版本。
- 如果是多人協作開發,最好的方式是先建立遠端庫,然後各自從遠端克隆一份即可。
多人協作
-
檢視遠端庫名:
git remote
-
檢視遠端庫資訊,顯示了可以抓取和推送的遠端庫地址:
$ git remote -v origin [email protected]:username/learngit.git (fetch) origin [email protected]:username/learngit.git (push)
-
推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,Git 就會把該分支推送到遠端庫對應的遠端分支上:
git push origin master
,如果要推送 dev 分支,就改成:git push origin dev
。但是,並不是一定要把本地分支往遠端推送,那麼,哪些分支需要推送,哪些不需要呢?
- master 分支是主分支,因此要時刻與遠端同步; dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
- bug 分支只用於在本地修復 bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個 bug;
- feature 分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
-
現在,另外一位同事要在 dev 上進行開發,首先將遠端庫克隆到本地:
git clone [email protected]:username/learngit.git
,然後建立遠端 origin 的 dev 分支到本地:
git checkout -b dev origin/dev
這一步的前提是遠端庫已經有 dev分支,否則先需要把 dev 分支推送到遠端庫
git push origin dev
,然後同事git pull
重新拉取資料,現在便可建立遠端的 dev 分支到本地。現在他就可以在 dev 上繼續修改,並且時不時地把 dev 分支 push 到遠端:
git push origin dev
。 -
一般情況是這樣:同事先修改了 dev 分支並 push 到了遠端,而此時你也對 dev 分支進行了修改,但是你 push 到遠端庫便會出錯,因為你本地分支和遠端分支不一致,即遠端分支上存在本地分支中不存在的提交:
$ git push origin dev To github.com:username/learngit.git ! [rejected] dev -> dev (fetch first) error: failed to push some refs to '[email protected]:username/learngit.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 pull
把最新的提交從origin/dev
拉取下來,即先讓本地分支與遠端分支完成同步,可能還需要解決衝突,然後再推送便可成功。如果
git pull
也提示失敗了,原因是沒有指定本地 dev 分支與遠端 dev 分支的關聯。所以需要先設定 dev 和 origin/dev 的關聯,再執行git pull
:$ git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'. $ git pull Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
可以看出,執行
git pull
時發生了衝突。此時解決衝突的方式和解決分支合併衝突的方式一樣。編輯 readme.txt,將 Git 為我們標識出的衝突位置修改為所需要的樣子,然後提交,再推送到遠端即可。