Git 版本控制管理(一)

来源:https://www.cnblogs.com/kaye/archive/2019/03/14/10529777.html
-Advertisement-
Play Games

Git 是一個分散式版本控制工具,它的作者 Linus Torvalds 是這樣給我們介紹 Git —— The stupid content tracker(傻瓜式的內容跟蹤器) 關於 Git 的產生背景在此不做講解,有興趣的可以搜索一下。 先介紹一下 Git 的特點,主要有兩大特點: 版本控制: ...


    Git 是一個分散式版本控制工具,它的作者 Linus Torvalds 是這樣給我們介紹 Git  —— The stupid content tracker(傻瓜式的內容跟蹤器)

關於 Git 的產生背景在此不做講解,有興趣的可以搜索一下。

先介紹一下 Git 的特點,主要有兩大特點:

版本控制:可以解決多人同時開發的代碼問題,也可以解決找回歷史代碼的問題。

分 布 式:Git是分散式版本控制系統,同一個Git倉庫,可以分佈到不同的機器上。首先找一臺電腦充當伺服器的角色,每天24小時開機,其他每個人都從這個“伺服器”倉庫克隆一份到自己的電腦上,並且各自把各自的提交推送到伺服器倉庫里,也從伺服器倉庫中拉取別人的提交。可以自己搭建這台伺服器,也可以使用GitHub網站。

1. Git 安裝

[root@kai ~]# yum install git -y
[root@kai ~]# git --version
git version 1.8.3.1

2.創建一個版本庫

新建一個目錄git_test,在git_test目錄下創建一個版本庫,命令如下:

[root@kai ~]# mkdir git_test
[root@kai ~]# cd git_test/
[root@kai git_test]# ll -a
total 0
drwxr-xr-x  2 root root   6 Mar 13 21:43 .
dr-xr-x---. 5 root root 228 Mar 13 21:43 ..
[root@kai git_test]# git init
Initialized empty Git repository in /root/git_test/.git/
[root@kai git_test]# ll -a
total 0
drwxr-xr-x  3 root root  18 Mar 13 21:44 .
dr-xr-x---. 5 root root 228 Mar 13 21:43 ..
drwxr-xr-x  7 root root 119 Mar 13 21:44 .git

可以看到在git_test目錄下創建了一個.git隱藏目錄,這就是版本庫目錄。

3.版本創建與回退

3.1 基本使用

在git_test目錄下創建一個文件code.txt,編輯內容如下:

[root@kai git_test]# vim code.txt
[root@kai git_test]# cat code.txt 
this is the first line

使用如下兩條命令可以創建一個版本:

[root@kai git_test]# git commit -m 'version1'

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@kai.(none)')
# 出現該錯誤原因是我們沒有配置git庫的用戶名與郵箱,按提示創建即可。

[root@kai git_test]# git config --global user.email "[email protected]"
[root@kai git_test]# git config --global user.name "kai"

# 再次提交
[root@kai git_test]# git commit -m 'version1'
[master (root-commit) 020bf02] version1
 1 file changed, 1 insertion(+)
 create mode 100644 code.txt

使用如下命令可以查看版本記錄:

[root@kai git_test]# git log
commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1

繼續編輯code.txt,在裡面再增加一行:

[root@kai git_test]# vim code.txt
[root@kai git_test]# cat code.txt 
this is the first line
this is the second line

使用如下命令再創建一個版本並查看版本記錄:

[root@kai git_test]# git add code.txt 
[root@kai git_test]# git commit -m 'version2'
[master 6280fa5] version2
 1 file changed, 1 insertion(+)
[root@kai git_test]# git log
commit 6280fa584403809ac2078a81120acf33e6bec836
Author: kai <[email protected]>
Date:   Thu Mar 14 00:58:35 2019 -0400

    version2

commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1
[root@kai git_test]#

現在若想回到某一個版本,可以使用命令:git reset --hard HEAD^。HEAD 表示當前版本,HEAD^ 表示上一個版本,HEAD^^ 表示上上個版本。也可以使用另一種表示方式:HEAD~n 表示前n個版本。

現在若覺得想回到版本1,可以使用如下命令:

