Git遠端倉庫及github的使用備註
阿新 • • 發佈:2019-01-11
遠端倉庫:
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,
如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key:
你需要把郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。
如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容:
把本地倉庫的內容推送到GitHub倉庫:
下一步,就可以把本地庫的所有內容推送到遠端庫上:
第一次使用Git的clone或者push命令連線GitHub時,會得到一個警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
這是因為Git使用SSH連線,而SSH連線在第一次驗證GitHub伺服器的Key時,需要你確認GitHub的Key的指紋資訊是否真的來自GitHub的伺服器,輸入yes回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key新增到本機的一個信任列表裡了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現一次,後面的操作就不會有任何警告了。
如果你實在擔心有人冒充GitHub伺服器,輸入yes前可以對照GitHub的RSA Key的指紋資訊是否與SSH連線給出的一致。
之後,只要本地作了提交,就可以通過命令:
把本地master分支的最新修改推送至GitHub,現在,你就擁有了真正的分散式版本庫!
從遠端庫克隆:
在github上建立一個遠端庫後使用如下命令進行克隆:
此處需要注意的是:clone 是整個庫克隆,也就是一個遠端庫的資料夾及裡面的檔案,所以clone專案可以不要建立資料夾,直接進入專案儲存目錄執行此命令即可!
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快。
建立與合併分支:
建立dev分支,然後切換到dev分支:
git checkout命令加上-b引數表示建立並切換,相當於以下兩條命令:
用git branch命令檢視當前分支:
git branch命令會列出所有分支,當前分支前面會標一個*號。
把dev分支的工作成果合併到master分支上:
git merge命令用於合併指定分支到當前分支。合併後,再檢視readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
刪除dev分支了:
刪除後,檢視branch,就只剩下master分支了:
小結
Git鼓勵大量使用分支:
檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
Bug分支
軟體開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交:
$ git status
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:
軟體開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交:
並不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎麼辦?
幸好,Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:
現在,用git status檢視工作區,就是乾淨的(除非有沒有被Git管理的檔案),因此可以放心地建立分支來修復bug。
首先確定要在哪個分支上修復bug,假定需要在master分支上修復,就從master建立臨時分支:
現在修復bug,需要把“Git is free software ...”改為“Git is a free software ...”,然後提交:
修復完成後,切換到master分支,並完成合並,最後刪除issue-101分支:
用git stash list命令檢視工作區:
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
Feature分支:
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。
多人協作:
當你從遠端倉庫克隆時,實際上Git自動把本地的master分支和遠端的master分支對應起來了,並且,遠端倉庫的預設名稱是origin。
要檢視遠端庫的資訊,用git remote:
或者,用git remote -v顯示更詳細的資訊:
上面顯示了可以抓取和推送的origin的地址。如果沒有推送許可權,就看不到push的地址。
推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠端庫對應的遠端分支上:
如果要推送其他分支,比如dev,就改成:
但是,並不是一定要把本地分支往遠端推送,那麼,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠端同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
bug分支只用於在本地修復bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏著玩,是否推送,視你的心情而定!
檢視遠端庫資訊,使用git remote -v;
本地新建的分支如果不推送到遠端,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端的新提交;
在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一致;
建立本地分支和遠端分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
從遠端抓取分支,使用git pull,如果有衝突,要先處理衝突
命令git tag <name>用於新建一個標籤,預設為HEAD,也可以指定一個commit id;
git tag -a <tagname> -m "blablabla..."可以指定標籤資訊;
git tag -s <tagname> -m "blablabla..."可以用PGP簽名標籤;
命令git tag可以檢視所有標籤。
命令git push origin <tagname>可以推送一個本地標籤;
命令git push origin --tags可以推送全部未推送過的本地標籤;
命令git tag -d <tagname>可以刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>可以刪除一個遠端標籤。
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,
如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ ssh-keygen -t rsa -C "[email protected]"
</span></strong>
你需要把郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。
如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容:
把本地倉庫的內容推送到GitHub倉庫:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote add origin "SSH clone URL" 如:[email protected]:omsvip/HelloGit.git</span></strong>
下一步,就可以把本地庫的所有內容推送到遠端庫上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push -u origin master </span></strong>
第一次使用Git的clone或者push命令連線GitHub時,會得到一個警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
這是因為Git使用SSH連線,而SSH連線在第一次驗證GitHub伺服器的Key時,需要你確認GitHub的Key的指紋資訊是否真的來自GitHub的伺服器,輸入yes回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key新增到本機的一個信任列表裡了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現一次,後面的操作就不會有任何警告了。
如果你實在擔心有人冒充GitHub伺服器,輸入yes前可以對照GitHub的RSA Key的指紋資訊是否與SSH連線給出的一致。
之後,只要本地作了提交,就可以通過命令:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin master</span></strong>
把本地master分支的最新修改推送至GitHub,現在,你就擁有了真正的分散式版本庫!
從遠端庫克隆:
在github上建立一個遠端庫後使用如下命令進行克隆:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git clone [email protected]:omsvip/gitskills.git</span></strong>
此處需要注意的是:clone 是整個庫克隆,也就是一個遠端庫的資料夾及裡面的檔案,所以clone專案可以不要建立資料夾,直接進入專案儲存目錄執行此命令即可!
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快。
建立與合併分支:
建立dev分支,然後切換到dev分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout -b dev
Switched to a new branch 'dev'
</span></strong>
git checkout命令加上-b引數表示建立並切換,相當於以下兩條命令:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch dev
$ git checkout dev
Switched to branch 'dev'
</span></strong>
用git branch命令檢視當前分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch
* dev
master
</span></strong>
git branch命令會列出所有分支,當前分支前面會標一個*號。
把dev分支的工作成果合併到master分支上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
</span></strong>
git merge命令用於合併指定分支到當前分支。合併後,再檢視readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
刪除dev分支了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch -d dev
Deleted branch dev (was fec145a).
</span></strong>
刪除後,檢視branch,就只剩下master分支了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch
* master
</span></strong>
因為建立、合併和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。小結
Git鼓勵大量使用分支:
檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
Bug分支
軟體開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交:
$ git status
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
</span></strong>
現在,用git status檢視工作區,就是乾淨的(除非有沒有被Git管理的檔案),因此可以放心地建立分支來修復bug。軟體開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git status
# On branch dev
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hello.py
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
</span></strong>
並不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎麼辦?
幸好,Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
</span></strong>
現在,用git status檢視工作區,就是乾淨的(除非有沒有被Git管理的檔案),因此可以放心地建立分支來修復bug。
首先確定要在哪個分支上修復bug,假定需要在master分支上修復,就從master建立臨時分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
$ git checkout -b issue-101
Switched to a new branch 'issue-101'
</span></strong>
現在修復bug,需要把“Git is free software ...”改為“Git is a free software ...”,然後提交:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git add readme.txt
$ git commit -m "fix bug 101"
[issue-101 cc17032] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
</span></strong>
修復完成後,切換到master分支,並完成合並,最後刪除issue-101分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
Deleted branch issue-101 (was cc17032).
</span></strong>
用git stash list命令檢視工作區:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash list
[email protected]{0}: WIP on dev: 6224937 add merge
</span></strong>
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash pop</span></strong>
修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
Feature分支:
開發一個新feature,最好新建一個分支;
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'</span></strong>
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。
多人協作:
當你從遠端倉庫克隆時,實際上Git自動把本地的master分支和遠端的master分支對應起來了,並且,遠端倉庫的預設名稱是origin。
要檢視遠端庫的資訊,用git remote:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote
origin</span></strong>
或者,用git remote -v顯示更詳細的資訊:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote -v
origin [email protected]:michaelliao/learngit.git (fetch)
origin [email protected]:michaelliao/learngit.git (push)
</span></strong>
上面顯示了可以抓取和推送的origin的地址。如果沒有推送許可權,就看不到push的地址。
推送分支,就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠端庫對應的遠端分支上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin master
</span></strong>
如果要推送其他分支,比如dev,就改成:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin dev
</span></strong>
但是,並不是一定要把本地分支往遠端推送,那麼,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠端同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
bug分支只用於在本地修復bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏著玩,是否推送,視你的心情而定!
檢視遠端庫資訊,使用git remote -v;
本地新建的分支如果不推送到遠端,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端的新提交;
在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一致;
建立本地分支和遠端分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
從遠端抓取分支,使用git pull,如果有衝突,要先處理衝突
命令git tag <name>用於新建一個標籤,預設為HEAD,也可以指定一個commit id;
git tag -a <tagname> -m "blablabla..."可以指定標籤資訊;
git tag -s <tagname> -m "blablabla..."可以用PGP簽名標籤;
命令git tag可以檢視所有標籤。
命令git push origin <tagname>可以推送一個本地標籤;
命令git push origin --tags可以推送全部未推送過的本地標籤;
命令git tag -d <tagname>可以刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>可以刪除一個遠端標籤。