git入門(版本控制)

在正式開始之前

windows用戶,你需要先安裝好Git Bash
你還需要了解一些基本的Git Bash命令行操作

這是我總結的一些基本Git Bash命令行操作
http://www.itdecent.cn/p/f318276bf6f2

在本地體驗版本比較

我們先在桌面上創(chuàng)建一個example文件夾方便進行后續(xù)試驗。
接下來我們在這個example文件夾里,創(chuàng)建version_1.txt,version_2.txt兩個文件,文件內(nèi)的內(nèi)容不同

diff

different】版本比較。比較兩個版本的文件之間的不同

$ diff version_1.txt version_2.txt
2c2
< I am version 1.
---
> I am version 2.

得到了兩個文件之間存在不同的兩行字

推薦下載sublime text作為文本編輯器

這里不介紹sublime text的具體安裝和配置,網(wǎng)上有相應教程

安裝配置完后,在Git Bash中輸入:

$ sublime_text

即可代開sublime_text進行文本編輯

還可以用sublime_text打開特定文件

$ sublime_text desktop/example/version_1.txt



正式開始

git

依然以桌面下的example文件夾作為我們的實驗文件夾,把之前試驗用的文件刪除。創(chuàng)建新的version_1.txt,內(nèi)容如下:

$ cd desktop/example

-a是all的意思,顯示全部

$ ls -a

得到當前目錄(桌面下的example文件夾)下的包含所有文件和路徑的列表

./  ../  version_1.txt

git init

git initialization,在當前文件夾下建立.git文件,相當于在當前文件夾里建立了跟蹤文件的倉庫

$ git init
Initialized empty Git repository in C:/Users/SUNING/Desktop/example/.git/

打開當前文件夾可以看到(請設置成顯示隱藏文件)

本地版本修改并放到本地倉庫中

git add

【git add】add添加。添加要跟蹤的文件

$ git add version_1.txt

git status

【git status】status狀態(tài)。查看git的狀態(tài)

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   version_1.txt

No commits yet顯示還沒有提交,但是 new file: version_1.txt顯示已經(jīng)添加version_1.txt為要跟蹤的文件了

git commit

【git commit】commit提交。將目標文件提交到本地倉庫中
在使用commit之前你需要先配置一下你的默認文本編輯器,我嘗試使用sublime text作為默認文本編輯器但是commit后會報錯,在這里推薦繼續(xù)使用nano

$ git config --global core.editor "nano"

再執(zhí)行git commit

$ git commit

會彈出nano文本編輯器,第一行的文字要對你提交的版本進行說明,這里我輸入了Add my init commit(習慣來說,都要使用英文,并且第一個單詞為動詞)。ctrl + o保存,ctrl + x退出

得到結果

[master (root-commit) 3b837c7] Add my init commit
 1 file changed, 5 insertions(+)
 create mode 100644 version_1.txt

接下來,我們對我們的version_1.txt文件進行更改、保存,就又可以重新commit了

$ git add version_1.txt
$ git commit

得到

[master 63a2ec8] Upgrade to version 2
 1 file changed, 1 insertion(+), 1 deletion(-)

意思是一個文件發(fā)生改變,一個文件被添加,一個文件被刪除

查看各版本文件的提交日志(版本控制的作用開始顯現(xiàn))

git log

【git log】LOG是日志的意思。查看日志。

$ git log

我們可以看到我們兩次的版本提交,還能看到我們每次書寫的版本說明。

commit 63a2ec88ba2af431fc00075593e792e2d70828a7 (HEAD -> master)
Author: UJ 
Date:   Thu Oct 17 16:22:29 2019 +0800

    Upgrade to version 2

commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ 
Date:   Thu Oct 17 16:14:36 2019 +0800

    Add my init commit

git diff

【git different】different不同。比較文件間的不同
接下來我們可以把兩個版本的摘錄下來進行比較(關注到上面每個版本都有一長串數(shù)字和字母組成的編碼,這個編碼可以供給我們對相應版本的文件進行比較)

$ git diff 241a02153d30d5dcf88df0c1cb54a98c09f1aedc 63a2ec88ba2af431fc00075593e792e2d70828a7 

(大家可以試試把兩長串編碼位置互換,看看運行差異。git diff 63a2ec88ba2af431fc00075593e792e2d70828a7 241a02153d30d5dcf88df0c1cb54a98c09f1aedc)

得到

diff --git a/version_1.txt b/version_1.txt
index 18cb40d..297782d 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
 I
 am
 version
-1
+2

意思是version后面的字符,減少了個“1”(原版本),增加了個“2”(新版本)

為什么要add之后再commit呢?

這里涉及到了git的工作機制
https://git-scm.com/about/staging-area

working directory本地
staging area暫存區(qū)
repository倉庫
git add命令:將本地文件存儲到暫存區(qū)
git commit命令:將暫存區(qū)文件存儲到倉庫

接下來做個小實驗理解一下這個過程

修改本地文件并保存


此時

$ git add version_1.txt

此時

$ git commit

此時


再改

此時


比較本地和暫存區(qū)

$ git diff
diff --git a/version_1.txt b/version_1.txt
index 97c002e..7fc0e1f 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
 I
 am
 version
