Git和Github簡單教程

原文鏈接:Git和Github簡單教程


網絡上關於Git和GitHub的教程不少,但是這些教程有的命令太少不夠用,有的命令太多,使得初期學習的時候需要額外花不少時間在一些當前用不到的命令上。
這篇文章主要的目標是用較少的時間學習Git和GitHub的基本使用。在足夠一般使用的前提下,儘量減少命令。
如果需要其他命令,到時候再去其他地方瞭解就行了。


目錄:


零、Git是什麼

我纔不告訴你嘞


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

  1. 版本:
    想想你平時用的軟件,在軟件升級之後,你用的就是新版本的軟件。你應該見過這樣的版本號:v2.0或者 1511(表示發佈時爲15年11月),如下圖:
    809218-20160604213745539-478220006.png
    那麼如果你修改並保存了一個文件,從版本管理的角度來說,你得到的是這個文件的新版本。
    可是很多情況下,這種修改是不可逆的。你修改完之後,無法回到你修改前的樣子。爲了避免這種情況,有的人會把新版本的內容保存到一個新的文件裏面。
    比如在一個名爲“畢業論文”的文件夾內,他有以下文件:
    809218-20160604213801133-863207766.png
    就在這時,他女朋友發了一份畢業論文_完成2.doc,這是女朋友幫他改的一篇論文。可是已經經過那麼多的修改,又不知道對方改了哪些,怎麼合併呢?看來只好開始了繁重的對照以及修改的工作……
    809218-20160508131508421-1485054742.jpg
    更加實際的例子是程序員寫程序的時候:
    809218-20160604213816196-183384611.png
    這時候你需要一款軟件幫你管理版本,它就是Git。

  2. 控制:
    你可以用Git來對這些不同的版本進行控制。還可以很方便地查看兩個不同版本之間的不同之處。
    ——使用Git,你只保存最新的一份文件就可以了。
    ——那我以前的文件怎麼辦?
    ——可以用Git幫你把文件回退到你想要的版本。
    ——如果回去了,那我的最新版本呢?
    ——還可以還原。


二、概覽

所有命令前都要加 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 "提交信息"提交信息最好能體現更改了什麼
刪除未trackedclean -xf刪除當前目錄下所有沒有track過的文件。不管它是否是.gitignore文件裏面指定的文件夾和文件
查看提交記錄log查看當前版本及之前的commit記錄

reflogHEAD的變更記錄
版本回退reset --hard 版本號回退到指定版本號的版本,該版本之後的修改都被刪除。同時也是通過這個命令回到最新版本。需要reflog配合

2.個人使用遠程倉庫

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

可以用一張圖直觀地看出以上主要的命令對倉庫的影響。
809218-20160604213832164-1203726937.png
圖片引用自:Git introduction for CVS/SVN/TFS users

809218-20160604213850274-1309981476.jpg
圖片引用自:工作區和暫存區 - 廖雪峯的官方網站 (做了點修改)

對照查看兩張圖:

  • workspace 即工作區,邏輯上是本地計算機,還沒添加到repository的狀態;

  • staging 即版本庫中的stage,是暫存區。修改已經添加進repository,但還沒有作爲commit提交,類似於緩存;

  • Local repository 即版本庫中master那個地方。到這一步纔算是成功生成一個新版本;

  • Remote repository 則是遠程倉庫。用來將本地倉庫上傳到網絡,可以用於備份、共享、合作。本文將使用Github作爲遠程倉庫的例子。


三、Git for Windows軟件安裝

809218-20161203000226318-877439216.png
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]開始,默認添加環境變量,所以環境變量部分就不用再手動配置了。(這句可以無視)


四、本地Git的使用

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

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

1.新的倉庫-》初始化

運行 git init 來初始化倉庫,如下圖:
809218-20160604213940508-828815164.png

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


2.文件的添加和提交

我在這個文件夾裏面創建了一個 today.txt 的文件。並且不要臉地祝自己兒童節快樂:

809218-20160604213956149-723619418.png

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

809218-20160604214005055-1866468380.png

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

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

809218-20160604214016508-253679176.png

嗯,什麼提示都沒有。沒關係,我們再次使用 git status :

809218-20160604214024992-260849170.png

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

809218-20160604214038492-1522093568.png

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

809218-20160604214048071-1516052651.png

這樣第一步就完成了。

也許你會奇怪:爲什麼要有一個add,直接commit不就行了?這是因爲stage有很多用處,具體可以去查找相關資料。這裏就算不了解問題也不大。

3.文件的修改

接着我修改文件內容。改成祝大家兒童節快樂好了 (~ ̄▽ ̄)~

