一:安裝git
1.1.linux安裝
1、安裝git依賴包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
2、删除已有的git
yum remove git
3、下載下傳git源碼
切換到你的封包件存放目錄下
cd /usr/src
下載下傳git安裝包
wget
https://www.kernel.org/pub/software/scm/git/git-2.8.3.tar.gz解壓git安裝包
tar -zxvf git-2.8.3.tar.gz
cd git-2.8.3
配置git安裝路徑
./configure prefix=/usr/local/git/
編譯并且安裝
make && make install
檢視git版本号
git --version
git已經安裝完畢
4、将git指令添加到bash中
vi /etc/profile
在最後一行加入
export PATH=$PATH:/usr/local/git/bin
讓該配置檔案立即生效
source /etc/profile
1.2.windows安裝
官網
https://git-scm.com/downloads下載下傳安裝即可。
二:建立版本庫
1.建立目錄
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
2.目錄變成Git可以管理的倉庫
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現目前目錄下多了一個
.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的檔案,不然改亂了,就把Git倉庫給破壞了。
3.建立檔案
#vi ./learngit/readme.txt
3.添加檔案到版本庫
第一步,用指令
git add
告訴Git,把檔案添加到倉庫,檔案readme.txt從工作區被送出到暫存區,但此時檔案并沒有真正進入到版本庫當中,檔案目前隻處于一個中間狀态。
git add readme.txt
第二步,用指令
git commit
告訴Git,把檔案送出到倉庫
git commit
指令,
-m
後面輸入的是本次送出的說明,可以輸入任意内容,當然最好是有意義的,這樣你就能從曆史記錄裡友善地找到改動記錄。
這個指令将處于中間狀态的檔案(暫存區的檔案)送出到版本庫中,這時才算真正完成了一次送出過程。
#git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

三:遠端倉庫
在繼續閱讀後續内容前,請自行注冊GitHub賬号。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,是以,需要一點設定:
3.1.ssh_key
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有
id_rsa
和
id_rsa.pub
這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
你需要把郵件位址換成你自己的郵件位址,然後一路回車,使用預設值即可,由于這個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
檔案的内容:
點“Add Key”,你就應該看到已經添加的Key:
為什麼GitHub需要SSH Key呢?因為GitHub需要識别出你推送的送出确實是你推送的,而不是别人冒充的,而Git支援SSH協定,是以,GitHub隻要知道了你的公鑰,就可以确認隻有你自己才能推送。
當然,GitHub允許你添加多個Key。假定你有若幹電腦,你一會兒在公司送出,一會兒在家裡送出,隻要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。
最後友情提示,在GitHub上免費托管的Git倉庫,任何人都可以看到喔(但隻有你自己才能改)。是以,不要把敏感資訊放進去。
如果你不想讓别人看到Git庫,有兩個辦法,一個是交點保護費,讓GitHub把公開的倉庫變成私有的,這樣别人就看不見了(不可讀更不可寫)。另一個辦法是自己動手,搭一個Git伺服器,因為是你自己的Git伺服器,是以别人也是看不見的。這個方法我們後面會講到的,相當簡單,公司内部開發必備。
確定你擁有一個GitHub賬号後,我們就即将開始遠端倉庫的學習。
現在的情景是,你已經在本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,并且讓這兩個倉庫進行遠端同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。
3.2從遠端庫克隆
首先,登陸GitHub,建立一個新的倉庫,名字叫
gitskills
:
我們勾選
Initialize this repository with a README
,這樣GitHub會自動為我們建立一個
README.md
檔案。建立完畢後,可以看到
README.md
檔案:
現在,遠端庫已經準備好了,下一步是用指令
git clone
克隆一個本地庫:
$ git clone [email protected]:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
注意把Git庫的位址換成你自己的,然後進入
gitskills
目錄看看,已經有
README.md
檔案了:
$ cd gitskills
$ ls
README.md
3.3.送出版本
首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,建立一個新的倉庫:
在Repository name填入
learngit
,其他保持預設設定,點選“Create repository”按鈕,就成功地建立了一個新的Git倉庫:
目前,在GitHub上的這個
learngit
倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的内容推送到GitHub倉庫。
現在,我們根據GitHub的提示,在本地的
learngit
倉庫下運作指令:
$ git remote add origin [email protected]:michaelliao/learngit.git
請千萬注意,把上面的
michaelliao
替換成你自己的GitHub賬戶名,否則,你在本地關聯的就是我的遠端庫,關聯沒有問題,但是你以後推送是推不上去的,因為你的SSH Key公鑰不在我的賬戶清單中。
添加後,遠端庫的名字就是
origin
,這是Git預設的叫法,也可以改成别的,但是
origin
這個名字一看就知道是遠端庫。
下一步,就可以把本地庫的所有内容推送到遠端庫上:
#git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'
把本地庫的内容推送到遠端,用
git push
指令,實際上是把目前分支
master
推送到遠端。
由于遠端庫是空的,我們第一次推送
master
分支時,加上了
-u
參數,Git不但會把本地的
master
分支内容推送的遠端新的
master
分支,還會把本地的
master
分支和遠端的
master
分支關聯起來,在以後的推送或者拉取時就可以簡化指令。
四:版本回退
git log
指令顯示從最近到最遠的送出日志,我們可以看到3次送出,最近的一次是
append GPL
,上一次是
add distributed
,最早的一次是
wrote a readme file
# git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <[email protected]>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <[email protected]>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <[email protected]>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
回退到上個版本
#git reset --hard HEAD^
回退到曆史版本
#git reset --hard HEAD^
跳到指定版本
id号不用寫全,前幾位即可
#git reset --hard 1094
五:狀态對比:
1.狀态檢視
#git status
On branch master
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
no changes added to commit (use "git add" and/or "git commit -a")
git status
指令可以讓我們時刻掌握倉庫目前的狀态,上面的指令輸出告訴我們,
readme.txt
被修改過了,但還沒有準備送出的修改。
2.不同對比
已經記不清上次怎麼修改的
readme.txt
,是以,需要用
git diff
這個指令看看
# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
六: 撤銷本機上修改
#git checkout -- readme.txt
指令
git checkout -- readme.txt
意思就是,把
readme.txt
檔案在工作區的修改全部撤銷,這裡有兩種情況:
一種是
readme.txt
自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀态;
readme.txt
已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀态。
七:分支
7.1.建立與合并分支
檢視分支:
git branch
建立分支:
git branch <name>
切換分支:
git checkout <name>
建立+切換分支:
git checkout -b <name>
合并某分支到目前分支:
git merge <name>
删除分支:
git branch -d <name>
八:标簽
- 指令
用于建立一個标簽,預設為git tag <tagname>
,也可以指定一個commit id;HEAD
-
可以指定标簽資訊;git tag -a <tagname> -m "blablabla..."
-
可以檢視所有标簽。git tag
-
可以推送一個本地标簽;git push origin <tagname>
-
可以推送全部未推送過的本地标簽;git push origin --tags
-
可以删除一個本地标簽;git tag -d <tagname>
-
可以删除一個遠端标簽。git push origin :refs/tags/<tagname>