[root@kai git_test]# git reset --hard HEAD^
HEAD is now at 020bf02 version1
[root@kai git_test]# git log
commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1
[root@kai git_test]# cat code.txt 
this is the first line
[root@kai git_test]# 

執行命令後使用git log查看版本記錄,發現現在只能看到版本1的記錄,cat code.txt查看文件內容,現在只有一行,也就是第一個版本中code.txt的內容。

假如我們現在又想回到版本2,可以使用如下命令:git reset --hard 版本號
從上面記錄可以看到版本2的版本號為:6280fa584403809ac2078a81120acf33e6bec836
在終端執行如下命令:(輸入版本號前幾位即可)

[root@kai git_test]# git reset --hard 6280fa5844
HEAD is now at 6280fa5 version2
[root@kai git_test]# git log
commit 6280fa584403809ac2078a81120acf33e6bec836
Author: kai <[email protected]>
Date:   Thu Mar 14 00:58:35 2019 -0400

    version2

commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1
[root@kai git_test]# cat code.txt 
this is the first line
this is the second line
[root@kai git_test]#

現在發現版本2有回來了,cat code.txt查看其裡面的內容和原來的相同。

假如說上面的終端已經關了,也就是我們已經不知道版本2的版本號,該怎麼回退版本2?
首先我們退回版本1:

[root@kai git_test]# git reset --hard HEAD^
HEAD is now at 020bf02 version1
[root@kai git_test]# cat code.txt 
this is the first line
[root@kai git_test]#

那麼在不知道版本號情況下怎麼再回到版本2呢?其實git reflog命令可以查看我們的操作記錄。
查到版本2的版本號,我們再使用如下命令進行版本回退,版本重新回到了版本2。

[root@kai git_test]# git reflog
020bf02 HEAD@{0}: reset: moving to HEAD^
6280fa5 HEAD@{1}: reset: moving to 6280fa5844
020bf02 HEAD@{2}: reset: moving to HEAD^
6280fa5 HEAD@{3}: commit: version2
020bf02 HEAD@{4}: commit (initial): version1
[root@kai git_test]# git reset --hard 6280fa5844
HEAD is now at 6280fa5 version2
[root@kai git_test]# git log
commit 6280fa584403809ac2078a81120acf33e6bec836
Author: kai <[email protected]>
Date:   Thu Mar 14 00:58:35 2019 -0400

    version2

commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1
[root@kai git_test]# 

3.2 工作區和暫存區 

1)工作區(Working Directory)
電腦中的目錄,比如我們的git_test,就是一個工作區。

2)版本庫(Repository)
工作區有一個隱藏目錄.git,這個不是工作區,而是git的版本庫。

      git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。因為我們創建git版本庫時,git自動為我們創建了唯一一個master分支,所以,現在 git commit 就是往master分支上提交更改。
可以簡單理解為,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

下麵上圖理解:

前面說了我們把文件往git版本庫里添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

下麵在git_test目錄下再創建一個文件code2.txt,然後編輯內容,同時修改code.txt的內容:

[root@kai git_test]# vim code2.txt
[root@kai git_test]# cat code2.txt 
the code2 first line
[root@kai git_test]# vim code.txt 
[root@kai git_test]# cat code.txt 
this is the first line
this is the second line
this is the third line

使用如下命令查看當前工作樹的狀態:

[root@kai git_test]# 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:   code.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	code2.txt
no changes added to commit (use "git add" and/or "git commit -a")
[root@kai git_test]# 

上面提示我們code.txt被修改,而code2.txt沒有被跟蹤。

我們使用如下命令把code.txt和code2.txt加入到暫存區,然後再執行git status命令,結果如下:

