Git和Github簡單教程

原文連接:Git和Github簡單教程html


網絡上關於Git和GitHub的教程很多,可是這些教程有的命令太少不夠用,有的命令太多,使得初期學習的時候須要額外花很多時間在一些當前用不到的命令上。
這篇文章主要的目標是用較少的時間學習Git和GitHub的基本使用。在足夠通常使用的前提下,儘可能減小命令。
若是須要其餘命令,到時候再去其餘地方瞭解就好了。git


目錄:程序員


零、Git是什麼

我纔不告訴你嘞github


1、Git的主要功能:版本控制

  1. 版本:
    想一想你平時用的軟件,在軟件升級以後,你用的就是新版本的軟件。你應該見過這樣的版本號:v2.0或者 1511(表示發佈時爲15年11月),以下圖:

    那麼若是你修改並保存了一個文件,從版本管理的角度來講,你獲得的是這個文件的新版本。
    但是不少狀況下,這種修改是不可逆的。你修改完以後,沒法回到你修改前的樣子。爲了不這種狀況,有的人會把新版本的內容保存到一個新的文件裏面。
    因爲 Git 更多地用於代碼管理,舉個程序員的例子。好比如下是計算機專業學生的做業:

    這樣存儲多個文件夾,可能會形成混亂。你可能想保存之前寫的代碼,由於它們可能在之後會用到。可是更多的時候是,你不知道各個文件夾都作了什麼修改。
    這時候你須要一款軟件幫你管理版本,它就是Git。
  2. 控制:
    你能夠用Git來對這些不一樣的版本進行控制。還能夠很方便地查看兩個不一樣版本之間的不一樣之處。
    ——使用Git,你只保存最新的一份文件就能夠了。
    ——那我之前的文件怎麼辦?
    ——能夠用Git的 reset 幫你把文件回退到你想要的版本。
    ——若是回去了,那個人最新版本呢?
    ——還能夠用 reflog 和 reset 的組合來還原。

2、概覽

全部命令前都要加 git,如表中的init是指 git init
點擊命令可直接跳轉至本文第一次使用的地方。
如下命令都在命令行裏執行。面試

1.我的本地使用

行爲 命令 備註
初始化 init 在本地的當前目錄裏初始化git倉庫
  clone 地址 從網絡上某個地址拷貝倉庫(repository)到本地
查看當前狀態 status 查看當前倉庫的狀態。碰到問題不知道怎麼辦的時候,能夠經過看它給出的提示來解決問題。這個命令執行的頻率應該是其餘命令的幾倍,特別是新手
查看不一樣 diff 查看當前狀態和最新的commit之間不一樣的地方
  diff 版本號1 版本號2 查看兩個指定的版本之間不一樣的地方。這裏的版本號指的是commit的hash值
添加文件 add -A 這算是至關通用的了。在commit以前要先add
撤回修改的且還未stage的內容 checkout -- . 這裏用小數點表示撤回全部修改,在--的先後都有空格
提交 commit -m "提交信息" 提交信息最好能體現更改了什麼
刪除未tracked clean -xf 刪除當前目錄下全部沒有track過的文件。無論它是不是.gitignore文件裏面指定的文件夾和文件
查看提交記錄 log 查看當前版本及以前的commit記錄
  reflog HEAD的變動記錄
版本回退 reset --hard 版本號 回退到指定版本號的版本,該版本以後的修改都被刪除。同時也是經過這個命令回到最新版本。須要reflog配合

2.我的使用遠程倉庫

行爲 命令 備註
設置用戶名 config --global user.name "你的用戶名"  
設置郵箱 config --global user.email "你的郵箱"  
生成ssh key ssh-keygen -t rsa -C "你的郵箱" 這條命令前面不用加git
添加遠程倉庫 remote add origin 你複製的地址 設置origin
上傳並指定默認 push -u origin master 指定origin爲默認主機,之後push默認上傳到origin上
提交到遠程倉庫 push 將當前分支增長的commit提交到遠程倉庫
從遠程倉庫同步 pull 在本地版本低於遠程倉庫版本的時候,獲取遠程倉庫的commit

