天天看點

GitHub使用操作指南

GitHub的是版本控制和協作代碼托管平台。它可以讓你和其他人的項目從任何地方合作。Git也是目前世界上最先進的分布式版本控制系統(沒有之一)。最初編寫用作Linux核心代碼的管理。推出後,Git在其它項目中也取得了很大成功。Github目前已經有100多萬的開發者,并且對于公共項目的托管免費。Github使得版本控制更加容易,多人協作編碼變得簡單。使用過SVN的同學應該知道,當沒有網絡的支援,開發者并沒有辦法送出已完成代碼。Github支援離線送出,其實就是送出到本地倉庫。每一個開發者clone下的項目代碼都是一個完整的倉儲,當遠端或其他協作開發者代碼無法恢複時,都可以友善使用本地的倉儲進行恢複。當需要對代碼進行分支時,其他版本控制軟體在大量檔案時會很慢,而Github幾乎是瞬間完成這個操作,而且隻需要一個指令即可。下面我們一步一步來搭建Github的環境(以windows作業系統為例)。

Git曆史?

Linus在1991年建立了開源的Linux,從此,Linux系統不斷發展,已經成為最大的伺服器系統軟體了。Linux的代碼是如何管理的呢?Linus自己用C寫了一個分布式版本控制系統,這就是Git!一個月之内,Linux系統的源碼已經由Git管理了!Git迅速成為最流行的分布式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。

1、安裝Git(本文介紹windows上的安裝,linux和Mac OS安裝參看原文)

準備

1)Windows版Git下載下傳,然後全部點選下一步安裝。安裝完成後,在開始菜單裡找到Git->Git Bash,如下圖就說明Git安裝成功!

2)GitHub官網申請一個賬号

開始操作:

1)Git安裝完成後,配置你的名字和Email位址。

1

2

3

$ git config --global user.name "Your Name"

$ git config --global user.email "[email protected]"

注:git config指令的--global參數,表示本機所有的Git倉庫都會使用這個配置,也可以對某個倉庫指定不同的使用者名和Email位址。

2、建立版本庫

什麼是版本庫呢?

版本庫又名倉庫,英文名

repository

,你可以簡單了解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、删除,Git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在将來某個時刻可以還原。

1)建立一個版本庫非常簡單,首先,建立一個空目錄:

1

2

3

4

5

6

7

8

9

$ cd /d //你指定的個人盤符

$ mkdir learngit //建立版本庫根目錄

$ cd learngit //進入版本庫目錄(tab鍵盤補全指令)

$ pwd //檢視目前路徑

/d/learngit

2)通過git init指令把這個目錄變成Git可以管理的倉庫:

1

$ git init

Git倉庫建好了,是一個空的倉庫(empty Git repository),目前目錄下多了一個.git的目錄,來跟蹤管理版本庫的,不要手動修改這個目錄裡面的檔案。随後分布式伺服器push或download都是使用master,包括對github的互動也是如此。

3)在learngit下建立一個readme.txt檔案并編寫兩句話。

1

2

3

4

5

6

7

8

9

$touch readme.txt

$ vi readme.txt //進入編輯器,按i進入編輯模式,esc退出:wq強制儲存

Git is a version control system.

Git is free software.

$cat readme.txt //檢視資訊

4)用指令git add告訴Git,把檔案添加到倉庫:

$ git add readme.txt

5)用指令git commit告訴Git,把檔案送出到倉庫,-m後面輸入的是本次送出的說明:

$ git

commit

-m "wrote a readme file"

3、修改檔案

1)成功添加并送出readme.txt檔案,修改readme.txt檔案如下:

運作git status指令檢視目前倉庫狀态:

上面的指令告訴我們,readme.txt被修改過,但還沒有送出。git diff指令告訴我們readme.txt被修改的具體内容:

4、版本回退

1)用git log指令檢視曆史記錄:

如輸出資訊太多,可以加上--pretty=oneline參數:

<p style="text-align: justify;">$ git log --pretty=oneline