809218-20160604214108227-292232158.png

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

809218-20160604214116571-1026727305.png

這和之前的提示不一樣了。之前是這個:

809218-20160604214132992-1418825706.png

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

現在我們通過git看看文件做了哪些變化,執行 git diff :

809218-20160604214145649-1116632145.png

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

  • 你忘記改了什麼,又想知道

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

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

809218-20160604214206821-1921800298.png

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

809218-20160604214215774-1596938603.png

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

809218-20160604214227930-813645920.png

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

809218-20160604214241102-284859029.png

接着:
git add -A
git commit -m "將[自己]改爲[米娜桑]"

809218-20160604214257633-193132615.png

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

809218-20160604214311758-175378236.png

嗯。現在有兩個提交了。

4.版本回退!

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

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

809218-20160604214321555-282676581.png

.git 文件夾因爲本來就是隱藏的,我在關了 顯示隱藏的項目 的選項後,它就不顯示了。
現在看到的是隻有一個文件,而且是最新的一個版本。

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

從剛纔的 git log :

809218-20160604214311758-175378236.png

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

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

809218-20160604215412196-1252165674.png

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

809218-20160604214419821-1776623416.png

其內容:

809218-20160604214429133-794948365.png

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

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

現在再執行 git log :

809218-20160604214442242-370029640.png

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

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

809218-20160604214451727-1120509429.png

可以看到HEAD的變化情況。
第一行表示當前HEAD所在的版本號是 1df0573 ,而之所以在這個版本號,是由於我們執行了reset命令。
看第二行,它告訴我們,這個HEAD所在的版本號是 ad93b89 ,這個版本號是在執行commit之後形成的。

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

git reset --hard ad93b89git log

809218-20160604214514571-1686368650.png

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

809218-20160604214526321-588410549.png

5.清除未追蹤的文件

通常在reset或者pull(後面會講)之前要做兩件事:

  • 將新添加且爲追蹤的文件刪除掉(比如編譯程序後所產生的文件)

  • 已追蹤的文件已有修改,但又不需要這些修改,則將它們還原

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

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

809218-20160604214540008-1448402387.png

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

809218-20160604214601305-1764138916.png

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

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

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

809218-20170113144122025-2131985383.png

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

809218-20170113144614463-158907487.png


五、Github與Git的關聯

上面的操作都是在本地計算機上產生影響的,一般也夠用了。
如果你是程序員,想和其他人分享你的代碼,或者合作開發,可以用Github。

1)本地Git和Github的連接

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

  2. 本地配置用戶名和郵箱(如果已經設置好,跳過該步):

  • git config --global user.name "你的用戶名"
    git config --global user.email "你的郵箱"
    如圖所示:
    809218-20160604214615274-442852618.png

  • 或者你直接在config文件裏改,位置在 C:\Users\你的用戶名\.gitconfig 。如下圖所示,添加相應信息:
    809218-20160604214628289-1147405553.png

生成ssh key運行 ssh-keygen -t rsa -C "你的郵箱" ,它會有三次等待你輸入,直接回車即可。將生成的ssh key複製到剪貼板,執行 clip < ~/.ssh/id_rsa.pub (或者到上圖提示的路徑裏去打開文件並複製):打開Github,進入Settings:點擊左邊的 SSH and GPG keys ,將ssh key粘貼到右邊的Key裏面。Title隨便命名即可。點擊下面的 Add SSH key 就添加成功了。測試一下吧,執行 ssh -T [email protected] :嗯,這樣就成功了!

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

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

    809218-20160604214751961-141228472.png

    接着輸入遠程倉庫名:

    809218-20160604214801899-1730149221.png

    點擊 Create repository 就創建好了。其他選項可以暫時不管。

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

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

    809218-20160604214816680-697003144.png

    有兩種方式可以關聯,一種是SSH,一種是HTTPS。由於HTTPS比較慢,所以推薦使用SSH。
    注意SSH的地址格式是這樣開頭的: [email protected]

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

    809218-20160604214829571-1197635501.png

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

    809218-20160604214838133-1236297143.png

以上關聯已經完成!

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

809218-20160604214848133-733016980.png

可以在Github上看到修改:

809218-20160604214855602-1059095970.png


六、團隊合作開發

關於團隊合作開發,我在之前已經專門用一篇文章來說明了。
原文鏈接: GitHub團隊項目合作流程

上文的目錄:

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


七、Github的其他介紹

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

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

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

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

    809218-20160604214904539-240211117.png

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

    809218-20160604214911899-487998689.png

    整個項目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


八、一些可能碰到的問題

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章