能夠用一張圖直觀地看出以上主要的命令對倉庫的影響。

圖片引用自:Git introduction for CVS/SVN/TFS userssql


圖片引用自:工做區和暫存區 - 廖雪峯的官方網站 (作了點修改)小程序

對照查看兩張圖:windows

  • workspace 即工做區,邏輯上是本地計算機,還沒添加到repository的狀態;
  • staging 即版本庫中的stage,是暫存區。修改已經添加進repository,但尚未做爲commit提交,相似於緩存;
  • Local repository 即版本庫中master那個地方。到這一步纔算是成功生成一個新版本;
  • Remote repository 則是遠程倉庫。用來將本地倉庫上傳到網絡,能夠用於備份、共享、合做。本文將使用Github做爲遠程倉庫的例子。

3、Git for Windows軟件安裝


Git for Windows(又msysgit)緩存

  • 安裝包能夠到官方網站[1]下載,或者在github[2]下載。若是下載不下來,能夠把連接複製下來用迅雷下載。若是用迅雷下載不放心,在下載完後去在github下載的那個地方查看SHA-256值,並和下載的文件對比,若是值同樣就能夠放心使用。網絡

  • 安裝的時候一路點擊Next就好了。

  • 剛安裝完打開後,窗口比較小。若是不太習慣,能夠把它改大一些。
    1. 首先移到窗口右下角邊緣,出現箭頭後把窗口拉大。
    2. 點擊窗口頂部左邊的圖標 -> Options... -> Window -> Current size -> OK
      這樣之後打開窗口都會是調整後的大小。

Git for Windows從2.8.0版本[3]開始,默認添加環境變量,因此環境變量部分就不用再手動配置了。(這句能夠無視)


4、本地Git的使用

這裏先不引入Github,而是在本地計算機上的操做。

打開命令行(cmd)或者在想要建立repository的地方右鍵鼠標並點擊 Git Bash Here 打開窗口。

1.新的倉庫-》初始化

運行 git init 來初始化倉庫,以下圖:

它會建立一個隱藏的文件夾 .git 這裏不去管它是用來幹嗎的。關閉windows的顯示隱藏的項目吧。


2.文件的添加和提交

我在這個文件夾裏面建立了一個 today.txt 的文件。而且不要臉地祝本身兒童節快樂:

這時我使用 git status 來查看有什麼變化:

它告訴我有一個還未追蹤的文件,並提示我可使用 git add <file>... 把它加進去。

可是我並不打算把全部命令都介紹一遍,因此我選擇使用上面概覽時所提到的 git add -A 命令。

嗯,什麼提示都沒有。不要緊,咱們再次使用 git status :

狀態變了!說明add成功。再看看它的提示 Changes to be committed ,也就是說如今能夠執行commit了。下面一行則告訴你如何將文件從stage裏移出,這裏無論。
執行 git commit -m "提交信息" 將文件提交到repository裏。提交信息用英文的雙引號括起來。

這時運行 git log 就能夠看到提交的記錄了:

這樣第一步就完成了。

也許你會奇怪:爲何要有一個add,直接commit不就好了?這是由於stage有不少用處,具體能夠去查找相關資料。這裏就算不了解問題也不大。

3.文件的修改

接着我修改文件內容。改爲祝你們兒童節快樂好了 (~ ̄▽ ̄)~

咱們用 git status 看看有什麼變化:

這和以前的提示不同了。以前是這個:

比較一下就會看到,以前的是添加新文件,當時文件還沒被追蹤(untracked),而此次是更改已經追蹤(tracked)的文件。

如今咱們經過git看看文件作了哪些變化,執行 git diff :

它默認跟最新的一個commit進行比較。
紅色(前面有減號-)表示刪除,綠色(前面有加號+)表示添加。
所以,在git看來,咱們是刪除了原來那一行,並添加了新的兩行。這在文件內容特別多的時候效果比較明顯。
這個命令在如下狀況可使用:

  • 你忘記改了什麼,又想知道
  • 別人發給你新版本,你想知道更改了什麼

注:若是你用 windows 建立 txt 文件,並用自帶文本編輯器來編輯文本,獲得的編碼是 GBK 。而 Git 讀取文件時,使用 UTF-8 無 ROM 編碼。所以會出現中文沒法正常顯示的狀況。

