本文章適用於新手使用github配置本地免密連接。本地是在win10系統下利用Git 64工具拉取的。
因爲git支持兩種傳輸協議,ssh和https方式。本文講解的是ssh方式,而不是https的方式。我們可以從github上進入項目上查看兩種方式:
HTTPS方式
ssh方式
一 建立本地分支
我們這裏主要介紹本地配置ssh方式來免用戶名和密碼方式提交代碼
1.先從遠端拉取分支代碼
$ git clone https://github.com/lony2016/myLeetcode -b dev_laboratory
|
https:這是你的代碼地址;
-b dev_laboratory:是你項目的分支代碼。
2.在本地建立自己的分支:比如dev_test
$ git branch [分支名字] (或者git checkout -b dev_test(分支名字)) |
切換到自己的分支上並查看是否切換成功
$ git branch |
切換成功
注意:在github上建立的項目要是第一次拉取下來後建立分支尚未設置分支的用戶名和郵箱時,把新建立的本地分支提交到遠端會提交不成功,需要設置用戶名和密碼
$ git config –global user.name “xxxxname” $ git config –global user.email “[email protected]” |
二 ssh方式實現pull push 免密
1.在本地生成ssh密鑰對
已安裝好Git 64的話,直接右鍵菜單中選擇Git bash here即可。
warn:最好在C:\Users\xxxxx\ .ssh(**打開你的.ssh的目錄**)目錄下打開Git bash,或者把生成的文件移動到/.ssh/目錄下。
輸入如下命令:
$ ssh-keygen -t rsa -C “[email protected]” |
“[email protected]:”換成自己的郵箱。
出現提示一直回車,全部設置成默認值即可。
(注意:可能有人想把文件名更改成自己喜歡的,這個時候可能需要注意一下,後面詳說)
2.把在本地生成ssh公玥複製到github上
$ cat ~/.ssh/id_rsa.pub |
把出現的內容包括ssh開頭和已郵箱結尾的全部內容複製下來,打開github,登錄進入自己的賬戶,點擊自己賬號的頭像,點擊setting,在打開的網頁中點擊屏幕左邊的SSH and GPG keys,在出現的界面下,點擊New SSH key,然後把之前賦值的內容複製進key下面的框內即可,title隨便你取。
賬號頭像->setting->SSH and GPG keys->New SSH key->添加title名字和公玥->Add SSH key |
3.驗證添加的key是否成功
ssh -T [email protected] |
如果出現如下提示,則表明key添加成功
Hi lxxxxxxx6! You’ve successfully authenticated, but GitHub does not provide shell access. |
但是有些到這一步可能回報Permission denied (publickey)的錯誤,我的原因如下:
是在生成密鑰對時,把生成的默認文件名換成我習慣的文件名:
Enter file in which to save the key (“當前所在路徑/id_rsa(默認的文件名)”): “id_rsa_leetcode(更改成新名字)” |
這樣一來,你設置的文件名並沒有加入到ssh設定的默認查找的文件名中,ssh會默認查找id_rsa、id_dsa、id_ecdsa這三個文件,然後就不嘗試其他了。所以就出現了上述錯誤
Permission denied (publickey)解決辦法[1]
$ ssh-agent bash $ ssh-add ~/.ssh/id_rsa_leetcode(你起的新名字) |
然後再嘗試輸入ssh -T [email protected]就可以了。 雖然上述問題解決了Permission denied (publickey)的問題,但當我們把當前的Git窗口關閉,重新打開一個時,又會出現這個錯誤了,這是因爲:
ssh-agent 是一個用於存儲私鑰的臨時性的 session 服務,也就是說當你重啓之後,ssh-agent 服務也就重置了[2]。具體這個問題怎麼解決,這裏就不深追究了。
推薦設置:由於重新起名字會造成上述麻煩,推薦新手還是設置成默認的名字即可。感興趣的可以去深究此問題。
4.本地提交代碼免密碼提交(ssh方式)
使用如下命令:git remote -v,會出現如下內容:
$ git remote -v origin https://github.com/lony2016/myLeetcode.git (fetch) origin https://github.com/lony2016/myLeetcode.git (push) |
出現上述內容說明還是通過https方式訪問的。
下面把訪問方式改爲ssh方式,輸入如下命令:
$ git remote set-url origin [email protected]:lony2016/myLeetcode.git |
[email protected]:lony2016/myLeetcode.git:是你自己項目的地址,登錄你的github,如下圖:
找到你的上述圖片紅框中的地址,複製出來即可。再用git remote -v查看一下,是否設置成功,當地址出現以git@開始的就是設置成功。
$ git remote -v origin [email protected]:lony2016/myLeetcode.git (fetch) origin [email protected]:lony2016/myLeetcode.git (push) |
三 本地代碼提交
按順序輸入如下代碼:
$ git add 文件名(文件多的話用*:git add *) $ git commit -m “此次提交說明” $ git push origin dev_test(你分支的名字) |
對於push時,爲什麼使用git push origin dev_test(你分支的名字)做個簡短說明:
Git push與pull的默認行爲[3]
(1)push.default的默認行爲:git的全局配置中,有一個push.default屬性,其決定了git push操作的默認行爲。根據git的不同版本,git push 會出現兩種不同的結果:
a. push成功,把本地分支push到遠端的同名的分支上(2.0版本以前)
b.push失敗,會出現如下錯誤:(2.0版本以後)
fatal: The current branch new has no upstream branch. To push the current branch and set the remote as upstream, use git push –set-upstream origin dev_test |
所以,2.0版本以後就必須顯式指定將要推送的分支名:如git push origin dev_test
(2)push.default 的可供選擇的值:
nothing matching upstream simple current
其用途分別爲:
nothing:這種方式 push必須顯式指定遠程分支,例如git push origin develop。
matching:這種方式push時,本地和遠程兩端都必須含有同名分支才行。
upstream:此種方式push當前分支到它的upstream分支上(這一項其實用於經常從本地分支push/pull到同一遠程倉庫的情景,這種模式叫做central workflow)。
simple:這種方式,非常類似與upstream模式,但simple必須保證本地和remote的分支同名,否則會push失敗。
current: 對於push本地的分支到remote上同名的分支,但如果遠端沒有相同名字的分支,則會在遠端創建此分支
所以,git 2.0版本以前,push.default 默認設置成matching,只需git push即可。
git 2.0版本之後,push.default默認值爲simple。必須指定當前分支的upstream,不然就會報上述哪個錯誤。必須使用git push –set-upstream origin dev_test。
要想改變push.default的默認值,兩種方式,一種是直接到C:\Users\xxxxx(你的用戶名下)\ .gitconfig(與.ssh文件夾在同一目錄)文件打開修改,也可使用命令:git config –global push.default ‘option’將option換成上述5種方式的一種即可。
參考:
[1]https://my.oschina.net/alvin404/blog/205745
[2]https://segmentfault.com/q/1010000000835302
[3]https://segmentfault.com/a/1190000002783245