Git簡介
Git是什麼?html
Git和SVN同樣都是一種高效的管理代碼的系統。python
Git是目前世界上最早進的分佈式版本控制系統(沒有之一)。git
建立版本庫
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你能夠簡單理解成一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。github
第一步,建立一個版本庫很是簡單,首先,選擇一個合適的地方,建立一個空目錄:web
1
2
|
$ mkdir text
$ cd text
/
|
第二步,經過git init
命令把這個目錄變成Git能夠管理的倉庫:vim
1
2
|
$ git init
Initialized empty Git repository
in
F:
/
text
/
.git
/
|
瞬間Git就把倉庫建好了,並且告訴你是一個空的倉庫(empty Git repository),細心的讀者能夠發現當前目錄下多了一個.git
的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。微信
把文件添加到版本庫
爲了可以更好地利用Git,咱們就須要把咱們本身的代碼放到Git倉庫中,讓Git倉庫更好的進行管理,咱們既能夠直接在咱們新建好的倉庫中直接生成代碼文件,也能夠把咱們寫好的代碼文件拖動到這個咱們新建的Git倉庫中,然而此時只是單單的把咱們的代碼放到了Git倉庫中的工做區中,而非真正的交由Git進行管理,因此咱們還須要進行下面幾步。ssh
1
|
$ vim readme.txt
#新建一個文件
|
第一步,用命令git add
告訴Git,把文件添加到暫存區:分佈式
1
|
$ git add readme.txt
|
第二步,用命令git commit
告訴Git,把文件提交到倉庫:post
1
|
$ git commit
-
m
"creat new project"
|
簡單解釋一下git commit
命令,-m
後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。
小結
如今總結一下今天學的兩點內容:
初始化一個Git倉庫,使用git init
命令。
添加文件到Git倉庫,分兩步:
-
第一步,使用命令
git add <file>
,注意,可反覆屢次使用,添加多個文件; -
第二步,使用命令
git commit
,完成。
文件狀態
git status
命令可讓咱們時刻掌握倉庫當前的狀態
一、代碼未add前,在工做區的狀態
二、代碼通過add,把文件添加到暫存區之後
三、用命令git commit
告訴Git,把文件提交到倉庫之後
雖然Git告訴咱們readme.txt被修改了(沒有add以及commit之前,只是簡單的修改了代碼),但若是能看看具體修改了什麼內容,天然是很好的。好比你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt,因此,須要用git diff
這個命令看看:
版本回退
版本回退是在你編寫代碼的過程當中,因爲出現了某種錯誤,而須要返回上一個版本的狀況。一旦你把文件改亂了,或者誤刪了文件,還能夠從最近的一個commit
恢復,而後繼續工做,而不是把幾個月的工做成果所有丟失。
咱們每次commit都會生成一個新的版本,在實際工做中,咱們腦子裏不可能記得一個幾千行的文件每次都改了什麼內容,否則要版本控制系統幹什麼。版本控制系統確定有某個命令能夠告訴咱們歷史錄
一、在Git中,咱們用git log
命令查看:
二、git log
命令顯示從最近到最遠的提交日誌,咱們能夠看到3次提交, 若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline
參數:
須要友情提示的是,你看到的一大串相似3628164...882e1e0
的是commit id
(版本號),和SVN不同,Git的commit id
不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示,並且你看到的commit id
和個人確定不同,以你本身的爲準。爲何commit id
須要用這麼一大串數字表示呢?由於Git是分佈式的版本控制系統,後面咱們還要研究多人在同一個版本庫裏工做,若是你們都用1,2,3……做爲版本號,那確定就衝突了。
那麼到底版本回退該怎麼作呢?首先,Git必須知道當前版本是哪一個版本,在Git中,用HEAD
表示當前版本,也就是最新的提交3628164...882e1e0
(注意個人提交ID和你的確定不同),上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,固然往上100個版本寫100個^
比較容易數不過來,因此寫成HEAD~100
。
1>版本回退,就可使用git reset
命令(咱們也能夠取ID號的前幾位,而沒必要都寫上):
2>版本回退,咱們也能夠利用HEAD~x(上一個版本就是
HEAD^
,上上一個版本就是HEAD^^
,固然往上100個版本寫100個^
比較容易數不過來,因此寫成HEAD~100
。)
--hard
參數的意義就是可讓你看到當前的版本回退的位置
三、還有一個問題就是若是你已經實現了版本的回退,然而我發現並非我代碼的問題,我回退錯了,我不想回退了,或者是我Git已經關閉了,找不到新版本的commit id
怎麼辦?
Git提供了一個命令git reflog
用來記錄你的每一次命令:
這樣我就能夠經過找到新版本的commit id,進行反回退
小結
如今總結一下:
-
HEAD
指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
能夠查看提交歷史,以便肯定要回退到哪一個版本。 -
要重返將來,用
git reflog
查看命令歷史,以便肯定要回到將來的哪一個版本。
工做區和暫存區
工做區(Working Directory)
就是你在電腦裏能看到的目錄,好比個人learngit
文件夾就是一個工做區:
版本庫(Repository)
工做區有一個隱藏目錄.git
,這個不算工做區,而是Git的版本庫。
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master
,以及指向master
的一個指針叫HEAD
。
因此,git add
命令實際上就是把要提交的全部修改放到暫存區(Stage),而後,執行git commit
就能夠一次性把暫存區的全部修改提交到分支。
管理修改
Git管理的是修改,而不是文件
下面咱們就用實例來證實,首先咱們先修改一個文件,修改完之後咱們用add把文件加到暫存區中,而後在繼續修改此文件,而後再用commit進行提交,而後利用status來查看
第一次修改 -----> git add
------> 第二次修改 ----> git commit---->status
咱們能夠看到怎麼第二次的修改沒有被提交,爲何呢?
你看,咱們前面講了,Git管理的是修改,當你用git add
命令後,在工做區的第一次修改被放入暫存區,準備提交,可是,在工做區的第二次修改並無放入暫存區,因此,git commit
只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。
那怎麼提交第二次修改呢?你能夠繼續git add
再git commit
,也能夠彆着急提交第一次修改,先git add
第二次修改,再git commit
,就至關於把兩次修改合併後一塊提交了:
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
小結
如今,你又理解了Git是如何跟蹤修改的,每次修改,若是不add
到暫存區,那就不會加入到commit
中。
撤銷修改
一、若是當你修改了代碼,而後又發現修改錯誤之後,想撤銷前面的操做的時候該怎麼辦呢?
既然錯誤發現得很及時,就能夠很容易地糾正它。你能夠刪掉最後一行,手動把文件恢復到上一個版本的狀態。若是用git status
查看一下:
你能夠發現,Git會告訴你,git checkout -- file
能夠丟棄工做區的修改:
二、若是當你修改了代碼,已經add到暫存區而沒有進行commit操做的時候,想撤銷前面的操做的時候該怎麼辦呢?
Git一樣告訴咱們,用命令git reset HEAD file
能夠把暫存區的修改撤銷掉(unstage),從新放回工做區:
而後再經過第一種的狀況來想撤銷前面的操做
小結
又到了小結時間。
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
刪除文件
在Git中,刪除也是一個修改操做,咱們實戰一下,先添加一個新文件test.txt到Git而且提交:
通常狀況下,你一般直接在文件管理器中把沒用的文件刪了,或者用rm
命令刪了:
這個時候,Git知道你刪除了文件,所以,工做區和版本庫就不一致了,git status
命令會馬上告訴你哪些文件被刪除了:
如今你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm
刪掉,而且git commit
:
如今,文件就從版本庫中被刪除了。
另外一種狀況是刪錯了,由於版本庫裏還有呢,因此能夠很輕鬆地把誤刪的文件恢復到最新版本:
遠程倉庫
這個世界上有個叫GitHub的神奇的網站,從名字就能夠看出,這個網站就是提供Git倉庫託管服務的,因此,只要註冊一個GitHub帳號,就能夠免費得到Git遠程倉庫。
本地Git倉庫和GitHub倉庫之間的傳輸有倆種方式,一種是HTTPS,另外一種是HHS
一、若是你選擇的事HTTPS的數據傳輸方式的話,無需任何複雜的操做,直接利用git clone + 倉庫地址,就能把遠程倉庫中的代碼下載到本地
二、若是你使用HHS方式傳輸的話,就須要涉及到祕鑰的問題了
第1步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa
和id_rsa.pub
這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:
1
|
$ ssh
-
keygen.exe
#後面的選項直接回車就能夠
|
這樣就在就在你的用戶目錄下生成一個.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,而後你就能夠經過HHS的方式進行文件的上傳和下載了。
建立遠程倉庫
如今的情景是,你已經在本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,而且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既能夠做爲備份,又可讓其餘人經過該倉庫來協做,真是一舉多得。
建立好的倉庫
目前,在GitHub上的這個oldboy_website倉庫仍是空的,GitHub告訴咱們,能夠從這個倉庫克隆出新的倉庫,也能夠把一個已有的本地倉庫與之關聯,而後,把本地倉庫的內容推送到GitHub倉庫。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$ git remote add origin git@github.com:triaquae
/
oldboy_website.git #添加遠程倉庫
$ git push
-
u origin master
#推到遠程
The authenticity of host
'github.com (192.30.253.113)'
can't be established.
RSA key fingerprint
is
SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to
continue
connecting (yes
/
no)? yes
#第一次推會出現,寫yes
Warning: Permanently added
'github.com,192.30.253.113'
(RSA) to the
list
of known hosts.
Counting objects:
20
, done.
Delta compression using up to
8
threads.
Compressing objects:
100
%
(
14
/
14
), done.
Writing objects:
100
%
(
20
/
20
),
1.76
KiB |
0
bytes
/
s, done.
Total
20
(delta
4
), reused
0
(delta
0
)
remote: Resolving deltas:
100
%
(
4
/
4
), done.
To git@github.com:triaquae
/
oldboy_website.git
*
[new branch] master
-
> master
Branch master
set
up to track remote branch master
from
origin.
|
注意:若是這裏報以下錯誤,先刪除遠程 Git 倉庫----->$ git remote rm origin,再添加遠程 Git 倉庫
把本地庫的內容推送到遠程,用git push
命令,其實是把當前分支master
推送到遠程。
從如今起,只要本地做了提交,就能夠經過命令:
1
|
$ git push origin master
|
------------------------------未完待續-----------------------------------