假如我如今想撤銷這些更改,執行 git checkout -- . 就好了:

恩,仍然沒有任何提示。執行 git status 看看:

上一個status的提示已經不見咯。再來看看文件:

果真復原了!那麼再次進行修改:

接着:
git add -A
git commit -m "將[本身]改成[米娜桑]"

用 git log 看看提交(commit)記錄:

嗯。如今有兩個提交了。

4.版本回退!

若是我寫的是一篇很長的文章,而且在以前的版本基礎上修改了一部份內容,生成一個新的commit,如今我發現我在修改的時候刪掉了一部份內容,而這部份內容是我如今須要用到的,怎麼辦?版本回退!

仍是以剛纔的文件爲例,如今我試着將文件回退到第一個commit時的狀態。但在這以前,咱們看看這個文件夾裏面的東西:

.git 文件夾由於原本就是隱藏的,我在關了 顯示隱藏的項目 的選項後,它就不顯示了。
如今看到的是隻有一個文件,並且是最新的一個版本。

文件的修改日期爲 2016\6\1 21:52

從剛纔的 git log :

咱們看到兩行黃色部分是以 commit 開頭的,後面接着一串字符。這一串字符是16進制的數,是一串哈希值。咱們叫它版本號就好了。

開始回退,執行 git reset --hard 1df0573 (取版本號前7位就能夠了):

這裏提示HEAD已經更改指向至1df0573了。此時文件:

其內容:

已經回到個人第一個版本的狀態。

這裏文件的修改日期被更改成我如今的時間 2016\6\2 19:29
這是因爲文件的修改日期是由windows修改的,由於它檢測到這個文件被修改了。而咱們剛纔從最新版本回退到如今這個版本,就像是咱們手動修改了文件內容同樣,事實上是由git來完成的。
其實能夠無論上面這一段

如今再執行 git log :

新版本的commit記錄不見了!這就是 reset --hard 的力量,很好很強硬!

如今已經看到了以前版本的內容,那麼如何回到最新版呢?
先執行 git reflog :

能夠看到HEAD的變化狀況。
第一行表示當前HEAD所在的版本號是 1df0573 ,而之因此在這個版本號,是因爲咱們執行了reset命令。
看第二行,它告訴咱們,這個HEAD所在的版本號是 ad93b89 ,這個版本號是在執行commit以後造成的。

此時我再用一次reset,將HEAD指向 ad93b89 , 同時查看log :

git reset --hard ad93b89 git log

回到第一次reset前的狀態了!

5.清除未追蹤的文件

一般在reset或者pull(後面會講)以前要作兩件事:

  • 將新添加且爲追蹤的文件刪除掉(好比編譯程序後所產生的文件)
  • 已追蹤的文件已有修改,但又不須要這些修改,則將它們還原

還原已作修改的tracked文件,上面已經講過。
如今看看如何用命令刪除新加的文件。

首先我手動建立個文件,用來演示:

用checkout是沒辦法刪除掉它的,使用 git clean -xf :

這個命令的殺傷力比較大,它刪除當前目錄下全部沒有track過的文件。無論它是不是.gitignore文件裏面指定的文件夾和文件。固然,也有殺傷力比較小的,但這裏就不介紹了。

6.關於git status中文亂碼問題

若是你的文件名是中文的,在使用git status時會亂碼。以下圖所示:

若是要使它顯示爲中文,在命令行裏執行:git config --global core.quotepath false
再使用 git status

若是 git log 也會亂碼,執行如下命令:

git config --global i18n.commitencoding utf-8 git config --global i18n.logoutputencoding utf-8

請根據須要將後面的 utf-8 替換成你想要的編碼。若是是團隊項目,請確保全部成員的設置都一致。


5、Github與Git的關聯

上面的操做都是在本地計算機上產生影響的,通常也夠用了。
若是你是程序員,想和其餘人分享你的代碼,或者合做開發,能夠用Github。