2)把readme.txt回退到上一個版本,也就是"add distributed"的那個版本,怎麼做呢?在Git中,用HEAD表示目前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^。現在,我們要把目前版本"append GPL"回退到上一個版本"add distributed",就可以使用git reset指令:

看看readme.txt的内容是不是版本add distributed:

還可以繼續回退到上一個版本wrote a readme file,我們用git log再看看現在版本庫的狀态:

最新的那個版本append GPL已經看不到了!怎麼辦?隻要上面的指令行視窗還沒有被關掉,你就可以順着往上找啊找啊,找到那個append GPL的commit id

于是就可以指定回到未來的某個版本:

<p style="text-align: justify;">$ git re

set

--hard 9636c65

再看看readme.txt的内容:

Git的版本回退速度非常快,因為Git在内部有個指向目前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL:

然後順便把工作區的檔案更新了。是以你讓HEAD指向哪個版本号,你就把目前版本定位在哪。現在,你回退到了某個版本,關掉了電腦,想恢複到新版本怎麼辦?找不到新版本的commit id怎麼辦?在Git中,總是有後悔藥可以吃的。當你用$ git reset --hard HEAD^回退到add distributed版本時,再想恢複到append GPL,就必須找到append GPL的commit id。Git提供了一個指令git reflog用來記錄你的每一次指令:

終于舒了口氣,第二行顯示append GPL的commit id是9636c65。

5、撤銷修改

1)在readme.txt中添加了一行資訊:

突然發現最後一行沒有必須添加,想修改。如果用git status檢視一下:

Git會告訴你,git checkout -- file可以丢棄工作區的修改全部撤銷:指令中的--很重要,沒有--,就變成了"切換到另一個分支"的指令。

<p style="text-align: justify;">$ git checkout -- readme.txt

現在,看看readme.txt的檔案内容:

檔案内容果然複原了。

6、删除檔案

1)删除也是一個修改操作,先添加一個新檔案test.txt到Git并送出:

你通常直接在檔案管理器中把沒用的檔案删了,或者用rm指令删了。這個時候,Git知道你删除了檔案,是以,工作區和版本庫就不一緻了,git status指令會立刻告訴你哪些檔案被删除了:

現在你有兩個選擇,一是确實要從版本庫中删除該檔案,那就用指令git rm删掉,并且git commit:

現在,檔案就從版本庫中被删除了。

7、遠端倉庫

讀者先自己注冊個GitHub賬号。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,是以,需要設定SSH:

1)打開Shell(Windows下打開Git Bash),建立SSH Key:

把郵件位址換成你自己的郵件位址,然後使用預設值即可。如果一切順利的話,可以在使用者主目錄(上圖示橘紅色路徑查找)裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

2)登陸GitHub,打開Account settings,SSH Keys頁面:填上任意Title,在Key文本框裡粘貼id_rsa.pub檔案的内容:

點"Add Key",你就應該看到已經添加的Key:

因為GitHub需要識别出你推送的送出,而Git支援SSH協定,是以,GitHub隻要知道了你的公鑰,就可以确認隻有你自己才能推送。當然,GitHub允許你添加多個Key。

3)現在你已經在本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,并且讓這兩個倉庫進行遠端同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作。首先,登陸GitHub,然後,在右上角找到"Create a new repo"按鈕,建立一個新的倉庫:

在Repository name填入bnclearngit,其他保持預設設定,點選"Create repository"按鈕,就成功地建立了一個新的Git倉庫:

目前,在GitHub上的這個bnclearngit倉庫還是空的,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的内容推送到GitHub倉庫。

4)在本地的bnclearngit倉庫下運作指令:

<p style="text-align: justify;">$ git remote add origin [email protected]:yourGitHub/bnclearngit.git

注意

:把上面的yourGitHub替換成你自己的GitHub賬戶名。

添加後,遠端庫的名字就是origin,這是Git預設的叫法,也可以改成别的,但是origin這個名字一看就知道是遠端庫。