[root@kai git_test]# git add code.txt 
[root@kai git_test]# git add code2.txt 
[root@kai git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   code.txt
#	new file:   code2.txt
#
[root@kai git_test]# 

所以git add命令是把所有提交的修改存放到暫存區。

然後,執行git commit就可以一次性把暫存區的所有修改提交到分支創建一個版本。

[root@kai git_test]# git commit -m 'version3'
[master f18f0cc] version3
 2 files changed, 2 insertions(+)
 create mode 100644 code2.txt
[root@kai git_test]# git log
commit f18f0ccadc62b83fa4c6e2222956ba2f2a0e5230
Author: kai <[email protected]>
Date:   Thu Mar 14 05:16:31 2019 -0400

    version3

commit 6280fa584403809ac2078a81120acf33e6bec836
Author: kai <[email protected]>
Date:   Thu Mar 14 00:58:35 2019 -0400

    version2

commit 020bf021ec6d1b77836db4e96541d3659251714e
Author: kai <[email protected]>
Date:   Wed Mar 13 21:57:42 2019 -0400

    version1
[root@kai git_test]# 

一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾凈”的。執行如下命令可以發現:

[root@kai git_test]# git status
# On branch master
nothing to commit, working directory clean
[root@kai git_test]# 

現在我們的版本庫變成了這樣:

3.3 管理修改

git管理的文件的修改,它只會提交暫存區的修改來創建版本。

編輯code.txt,並使用git add 命令將其添加到暫存區中。

[root@kai git_test]# vim code.txt                                                                                                                                                                                                                           
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
[root@kai git_test]# git add code.txt                                                                                                                                                                                           


繼續編輯code.txt,併在其中添加一行。

[root@kai git_test]# vim code.txt
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
this is the new line
[root@kai git_test]#

git commit 創建一個版本,並使用git status查看,發現第二次修改code.txt內容之後,並沒有將其添加的工作區,所以創建版本的時候並沒有被提交。

[root@kai git_test]# vim code.txt
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
this is the new line
[root@kai git_test]# git commit -m 'version4'
[master 66a9c99] version4
 1 file changed, 1 insertion(+)
[root@kai git_test]# 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:   code.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@kai git_test]# 

3.4 撤銷修改

繼續上面的操作,提示我們可以使用 git checkout -- <文件> 來丟棄工作區的改動。執行如下命令,發現工作區乾凈了,第二次的改動內容也沒了。

[root@kai git_test]# git checkout -- code.txt 
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
[root@kai git_test]# git status
# On branch master
nothing to commit, working directory clean
[root@kai git_test]# 

我們繼續編輯code.txt,併在其中添加如下內容,並將其添加的暫存區。

[root@kai git_test]# vim code.txt
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
the new line
[root@kai git_test]# git add code.txt
[root@kai git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   code.txt
#
[root@kai git_test]# 

git同樣告訴我們,用命令 git reset HEAD file 可以把暫存區的修改撤銷掉,重新放回工作區。

[root@kai git_test]# git reset HEAD code.txt 
Unstaged changes after reset:
M	code.txt
[root@kai git_test]# 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:   code.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@kai git_test]#

現在若想丟棄code.txt的修改,執行如下命令即可。

[root@kai git_test]# cat code.txt 
this is the first line
this is the second line
this is the third line
this is the forth line
the new line
[root@kai git_test]# git checkout -- code.txt 
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
[root@kai git_test]# git status
# On branch master
nothing to commit, working directory clean
[root@kai git_test]#

現在,如果你不但改錯了東西,還從暫存區提交到了版本庫,則需要進行版本回退。

回退小結:
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節。

3.5 對比文件不同

對比工作區和某個版本中文件的不同

繼續編輯文件code.txt,在最後添加一行 the new line,然後對比工作區中code.txt和HEAD版本中code.txt的不同。使用如下命令:

[root@kai git_test]# echo "the new line" >> code.txt 
[root@kai git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
the new line
[root@kai git_test]# git diff HEAD -- code.txt 
diff --git a/code.txt b/code.txt
index 66f9219..324317f 100644
--- a/code.txt  # - 代表HEAD版本中的 code.txt 內容
+++ b/code.txt  # - 代表工作區中的 code.txt 內容
@@ -2,3 +2,4 @@ this is the first line this is the second line this is the third line this is the forth line +the new line # 工作區的比HEAD版本中的多了一行 [root@kai git_test]#

丟棄工作區的修改

[root@kai git_test]# git checkout -- code.txt 
[root@kai git_test]# git status
# On branch master
nothing to commit, working directory clean

對比兩個版本間文件的不同:

[root@kai git_test]# git diff HEAD HEAD^ -- code.txt 
diff --git a/code.txt b/code.txt
index 66f9219..01e1274 100644
--- a/code.txt  # - 代表 HEAD 版本中的 code.txt 內容
+++ b/code.txt  # - 代表 HEAD^ 版本中的 code.txt 內容
@@ -1,4 +1,3 @@
 this is the first line
 this is the second line
 this is the third line
-this is the forth line  # HEAD 版本的比 HEAD^ 版本中的多了一行
[root@kai git_test]#

3.6 刪除文件

我們把目錄中的code2.txt刪除。

[root@kai git_test]# rm -f code2.txt

這個時候,git知道刪除了文件,因此,工作區和版本庫就不一致了,git status命令會立刻提示哪些文件被刪除了。

[root@kai git_test]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    deleted:    code2.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@kai git_test]#

現在有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令 git rm 刪掉,並且 git commit:

[root@kai git_test]# git rm code2.txt
rm 'code2.txt'
[root@kai git_test]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    deleted:    code2.txt
#
[root@kai git_test]# git commit -m 'delete_code2.txt'
[master f25e944] delete_code2.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 code2.txt
[root@kai git_test]# git status
# On branch master
nothing to commit, working directory clean
[root@kai git_test]#

另一種情況是刪錯了,可以直接使用git checkout – code2.txt,這樣文件code2.txt又回來了

刪除小結:

命令 git rm 用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢覆文件到最新版本,你會丟失最近一次提交後你修改的內容。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux區域網搭建yum倉庫(本地(file)、網路(ftp、http)) yum配置文件解釋: [ ]:定義倉庫,base為倉庫的名字,可任意 name:倉庫的簡短文字描述 baseurl:倉庫的位置,file://表示本地路徑,/mnt為本地光碟路徑,網路路徑為:http,ftp enable ...
  • 一、文件描述符 文件描述符是一個非負的整數,Linux 中每個運行中的程式(進程),都有一些與之關聯的文件描述符,你可以使用文件描述符來訪問打開的文件或設備。在標準 I/O 庫中,與文件描述符對應的是流。當一個程式開始運行時,它一般會有 3 個已經打開的文件描述符,分別對應三個文件流: 顯然,還有其 ...
  • 在Ubuntu下安裝完virtualenv、virtualenvwrapper,然後設置環境文件 .bashrc 接著 source .bashrc,產生錯誤信息 首先確認了 libpam-mount 等模塊已經在系統安裝了。查看後面的信息應該是文件配置路徑有問題。 檢查virtualenvwrap ...
  • 本人是cnblog萌新,剛學編程不久的菜鳥,這是我的第一篇博客,請各位輕噴 Microsoft store安裝路徑: 相信很多人都跟我一樣有強迫症,文件找不到安裝目錄就不舒服。一開始在系統盤找不到WindowsApps文件夾,後來才發現在G:\WindowsApps,所以安裝路徑可能是分散的,比如U ...
  • 1.先啟動三個服務,按順序啟動(有依存關係),都改為自啟動 Function Discovery Resource Publication SSDP Discovery UPnP Device Host 2.啟動網路發現 控制面板->網路和Internet->網路和共用中心->更改高級共用設置 如果 ...
  • 主機實現hostname的修改原理: 修改註冊表中的值: hklm\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName 下的 ComputerName hklm\SYSTEM\CurrentControlSet\Control\Com ...
  • 1.4 重置root管理員密碼 啟動界面按下e鍵進入內核編輯界面 在 linux16 開頭的地方,按 “End” 鍵到最後輸入rd.break,按 Ctrl+X 進入 依次輸入以下命令重啟系統後,就可以使用新密碼登錄Linux系統 1.5 RPM(紅帽軟體包管理器) rpm -ivh filenam ...
  • [toc] 文件被那個進程使用,寫數據不是用lsof可以找出來嗎,但現實情況是lsof沒找出來T_T 背景 centos7 在某一段時間監控報警磁碟使用率達99%,由於監控屬於概要形式信息,沒有快照信息的監控(能發現某進程的I/O,CPU消耗情況),所以需要在伺服器上去定時執行統計命令獲取快照信息。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...