1)本地Git和Github的鏈接

  1. 到Github[4]註冊帳號。

  2. 本地配置用戶名和郵箱(若是已經設置好,跳過該步):
    • git config --global user.name "你的用戶名"
      git config --global user.email "你的郵箱"
      如圖所示:
    • 或者你直接在config文件裏改,位置在 C:\Users\你的用戶名\.gitconfig 。以下圖所示,添加相應信息:
  3. 生成ssh key
    運行 ssh-keygen -t rsa -C "你的郵箱" ,它會有三次等待你輸入,直接回車便可。

    將生成的ssh key複製到剪貼板,執行 clip < ~/.ssh/id_rsa.pub (或者到上圖提示的路徑裏去打開文件並複製):
  4. 打開Github,進入Settings:

    點擊左邊的 SSH and GPG keys ,將ssh key粘貼到右邊的Key裏面。Title隨便命名便可。

    點擊下面的 Add SSH key 就添加成功了。
    測試一下吧,執行 ssh -T git@github.com :

    嗯,這樣就成功了!

    注:
    • 對於 oschina 的 「碼雲」 ,執行 ssh -T git@git.oschina.net
    • 對於 coding 的 「碼市」 ,執行 ssh -T git@git.coding.net

2)建立遠程倉庫並與本地關聯

  1. 建立遠程倉庫
    首先是在右上角點擊進入建立界面:

    接着輸入遠程倉庫名:

    點擊 Create repository 就建立好了。其餘選項能夠暫時無論。

  2. 將遠程倉庫和本地倉庫關聯起來

    先到Github上覆制遠程倉庫的SSH地址:

    有兩種方式能夠關聯,一種是SSH,一種是HTTPS。因爲HTTPS比較慢,因此推薦使用SSH。
    注意SSH的地址格式是這樣開頭的: git@github.com

    運行 git remote add origin 你複製的地址 :

    若是你在建立 repository 的時候,加入了 README.md 或者 LICENSE ,那麼 github 會拒絕你的 push 。你須要先執行 git pull origin master

    執行 git push -u origin master 將本地倉庫上傳至Github的倉庫並進行關聯:

關聯已經完成!

之後想在commit後同步到Github上,只要直接執行 git push 就行啦:

能夠在Github上看到修改:


6、團隊合做開發

關於團隊合做開發,我在以前已經專門用一篇文章來講明瞭。
原文連接: GitHub團隊項目合做流程

上文的目錄:

其中 零、1、七 是由團隊項目負責人來完成的。


7、Github的其餘介紹

1)獲取其餘人的遠程倉庫

看到別人的代碼,想要獲取到本地計算機慢慢研究或者修改,能夠用Git將其下載下來。
以我和一位同窗合做的倉庫爲例,連接:schaepher/blogsbackup

這是咱們用來備份博客園博客的一個小程序,主要用於助教備份學生的博客。

  1. 複製別人遠程倉庫的SSH。方法和上面關聯git同樣,進入倉庫頁面後,就能找到SSH地址。

  2. 執行 git clone 複製的SSH地址

    整個項目42M,花了點時間才clone下來。

有一點要注意:這樣直接clone別人的倉庫後,不能push上本身的修改。

2)另外一種關聯遠程空倉庫的方法

在知道了clone以後,你就能夠更簡單的建立並關聯一個空倉庫了。

  1. 在Github上建立倉庫,上面有提到,這裏很少講
  2. 複製剛纔建立的倉庫的SSH
  3. clone到本地

這樣能夠不用再作關聯了。省去了上面的 init 和 git remote add origin 以及 git push -u origin master 。

3)使用GitHub的好處

  • 全球最大的同♂性交友網站(逃
  • (嚴肅臉)不少牛逼程序員和牛逼公司的開源項目都放在這上面,有豐富的資源能夠學習
  • 別人(如HR)能夠經過你的Github大體瞭解你的水平。《怎樣花兩年時間去面試一我的》 這篇文章的後面部分講到了Github

8、一些可能碰到的問題

這篇文章基本只介紹主線操做,而在操做過程當中,可能有誤操做或者其餘問題。我把這些問題集中放在另外一篇博客裏面(這裏列出目錄)。這樣這篇文章不會顯得太長。

相關文章
相關標籤/搜索