5)就可以把本地庫的所有内容推送到遠端庫上:

把本地庫的内容推送到遠端,用git push指令,實際上是把目前分支master推送到遠端。由于遠端庫是空的,我們第一次推送master分支時,加上了-u參數。推送成功後,在GitHub頁面中看到遠端庫的内容已經和本地一模一樣:

從現在起,隻要本地作了送出,就可以通過指令:

<p style="text-align: justify;">$ git push origin master

本地master分支最新修改推送至GitHub,你就擁有了分布式版本庫!

8、遠端倉庫克隆

這個也是非常重要的,你既可以clone自己的項目到本地,也可以在github上把有用的項目Fork到你的倉庫裡面,然後clone到本地,下來看看我們是怎麼做的吧!

clone你自己項目到本地:

現在,遠端庫已經準備好了,下一步是用指令git clone克隆一個本地庫:本示例clone自己倉庫已經存在的OracleCluste

<p style="text-align: justify;">$ git clone [email protected]:yougithub/OracleCluste

clone其他人源碼,首先選中項目Fore,後面步驟就是本地clone啦

9、版本号管理

1)敲指令git tag 就可以打一個新标簽:

<p style="text-align: justify;">$ git tag v1.0

可以用指令git tag檢視所有标簽:

預設标簽是打在最新送出的commit上的。有時候,如果忘了打标簽,怎麼辦?方法是找到曆史送出的commit id,然後打上就可以了:

<p style="text-align: justify;">$ git log --pretty=oneline --abbrev-commit

比方說要對append GPL這次送出打标簽,它對應的commit id是9636c65:

<p style="text-align: justify;">$ git tag v0.99636c65

再用指令git tag檢視标簽:

注意

:标簽不是按時間順序列出,而是按字母排序的。可以用git show 檢視标簽資訊:

可以看到,v0.9确實打在append GPL這次送出上。還可以建立帶有說明的标簽,用-a指定标簽名,-m指定說明文字:

<p style="text-align: justify;">$ git tag -a v0.1 -m "version 0.1 released"9636c65

用指令git show 可以看到說明文字:

<p style="text-align: justify;">$ git show v0.1

如果标簽打錯了,也可以删除:

<p style="text-align: justify;">$ git tag -d v0.1

因為建立的标簽都隻存儲在本地,不會自動推送到遠端。是以,打錯的标簽可以在本地安全删除。如果要推送某個标簽到遠端,使用指令git push origin :

<p style="text-align: justify;">$ git push origin v1.0

或者,一次性推送全部尚未推送到遠端的本地标簽:

<p style="text-align: justify;">$ git push origin --tags

如果标簽已經推送到遠端,删除遠端标簽就麻煩一點,先從本地删除:

<p style="text-align: justify;">$ git tag -d v0.9

然後,從遠端删除。删除指令也是push,但是格式如下:

<p style="text-align: justify;">$ git push origin :refs/tags/v0.9

要看看是否真的從遠端庫删除了标簽,可以登陸GitHub檢視。

10、配置别名

有沒有經常敲錯指令?比如git status?status這個單詞真心不好記。如果敲git st就表示git status那就簡單多了,當然這種偷懶的辦法我們是極力贊成的。我們隻需要敲一行指令,告訴Git,以後st就表示status:

<p style="text-align: justify;">$ git config --global

alias

.st status

還有别的指令可以簡寫,用co表示checkout,ci表示commit等:

?

1

2

3

4

5

6

7

$ git config --global alias.co checkout

$ git config --global alias.ci commit

$ git config --global alias.br branch

$ git config --global alias.unstage 'reset HEAD'

<p style="text-align: justify;"> 

配置檔案:

配置Git的時候,加上--global是針對目前使用者起作用的,如果不加,那隻針對目前的倉庫起作用。配置檔案放哪了?每個倉庫的Git配置檔案都放在.git/config檔案中:

<p style="text-align: justify;">$ cat .git/config

11、搭建Git伺服器

