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.txt
;mv
命令可理解為剪下的同時進行更名;
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 mv
與 mv
的區別相當於git rm
與 rm
之間的區別。
三、比較檔案
1.本地檔案 <->
本地檔案
diff file_a file_b
這是系統提供的比較命令,用於比較本地檔案或已經提交到版本庫的檔案。建立檔案a
和檔案b
,使用上述指令進行比較:
在 diff -u a b
的輸出資訊中:
加上引數
-u
可以更詳細地顯示比較資訊。
-
--- a
表示a
為原檔案; -
+++ b
表示b
為目標檔案; -
-1,3
中-
表示原檔案即a
,1
表示原檔案中的第一行,3
表示到第3
行。合起來的意思為:在原檔案a
中的1~3
行; -
同理:
+1,3
表示:目標檔案b
中的1~3
行; -
資料前面有三種符號,分別表示不同的資訊:
- 空格:表示該行在兩個檔案中都存在,如上圖所示
AABB
這一行檔案a
,b
都有; -
:表示原檔案a
去掉該行就能變為目標檔案b
;+
:表示原檔案a
加上該行就能變為目標檔案b
;
所以整個輸出資訊的意思為:
AABB
這一行兩檔案都有,只要原檔案a
去掉: - 空格:表示該行在兩個檔案中都存在,如上圖所示
a1
a2
並加上:
b1
b2
就能變為目標檔案b
;
2.工作區 <-
暫存區
以下為git
提供的比較命令,作用為:比較暫存區和工作區中的同一檔案。並且:原始檔案為暫存區中的檔案,目標檔案為工作區中的檔案。示例如下:
git diff
首先,新建檔案A.txt
和B.txt
,修改其內容並提交到暫存區:
然後,在工作區中再次修改檔案A.txt
與B.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.txt
與B.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
man
為linux
中自帶的幫助文件,也可以檢視幫助;
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