-3
+4

可以發(fā)現(xiàn),本地是4,暫存區(qū)是3,存在區(qū)別

比較暫存區(qū)和倉庫

$ git add version_1.txt
$ git diff --staged
diff --git a/version_1.txt b/version_1.txt
index 97c002e..7fc0e1f 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
 I
 am
 version
-3
+4

好了測試好多遍了,大家應該對機制有了比較清晰的了解了吧?我們把最新版本version4 commit上去吧。

$ git commit



前面之所以講得這么啰嗦,是想讓大家理解其中的機制,如果大家能很好地理解前面的機制,后面的重點就會得心應手

后面是重點

后面是重點

后面是重點



git reset

假設你的本地文件變得亂七八糟

$ git reset --hard
HEAD is now at d504e89 Upgrade to version 4

再打開你本地的version_1.txt看看,又回來了?。?!

甚至你把本地壞掉的文件add到了暫存區(qū),使用上述命令仍然可以回到倉庫最新的版本

我們不僅能回到倉庫你的最新版本,我們還可以回到倉庫里的任何版本?。。?/h1>

https://blog.csdn.net/ysl19910806/article/details/89349697

打開日志

$ git log
commit d504e89510fc210c3be567648eaa578373879623 (HEAD -> master)
Author: UJ 
Date:   Thu Oct 17 17:38:59 2019 +0800

    Upgrade to version 4

commit e8bc851c9e7df062e505d3886382c5357e2fd11b
Author: UJ
Date:   Thu Oct 17 17:19:23 2019 +0800

    Upgrade to version 3

commit 63a2ec88ba2af431fc00075593e792e2d70828a7
Author: UJ 
Date:   Thu Oct 17 16:22:29 2019 +0800

    Upgrade to version 2

commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ 
Date:   Thu Oct 17 16:14:36 2019 +0800

    Add my init commit

我們選取最先前創(chuàng)建的版本的commit號碼 241a02153d30d5dcf88df0c1cb54a98c09f1aedc

$ git reset --hard 241a02153d30d5dcf88df0c1cb54a98c09f1aedc

我們居然回到了版本 1 ?。?!

好吧太刺激了,我們回到版本4吧!
但是當我執(zhí)行

$ git log
commit 3b837c7b22c29338d366b5b14494b5ad29878c56 (HEAD -> master)
Author: UJ
Date:   Thu Oct 17 16:01:01 2019 +0800

    Add my init commit

我的版本四呢?版本四呢,怎么除了第一個版本全不見了?玩大了,這下玩大了!......別擔心

git reflog

https://blog.csdn.net/DDD_QQQ/article/details/95485626
https://ask.csdn.net/questions/666490

git reflog能顯示你的所有操作

$ git reflog
3b837c7 (HEAD -> master) HEAD@{0}: reset: moving to 3b837c7b22c29338d366b5b14494b5ad29878c56
d504e89 HEAD@{1}: reset: moving to d504e89
3b837c7 (HEAD -> master) HEAD@{2}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{3}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{4}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{5}: reset: moving to 3b837c7b22c29338d366b5b14494b5ad29878c56
d504e89 HEAD@{6}: reset: moving to HEAD
d504e89 HEAD@{7}: reset: moving to HEAD
d504e89 HEAD@{8}: commit: Upgrade to version 4
e8bc851 HEAD@{9}: reset: moving to HEAD
e8bc851 HEAD@{10}: commit: Upgrade to version 3
63a2ec8 HEAD@{11}: commit: Upgrade to version 2
241a021 HEAD@{12}: commit: Add my init commit
a0467a6 HEAD@{13}: commit: Add my init commit
3b837c7 (HEAD -> master) HEAD@{14}: commit (initial): Add my init commit

我們回到Upgrade to version 4的操作,它對應的ID為d504e89(這也可以看出為什么我們要認真寫每個版本commit的說明)

$ git reset --hard d504e89
HEAD is now at d504e89 Upgrade to version 4

現(xiàn)在再打開version_1.txt看看,再執(zhí)行git log看看

$ git log
commit d504e89510fc210c3be567648eaa578373879623 (HEAD -> master)
Author: UJ 
Date:   Thu Oct 17 17:38:59 2019 +0800

    Upgrade to version 4

commit e8bc851c9e7df062e505d3886382c5357e2fd11b
Author: UJ 
Date:   Thu Oct 17 17:19:23 2019 +0800

    Upgrade to version 3

commit 63a2ec88ba2af431fc00075593e792e2d70828a7
Author: UJ 
Date:   Thu Oct 17 16:22:29 2019 +0800

    Upgrade to version 2

commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ 
Date:   Thu Oct 17 16:14:36 2019 +0800

    Add my init commit

commit a0467a67f0fcc940457bfba113ca8b22ca8aa0f7
Author: UJ 
Date:   Thu Oct 17 16:10:11 2019 +0800

    Add my init commit

commit 3b837c7b22c29338d366b5b14494b5ad29878c56
Author: UJ 
Date:   Thu Oct 17 16:01:01 2019 +0800

    Add my init commit

全都回來了

想要了解更多,可以瀏覽git的官方文檔

https://git-scm.com/doc

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容