GitHub就是一個免費托管開源代碼的遠端倉庫。但是對于某些視源代碼如生命的商業公司來說,既不想公開源代碼,又舍不得給GitHub交保護費,那就隻能自己搭建一台Git伺服器作為私有倉庫使用。搭建Git伺服器需要準備一台運作Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt指令就可以完成安裝。假設你已經有sudo權限的使用者賬号,下面,正式開始安裝。

1)安裝git:$ su

do

apt-

get

install git

2)建立一個git使用者,用來運作git服務:$ su

do

adduser git

3)建立證書登入:收集所有需要登入的使用者的公鑰,就是他們自己的id_rsa.pub檔案,把所有公鑰導入到/home/git/.ssh/authorized_keys檔案裡,一行一個。

4)初始化Git倉庫:先標明一個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入指令:

<p style="text-align: justify;">$ su

do

git init --bare sample.git

Git就會建立一個裸倉庫,裸倉庫沒有工作區,因為伺服器上的Git倉庫純粹是為了共享,是以不讓使用者直接登入到伺服器上去改工作區,并且伺服器上的Git倉庫通常都以.git結尾。然後,把owner改為git:

<p style="text-align: justify;">$ su

do

chown -R git:git sample.git

5)禁用shell登入:出于安全考慮,第二步建立的git使用者不允許登入shell,這可以通過編輯/etc/passwd檔案完成。找到類似下面的一行:

<p style="text-align: justify;">git:x:1001:1001:,,,:/home/git:/bin/bash

<p style="text-align: justify;">改為:

<p style="text-align: justify;">git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

這樣,git使用者可以正常通過ssh使用git,但無法登入shell,因為我們為git使用者指定的git-shell每次一登入就自動退出。

6)克隆遠端倉庫:現在,可以通過git clone指令克隆遠端倉庫了,在各自的電腦上運作:

<p style="text-align: justify;">$ git clone git@server:/srv/sample.git

<p style="text-align: justify;">Cloning into 'sample'...

<p style="text-align: justify;">warning:You appear to have cloned an empty repository.

管理公鑰:

如果團隊很小,把每個人的公鑰收集起來放到伺服器的/home/git/.ssh/authorized_keys檔案裡就是可行的。如果團隊有幾百号人,就沒法這麼玩了,這時,可以用Gitosis來管理公鑰。這裡我們不介紹怎麼玩Gitosis了,幾百号人的團隊基本都在500強了,相信找個高水準的Linux管理者問題不大。

管理權限:

有很多不但視源代碼如生命,而且視員工為竊賊的公司,會在版本控制系統裡設定一套完善的權限控制,每個人是否有讀寫權限會精确到每個分支甚至每個目錄下。因為Git是為Linux源代碼托管而開發的,是以Git也繼承了開源社群的精神,不支援權限控制。不過,因為Git支援鈎子(hook),是以,可以在伺服器端編寫一系列腳本來控制送出等操作,達到權限控制的目的。Gitolite就是這個工具。這裡我們也不介紹Gitolite了,不要把有限的生命浪費到權限鬥争中。

GitHub 教程系列文章

: 

通過GitHub建立個人技術部落格圖文詳解  http://www.linuxidc.com/Linux/2015-02/114121.htm

GitHub 使用教程圖文詳解  http://www.linuxidc.com/Linux/2014-09/106230.htm 

使用 GitHub / GitLab 的 Webhooks 進行網站自動化部署  http://www.linuxidc.com/Linux/2016-06/131993.htm

多個GitHub帳号的SSH key切換 http://www.linuxidc.com/Linux/2016-05/131080.htm

如何在同一台電腦上使用兩個GitHub賬戶 http://www.linuxidc.com/Linux/2016-05/131079.htm

利用GitHub搭建個人Maven倉庫  http://www.linuxidc.com/Linux/2016-04/130197.htm

一分鐘認識GitHub http://www.linuxidc.com/Linux/2015-11/125089.htm

分享實用的GitHub 使用教程

http://www.linuxidc.com/Linux/2014-04/100556.htm