1. 程式人生 > >Git遠端倉庫及github的使用備註

Git遠端倉庫及github的使用備註

遠端倉庫:
第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>可以刪除一個遠端標籤。