Git從入門到學會


Git簡介

Git是什么?

Git和SVN一樣都是一種高效的管理代碼的系統。

Git是目前世界上最先進的分布式版本控制系統(沒有之一)。

創建版本庫

什么是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

第一步,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄:

$ mkdir text
$ cd text/

第二步,通過git init命令把這個目錄變成Git可以管理的倉庫:

$ git init
Initialized empty Git repository in F:/text/.git/

瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了,就把Git倉庫給破壞了。

把文件添加到版本庫

為了能夠更好地利用Git,我們就需要把我們自己的代碼放到Git倉庫中,讓Git倉庫更好的進行管理,我們既可以直接在我們新建好的倉庫中直接生成代碼文件,也可以把我們寫好的代碼文件拖動到這個我們新建的Git倉庫中,然而此時只是單單的把我們的代碼放到了Git倉庫中的工作區中,而非真正的交由Git進行管理,所以我們還需要進行下面幾步。

$ vim readme.txt      #新建一個文件

第一步,用命令git add告訴Git,把文件添加到暫存區:

$ git add readme.txt

第二步,用命令git commit告訴Git,把文件提交到倉庫:

$ git commit -m "creat new project"

簡單解釋一下git commit命令,-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。

小結

現在總結一下今天學的兩點內容:

初始化一個Git倉庫,使用git init命令。

添加文件到Git倉庫,分兩步:

  • 第一步,使用命令git add <file>,注意,可反復多次使用,添加多個文件;

  • 第二步,使用命令git commit,完成。

文件狀態

git status命令可以讓我們時刻掌握倉庫當前的狀態

1、代碼未add前,在工作區的狀態

2、代碼經過add,把文件添加到暫存區以后

3、用命令git commit告訴Git,把文件提交到倉庫以后

雖然Git告訴我們readme.txt被修改了(沒有add以及commit以前,只是簡單的修改了代碼),但如果能看看具體修改了什么內容,自然是很好的。比如你休假兩周從國外回來,第一天上班時,已經記不清上次怎么修改的readme.txt,所以,需要用git diff這個命令看看:

版本回退

版本回退是在你編寫代碼的過程中,由於出現了某種錯誤,而需要返回上一個版本的情況。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個commit恢復,然后繼續工作,而不是把幾個月的工作成果全部丟失。

我們每次commit都會生成一個新的版本,在實際工作中,我們腦子里不可能記得一個幾千行的文件每次都改了什么內容,不然要版本控制系統干什么。版本控制系統肯定有某個命令可以告訴我們歷史錄

1、在Git中,我們用git log命令查看:

2、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參數的意義就是可以讓你看到當前的版本回退的位置

3、還有一個問題就是如果你已經實現了版本的回退,然而我發現並不是我代碼的問題,我回退錯了,我不想回退了,或者是我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 addgit commit,也可以別着急提交第一次修改,先git add第二次修改,再git commit,就相當於把兩次修改合並后一塊提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

小結

現在,你又理解了Git是如何跟蹤修改的,每次修改,如果不add到暫存區,那就不會加入到commit中。

撤銷修改

1、如果當你修改了代碼,然后又發現修改錯誤以后,想撤銷前面的操作的時候該怎么辦呢?

既然錯誤發現得很及時,就可以很容易地糾正它。你可以刪掉最后一行,手動把文件恢復到上一個版本的狀態。如果用git status查看一下:

你可以發現,Git會告訴你,git checkout -- file可以丟棄工作區的修改:

2、如果當你修改了代碼,已經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

1、如果你選擇的事HTTPS的數據傳輸方式的話,無需任何復雜的操作,直接利用git clone + 倉庫地址,就能把遠程倉庫中的代碼下載到本地

2、如果你使用HHS方式傳輸的話,就需要涉及到秘鑰的問題了

第1步:創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsaid_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:

$ ssh-keygen.exe   #后面的選項直接回車就可以

這樣就在就在你的用戶目錄下生成一個.SSH文件夾,里面有id_rsaid_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倉庫。

$ 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推送到遠程。

從現在起,只要本地作了提交,就可以通過命令:

$ git push origin master

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM