准備工作
- 要讓 GitHub 識別出你推送的提交確實是你推送的,需要創建 SSH Key。
- 創建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
郵箱地址任意,僅作注釋之用。鍵入回車后會要求你輸入一個 passphrase(密碼),這個可有可無,作用是防止有人取得你的計算機使用權限,在 SSH 連接時還要輸入這個密碼,建議不用填直接跳過。 - 然后計算機用戶主目錄里找到 .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 git@github.com:<Github用戶名>/learngit.git
,將本地庫與遠程庫關聯。 - origin 就是遠程庫的名字,這是 Git 默認的叫法,也可以改成別的,但是 origin 這個名字一看就知道是遠程庫。
- 下一步,把本地庫的所有內容推送到遠程庫上:
git push -u origin master
(實際上是把當前 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 "torvalds@linux-foundation.org"
,再git push
,Github 頁面上就會顯示是 linus torvalds 提交的代碼,很有意思。
克隆遠程庫 - git clone
- 關聯遠程庫(先有遠程庫):
git clone git@github.com:<Github用戶名>/gitskills.git
,執行該命令后會在當前目錄下新建一個 gitskills 目錄,並將遠程庫克隆到本地的 gitskills 目錄中。
Github里 git clone 和 download zip 的區別:git clone 包含
.git
目錄,即包含歷史版本信息,而 download zip 沒有歷史版本信息,相當於當前分支的最新版本。
- 如果是多人協作開發,最好的方式是先創建遠程庫,然后各自從遠程克隆一份即可。
多人協作
- 查看遠程庫名:
git remote
- 查看遠程庫信息,顯示了可以抓取和推送的遠程庫地址:
$ git remote -v origin git@github.com:username/learngit.git (fetch) origin git@github.com:username/learngit.git (push)
- 推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,Git 就會把該分支推送到遠程庫對應的遠程分支上:
git push origin master
,如果要推送 dev 分支,就改成:git push origin dev
。
但是,並不是一定要把本地分支往遠程推送,那么,哪些分支需要推送,哪些不需要呢?- master 分支是主分支,因此要時刻與遠程同步; dev 分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
- bug 分支只用於在本地修復 bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個 bug;
- feature 分支是否推到遠程,取決於你是否和你的小伙伴合作在上面開發。
- 現在,另外一位同事要在 dev 上進行開發,首先將遠程庫克隆到本地:
git clone git@github.com: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 'git@github.com: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 為我們標識出的沖突位置修改為所需要的樣子,然后提交,再推送到遠程即可。