關於使用Git和GitHub的教程。
原文連結:Git和Github簡單教程
原文地址:http://www.cnblogs.com/schaepher/p/5561193.html
網路上關於Git和GitHub的教程不少,但是這些教程有的命令太少不夠用,有的命令太多,使得初期學習的時候需要額外花不少時間在一些當前用不到的命令上。
這篇文章主要的目標是用較少的時間學習Git和GitHub的基本使用。在足夠一般使用的前提下,儘量減少命令。
如果需要其他命令,到時候再去其他地方瞭解就行了
目錄
零、Git是什麼
我才不告訴你嘞
一、Git的主要功能:版本控制
- 版本:
想想你平時用的軟體,在軟體升級之後,你用的就是新版本的軟體。你應該見過這樣的版本號:v2.0
1511
(表示釋出時為15年11月),如下圖:
那麼如果你修改並儲存了一個檔案,從版本管理的角度來說,你得到的是這個檔案的新版本。
可是很多情況下,這種修改是不可逆的。你修改完之後,無法回到你修改前的樣子。為了避免這種情況,有的人會把新版本的內容儲存到一個新的檔案裡面。
由於 Git 更多地用於程式碼管理,舉個程式設計師的例子。比如以下是計算機專業學生的作業:
這樣儲存多個資料夾,可能會造成混亂。你可能想儲存以前寫的程式碼,因為它們可能在以後會用到。但是更多的時候是,你不知道各個資料夾都做了什麼修改。
這時候你需要一款軟體幫你管理版本,它就是Git。 - 控制:
你可以用Git來對這些不同的版本進行控制。還可以很方便地檢視兩個不同版本之間的不同之處。
——使用Git,你只儲存最新的一份檔案就可以了。
——那我以前的檔案怎麼辦?
——可以用Git的 reset 幫你把檔案回退到你想要的版本。
——如果回去了,那我的最新版本呢?
——還可以用 reflog 和 reset 的組合來還原。
二、概覽
所有命令前都要加 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 users
圖片引用自:工作區和暫存區 - 廖雪峰的官方網站 (做了點修改)
對照檢視兩張圖:
- workspace 即工作區,邏輯上是本地計算機,還沒新增到repository的狀態;
- staging 即版本庫中的stage,是暫存區。修改已經新增進repository,但還沒有作為commit提交,類似於快取;
- Local repository 即版本庫中master那個地方。到這一步才算是成功生成一個新版本;
- Remote repository 則是遠端倉庫。用來將本地倉庫上傳到網路,可以用於備份、共享、合作。本文將使用Github作為遠端倉庫的例子。
三、Git for Windows軟體安裝
Git for Windows(又msysgit)
-
安裝包可以到官方網站
[1]
下載,或者在github[2]
下載。如果下載不下來,可以把連結複製下來用迅雷下載。如果用迅雷下載不放心,在下載完後去在github下載的那個地方檢視SHA-256值,並和下載的檔案對比,如果值一樣就可以放心使用。 -
安裝的時候一路點選
Next
就行了。 - 剛安裝完開啟後,視窗比較小。如果不太習慣,可以把它改大一些。
- 首先移到視窗右下角邊緣,出現箭頭後把視窗拉大。
- 點選視窗頂部左邊的圖示 -> Options... -> Window -> Current size -> OK
這樣以後開啟視窗都會是調整後的大小。
Git for Windows從2.8.0版本
[3]
開始,預設新增環境變數,所以環境變數部分就不用再手動配置了。(這句可以無視)
四、本地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 替換成你想要的編碼。如果是團隊專案,請確保所有成員的設定都一致。
五、Github與Git的關聯
上面的操作都是在本地計算機上產生影響的,一般也夠用了。
如果你是程式設計師,想和其他人分享你的程式碼,或者合作開發,可以用Github。
1)本地Git和Github的連線
-
到Github
[4]
註冊賬號。 - 本地配置使用者名稱和郵箱(如果已經設定好,跳過該步):
git config --global user.name "你的使用者名稱"
git config --global user.email "你的郵箱"
如圖所示:- 或者你直接在config檔案裡改,位置在
C:\Users\你的使用者名稱\.gitconfig
。如下圖所示,新增相應資訊:
- 生成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]
:
嗯,這樣就成功了!- 對於 oschina 的 “碼雲” ,執行
ssh -T [email protected]
- 對於 coding 的 “碼市” ,執行
ssh -T [email protected]
- 對於 oschina 的 “碼雲” ,執行
2)建立遠端倉庫並與本地關聯
-
建立遠端倉庫
首先是在右上角點選進入建立介面:接著輸入遠端倉庫名:
點選
Create repository
就建立好了。其他選項可以暫時不管。 -
將遠端倉庫和本地倉庫關聯起來
先到Github上覆制遠端倉庫的SSH地址:
有兩種方式可以關聯,一種是SSH,一種是HTTPS。由於HTTPS比較慢,所以推薦使用SSH。
注意SSH的地址格式是這樣開頭的:[email protected]
執行
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上看到修改:
六、團隊合作開發
關於團隊合作開發,我在之前已經專門用一篇文章來說明了。
原文連結: GitHub團隊專案合作流程
上文的目錄:
- 零、前期準備
- 一、建立開發分支
- 二、Fork專案到個人的倉庫
- 三、Clone專案到本地
- 四、和團隊專案保持同步
- 五、push修改到自己的專案上
- 六、請求合併到團隊專案上
- 七、團隊專案負責人稽核及同意合併請求
其中 零、一、七
是由團隊專案負責人來完成的。
七、Github的其他介紹
1)獲取其他人的遠端倉庫
看到別人的程式碼,想要獲取到本地計算機慢慢研究或者修改,可以用Git將其下載下來。
以我和一位同學合作的倉庫為例,連結:schaepher/blogsbackup
這是我們用來備份部落格園部落格的一個小程式,主要用於助教備份學生的部落格。
-
複製別人遠端倉庫的SSH。方法和上面關聯git一樣,進入倉庫頁面後,就能找到SSH地址。
-
整個專案42M,花了點時間才clone下來。
有一點要注意:這樣直接clone別人的倉庫後,不能push上自己的修改。
2)另一種關聯遠端空倉庫的方法
在知道了clone之後,你就可以更簡單的建立並關聯一個空倉庫了。
- 在Github上建立倉庫,上面有提到,這裡不多講
- 複製剛才建立的倉庫的SSH
- clone到本地
這樣可以不用再做關聯了。省去了上面的 init
和 git remote add origin
以及 git push -u origin master
。
3)使用GitHub的好處
- 全球最大的同♂性交友網站(逃
- (嚴肅臉)很多牛逼程式設計師和牛逼公司的開源專案都放在這上面,有豐富的資源可以學習
- 別人(如HR)可以通過你的Github大致瞭解你的水平。《怎樣花兩年時間去面試一個人》 這篇文章的後面部分講到了Github
八、一些可能碰到的問題
這篇文章基本只介紹主線操作,而在操作過程中,可能有誤操作或者其他問題。我把這些問題集中放在另一篇部落格裡面(這裡列出目錄)。這樣這篇文章不會顯得太長。