1. 程式人生 > >Git應用詳解第二講:Git刪除、修改、撤銷操作

Git應用詳解第二講:Git刪除、修改、撤銷操作

前言

前情提要:Git應用詳解第一講:Git分割槽,配置與日誌

在第一講中我們對Git進行了簡單的入門介紹,相信聰明的你已經瞭解Git的基本使用了。

這一講我們來進一步深入學習Git應用,著重介紹Git的一些常見操作,包括:刪除檔案、比較檔案、撤銷修改、修改註釋與檢視幫助文件。

一、刪除檔案

1.git rm <file>

該命令用於刪除版本庫中的檔案;刪除工作區和暫存區中的檔案都會報錯:

  • 若用該指令刪除工作區中的檔案,會報找不到檔案的錯誤:

  • 若用該指令刪除暫存區中的檔案,報如下錯誤:

所謂版本庫中的檔案指的是:已經通過commit指令提交的檔案,而不是工作區中的檔案(紅色),或暫存區中的檔案(綠色)。

git rm完成了兩步操作:

  • 第一步:將版本庫中的檔案刪除;
  • 第二步:將刪除操作納入暫存區(stage)。如下圖所示,相當於執行了git add test.txt,隨後可直接提交,完成test.txt的刪除;

2.rm <file>

該命令用於刪除工作區和版本庫中的檔案,不能刪除暫存區檔案;

注意:沒有新增到git倉庫中的本地檔案,都屬於工作區檔案。

  • 刪除工作區中的檔案時:

  • 刪除版本庫中的檔案時:

git rm不同的是,該指令不會將刪除操作納入暫存區。需要先將刪除的test.txt納入暫存區,再提交到版本庫才能完成test.txt檔案的刪除;

  • 刪除暫存區中檔案時:

從圖中可知rm命令只能刪除工作區中的test3.txt,不能刪除暫存區中的test3.txt;:

二、重新命名檔案

1.git mv <file1> <file2>

使用git命令git mv

git mv test.txt test3.txt

​ 將test.txt重新命名為test3.txtmv命令可理解為剪下的同時進行更名;

changes to be committed 表示該修改已經納入暫存區,可以進行提交操作;

一般綠色的檔案(操作)表示已經提交到暫存區了,不用再進行git add ,可以直接進行提交(git commit)。

從上文可知git mv

做了兩件事:

  • 第一步:將檔案test.txt重新命名為test3.txt
  • 第二步:將重新命名操作test.txt -> test3.txt納入暫存區;

2.mv <file1> <file2>

使用系統命令mv

mv test2.txt test3.txt

執行該語句後檢視狀態git status

發現工作區中多出兩步操作:

  • 刪除檔案test2.txt

  • 新建檔案text3.txt

再使用git add test2.txt test3.txt 將操作提交到暫存區,通過git status檢視狀態:

此時git立即就能識別出來這是一個檔案重新命名;

由此說明git mv進行了三步操作:

  • 第一步:刪除工作區中重新命名前的檔案test2.txt
  • 第二步:在工作區中建立重新命名後的檔案test3.txt
  • 第三步:將上述的兩個操作提交到暫存區中;

git mvmv的區別相當於git rmrm 之間的區別。

三、比較檔案

1.本地檔案 <-> 本地檔案

diff file_a file_b

這是系統提供的比較命令,用於比較本地檔案或已經提交到版本庫的檔案。建立檔案a和檔案b,使用上述指令進行比較:

diff -u a b的輸出資訊中:

加上引數-u可以更詳細地顯示比較資訊。

  • --- a表示a為原檔案;

  • +++ b表示b為目標檔案;

  • -1,3- 表示原檔案即a1 表示原檔案中的第一行,3 表示到第3行。合起來的意思為:在原檔案a中的1~3行;

  • 同理:+1,3 表示:目標檔案b中的1~3行;

  • 資料前面有三種符號,分別表示不同的資訊:

    • 空格:表示該行在兩個檔案中都存在,如上圖所示AABB這一行檔案ab都有;
    • - :表示原檔案a去掉該行就能變為目標檔案b
    • + :表示原檔案a加上該行就能變為目標檔案b

    所以整個輸出資訊的意思為:AABB這一行兩檔案都有,只要原檔案a去掉:

a1
a2

並加上:

b1
b2

就能變為目標檔案b

2.工作區 <- 暫存區

以下為git提供的比較命令,作用為:比較暫存區和工作區中的同一檔案。並且:原始檔案為暫存區中的檔案,目標檔案為工作區中的檔案。示例如下:

git diff

首先,新建檔案A.txtB.txt,修改其內容並提交到暫存區:

然後,在工作區中再次修改檔案A.txtB.txt的內容:

此時使用git diff進行比較:

git diff的輸出資訊中:

  • --- a/A.txt:表示原檔案為暫存區中的A.txt

  • +++ b/A.txt:表示目標檔案為工作區中的A.txt

  • -1: 其中-表示原檔案,1表示從第1行開始。由於暫存區中的A.txt檔案(原檔案)只有1行,所以將原來的(-1,1)簡寫為-1

  • +1,2:其中+表示目標檔案,1,2表示工作區中的A.txt檔案(目標檔案)從第1行開始有2行;

  • hello world:表示原檔案和目標檔案中都存在的內容;

  • +hello java表示暫存區中的A.txt加上該行,就能變得與工作區中的A.txt一樣;

可以看到該指令是將同一檔案的工作區版本與暫存區版本進行比較,各比各的,並不會將A.txtB.txt進行比較。

3.工作區 <- 版本庫

以下指令作用為:比較版本庫和工作區中的同一檔案。並且:原始檔案為版本庫中的檔案,目標檔案為工作區中的檔案。

git diff commit_id

用於比較指定commit id提交上的A檔案和工作區中的A檔案;

git diff HEAD

用於比較最新提交上的A檔案和工作區中的A檔案:

上面的A檔案僅為一個示例,以下同理。

如下圖所示,先初始化test.txt為:版本庫中的修改,然後進行一次提交;隨後在工作區中為test.txt新增工作區的修改;然後執行上述比較指令,從顯示出來的比較結果可知,工作區中的test.txt檔案比最新一次提交的test.txt檔案多了一行工作區中的修改內容。

4.暫存區 <- 版本庫

以下指令作用為:比較版本庫和暫存區中的同一檔案,其中原始檔案為版本庫中的檔案,目標檔案為暫存區中的檔案:

git diff --cached commit_id

用於比較指定提交上的A檔案和暫存區中的A檔案;

git diff --cached

用於比較最新提交上的A檔案和暫存區中的A檔案。示例如下:

可以看到,暫存區中的A.txt檔案比最新提交中的A.txt檔案多了一行hello java;暫存區中的B.txt檔案比最新提交中的B.txt檔案多了一行hello java2

5.總結

  • 關於目標檔案與原始檔案的判定,遵循的順序為:工作區 <- 暫存區 <-版本庫(提交);

  • 上述比較指令的比較如下表所示:

    指令 作用 原始檔案 目標檔案
    diff <file1> <file2> 比較兩個本地檔案 本地檔案/版本庫 本地檔案/版本庫
    git diff 比較暫存區和工作區中的同一檔案 暫存區 工作區
    git diff commit_id 比較指定commit id提交上的A檔案和工作區中的A檔案 版本庫 工作區
    git diff HEAD 比較最新提交上的A檔案和工作區中的A檔案 版本庫 工作區
    git diff --cached commit_id 比較指定提交上的A檔案和暫存區中的A檔案 版本庫 暫存區
    git diff --cached 比較最新提交上的A檔案和暫存區中的A檔案 版本庫 暫存區

    表格中的A檔案僅為示例。

四、撤銷修改

主要是將已經納入暫存區的修改(綠色),先恢復到工作區(紅色),再恢復到修改前。比如撤銷git rm這一刪除操作:

1.將暫存區修改恢復到工作區(unstage

也就是將對檔案的修改操作由綠色變為紅色。

法一:git reset head <file>

如下圖所示,通過git rm刪除了版本庫中的test3.txt檔案,並將該操作提交到了暫存區。隨後通過以上命令,將這一刪除操作恢復到了工作區;

法二:git restore --stage <file>

這裡的引數--stage寫成--staged效果是一樣的,作用與法一相同:

2.撤銷工作區操作

比如撤銷工作區中對檔案的修改、新增和刪除操作:

法一:git restore <file>

如下圖所示,在工作區中刪除了test3.txt檔案。然後,通過上述指令撤銷了工作區中對test3.txt的刪除操作:

法二:git checkout -- <file>

作用與法一相同:

五、修改提交註釋與作者

1.修改最近一次提交資訊

git commit --amend -m '修正資訊'

如果寫錯了提交訊息:

可以通過:git commit --amend -m '註釋' 來修改上一次的提交資訊:(amend是修復的意思)

git commit --amend

當需要為最近一次提交新增大量註釋時,可以直接使用該指令進入vim編輯器編輯:

這樣的好處是:錯誤的提交和修正後的提交經過該命令修正後,只變為一次提交,而不是兩次提交;

git commit --amend --author 'Name<email>'

用於修改最近一次提交的配置資訊,包含作者和註釋資訊。執行命令時會進入vim編輯器編輯註釋資訊:

修改前該分支上最近兩次的提交資訊為:

修改後的最近兩次提交資訊為:

可以看到成功地改變了最新一次提交的作者和提交註釋。

注意:修改提交註釋的同時,雖然提交的內容相同,但是提交前後的commit_id是不同的,說明建立了一個新提交替換了原來需要修正的提交。如下圖中的提交5與提交3所示:

2.修改特定提交資訊

如圖所示,在test分支進行了四次提交。現在我們想要修改第三次提交的提交資訊:

git rebase -i commit_id

通過以上指令可以進入rebase互動模式,並顯示commit_id之後的提交資訊。比如:若命令中的commit_id為第一次提交的commit_id,那麼就會顯示第2~4次的提交資訊。這裡我們需要修改第三次提交的資訊,只需要將它指定為第二次提交的commit_id即可。執行以下命令,進入vim編輯器:

git rebase -i 678e0

在這個介面中,我們可以通過將pick引數修改為其他rebase提供的引數,從而對第三次錯誤提交進行修改。有兩個引數可以實現這一目的:

這裡涉及到vim編輯器的使用方式:

  • shift + A為插入命令,可進入vim編輯器的編輯模式;
  • 編輯完成後,先按ESC回到vim編輯器的命令列模式,再輸入:wq表示儲存並退出編輯器;

reword引數

該引數的意思是:直接修改設定了該引數的提交的提交註釋。這裡應該將第三次提交的pick引數改為reword

通過:wq儲存並退出,隨後再次進入vim編輯器,這次是修改設定了reword引數的提交的提交註釋:

將它改為正確的提交資訊:

通過:wq儲存並退出vim編輯器,完成錯誤提交資訊的修改,再次檢視歷史提交資訊:

可以發現:錯誤的提交資訊得到了糾正,並且這次提交及其之後的提交的commit_id都發生了變化。說明git新建立了對應數目的提交,並對原有提交進行了覆蓋,但是內容沒有發生變化;

事實上:rebase的含義為變換基準,git rebase -i commit_id中的commit_id所指的提交節點就是新的基準點。該基準點之後的提交都會被git新建立的,內容一樣的新提交所覆蓋。rebase指令之後會詳細介紹。

edit引數

該引數也可以達到上述效果,只不過稍微多了幾個步驟。這個引數的意思是:停下rebase程序,編輯添加了該引數的提交,編輯完之後,通過呼叫git rebase --continue繼續進行rebase;具體如下:

將添加了錯誤提交資訊的提交的pick引數改為edit引數:

通過:wq儲存並退出:

可以看到,edit引數將rebase操作停了下來。根據提示,可以通過:

git commit --amend

進入vim編輯器,修改當前提交的註釋資訊:

修改完後,通過:wq儲存並退出vim編輯器。再呼叫:

git rebase --continue

繼續進行rebase操作,由此完成錯誤提交資訊的修改:

此時檢視test分支的提交歷史,會發現錯誤的提交資訊得到了更正,並且與上reword引數一樣,建立了新的提交,對原有提交進行了覆蓋,同樣內容也不發生變化:

git rebase -i HEAD~n

通過上述指令也可以進入rebase互動模式,其中n表示需要顯示的最近n次提交記錄。比如通過以下指令,顯示test分支最近的三次提交記錄:

git rebase -i HEAD~3

進入rebase的互動介面之後,後續的操作和結果都與第一種方法一樣,這裡就不再贅述了。

六、獲取幫助

1.git help config

該命令會開啟git安裝目錄下的git-config幫助文件:

文件中詳細地顯示了相關操作指令的使用:

2.git config --help

效果與上述一樣,都是彈出同樣的幫助網頁;

3.man git-config

manlinux中自帶的幫助文件,也可以檢視幫助;

4.git

直接在命令視窗顯示常用的指令:

相關推薦

Git應用第二Git刪除修改撤銷操作

前言 前情提要:Git應用詳解第一講:Git分割槽,配置與日誌 在第一講中我們對Git進行了簡單的入門介紹,相信聰明的你已經瞭解Git的基本使用了。 這一講我們來進一步深入學習Git應用,著重介紹Git的一些常見操作,包括:刪除檔案、比較檔案、撤銷修改、修改註釋與檢視幫助文件。 一、刪除檔案 1.gi

Git開發第一Git分割槽,配置與日誌

前言 曾經聽到過這樣一句話:不會git就不要敲程式碼了。細細品味確實有其中的道理,可能是當事人程式碼被強行覆蓋後的嘆息吧! 因此,為了避免這種情況,接下來我們就一起來好好學習git的相關知識吧!不怕你不會,就怕你不看! 一、git的三個分割槽: 工作區(working directory) 暫存區(st

Git應用第三講本地分支的重要操作

前言 前情提要:Git應用詳解第二講:Git刪除、修改、撤銷操作 分支是git最核心的操作之一,瞭解分支的基本操作能夠大大提高專案開發的效率。這一講就來介紹一些分支的常見操作及其基本原理。 一、分支概述 在開發當中,往往需要分工合作。比如:小紅開發A功能,小明開發B功能,小剛開發C功能。如何才能做到三者並

Git應用第五講遠端倉庫Github與Git圖形化介面

前言 前情提要:Git應用詳解第四講:版本回退的三種方式與stash 這一節將會介紹本地倉庫與遠端倉庫的一些簡單互動以及幾款常用的Git圖形化介面,讓你更加方便地使用git。 一、Git裸庫 簡單來說git裸庫就是沒有工作區的git倉庫。比如伺服器,只起到程式碼託管的作用而不需要也不應該修改伺服器上的程式碼。

Git應用第四版本回退的三種方式與stash

前言 前情提要:Git應用詳解第三講:本地分支的重要操作 git作為一款版本控制工具,其最核心的功能就是版本回退,沒有之一。熟悉git版本回退的操作能夠讓你真真正正地放開手腳去開發,不用小心翼翼,怕一不小心刪除了不該刪除的檔案。本節除了介紹版本回退的內容之外,還會介紹stash的使用。 一、版本回退 在g

Git應用第六Git協作與Git pull常見問題

前言 前情提要:Git應用詳解第五講:遠端倉庫Github與Git圖形化介面 git除了可以很好地管理個人專案外,最大的一個用處就是實現團隊協作開發。況且,linus大神開發git的初衷就是為了維護Linux核心這一開源專案。所以,熟悉使用git進行多人協作開發的一般步驟和方法具有十分重要的意義。這一講將

Git應用第七Git refspec與遠端分支的重要操作

前言 前情提要:Git應用詳解第六講:Git協作與Git pull常見問題 這一節來介紹本地倉庫與遠端倉庫的分支對映關係:git refspec。徹底弄清楚本地倉庫到底是如何與遠端倉庫進行聯絡的。 一、Git refspec refspec是Reference Specification的縮寫,字面意思就

Git應用第八Git標籤別名與Git gc

前言 前情提要:Git應用詳解第七講:Git refspec與遠端分支的重要操作 這一節主要介紹Git標籤、別名與Git的垃圾回收機制。 一、Git標籤(tag) 1.標籤的實質 標籤與分支十分相似,都是指向某一次提交;並且,它們的值都為各自指向提交的SHA1值;但是,不同於會隨著提交的變化而變化的分支,

Git應用第九Git cherry-pick與Git rebase

前言 前情提要:Git應用詳解第八講:Git標籤、別名與Git gc 這一節主要介紹git cherry-pick與git rebase的原理及使用。 一、Git cherry-pick Git cherry-pick的作用為移植提交。比如在dev分支錯誤地進行了兩次提交2nd和3rd,如果想要將這兩次提

Git應用第十Git子庫submodule與subtree.md

前言 前情提要:Git應用詳解第九講:Git cherry-pick與Git rebase 一箇中大型專案往往會依賴幾個模組,git提供了子庫的概念。可以將這些子模組存放在不同的倉庫中,通過submodule或subtree實現倉庫的巢狀。本講為Git應用詳解的倒數第二講,勝利離我們不遠了! 一、su

Git應用第十Git子庫submodule與subtree

前言 前情提要:Git應用詳解第九講:Git cherry-pick與Git rebase 一箇中大型專案往往會依賴幾個模組,git提供了子庫的概念。可以將這些子模組存放在不同的倉庫中,通過submodule或subtree實現倉庫的巢狀。本講為Git應用詳解的倒數第二講,勝利離我們不遠了! 一、su

Git之三Git分支

本篇blog為轉載,因為這是我看過關於git的最清晰易懂的blog教程,以備後用 Git 分支 幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要建

即拉即用你不知道的持續整合的3個Git Hooks

在構建之外新增自動化的手段,是真正用好CI的關鍵。如果你已經用了一段時間的Git了,相信你可能聽說過Git Hooks,甚至可能簡單的上手玩了玩。Git Hooks在持續整合的語境中十分神奇,所以在本文中,我將深入介紹三個用例,並教你學會將現成可用的Hooks運

Git——Feature Branching最流行的工作流

在前面的 Git入門——團隊工作的基本工作模型 中 ,介紹了一種最基本的團隊工作模型。在這種模型里,所有人都工作在 master 上,寫完了的 commit 可以通過 push 來發送到中央倉庫,並且可以使用 pull 來獲取到 別人的最新 commit s。   這種工作模

Git——Feature Branching最流行的工作流

就是 上進 div 無法 進入 簡介 核心內容 同步 分享 在前面的 Git入門——團隊工作的基本工作模型 中 ,介紹了一種最基本的團隊工作模型。在這種模型裏,所有人都工作在 master 上,寫完了的 commit 可以通過 push 來發送到中央倉庫,並且可以使用 pu

Git詳細使用教程(3)git add, git commit

創建 sta inf 詳解 使用教程 都是 index comm 博客 在使用git之前,我們首先要初始化一個git管理的倉庫,這裏以博客(blog)為例 git init blog 我們進入目錄,執行git status查看git狀態,可以看到一個新的git管理的項目目

python3多線程應用(第一卷線程的本質概念)

本質 函數 解釋 style height auto 進行 mage pla 之前我用過多線程的方式執行了爬蟲程序,爬取了糗事百科的數據可以看到速率非常之快,就像正常一個人他要完一個漢堡,再吃喝一瓶水才能走,結果他邊吃漢堡邊喝水,速率一下加快了一樣。首先我們看看什麽是線程:

python3多線程應用(第三卷圖解多線程中join,守護線程應用

圖解 pytho inf bubuko post 圖片 clas info blog python3多線程應用詳解(第三卷:圖解多線程中join,守護線程應用)

python3多線程應用(第四卷圖解多線程中LOCK)

python3 9.png image 任務 來看 info 對比 body pos 先來看下圖形對比: 發現沒有這種密集型計算的任務中,多線程沒有穿行的速率快,原因就是多線程在線程切換間也是要耗時的而密集型計算任務執行時幾乎沒以偶IO阻塞,這樣你說誰快python