checkout 撤銷修改_Git的4個階段的撤銷更改

雖然git誕生距今已有12年之久,網上各種關于git的介紹文章數不勝數,但是依然有很多人(包括我自己在內)對于它的功能不能完全掌握。以下的介紹只是基于我個人對于git的理解,并且可能生編硬造了一些不完全符合git說法的詞語。目的只是為了讓git通俗化,使初學者也能大概了解如何快速上手git。同時,下面所有討論,我們都假設只使用一個分支,也就是主分支master的情況,雖然這種作法并不符合git規范,但是現實情況中絕大部分用戶是直接在master分支上進行工作的,所以在這里我們不去引入更加復雜的各種分支的情況,也不涉及標簽tag的操作,只講在最簡單的主分支上如何回退。

基本概念

3個步驟

39545f68c275d889b799598765e736cc.png

正常情況下,我們的工作流就是3個步驟,對應上圖中的3個箭頭線:

git add .

git commit -m "comment"

git push

git add .把所有文件放入暫存區;

git commit把所有文件從暫存區提交進本地倉庫;

git push把所有文件從本地倉庫推送進遠程倉庫。

4個區

git之所以令人費解,主要是它相比于svn等等傳統的版本管理工具,多引入了一個暫存區(Stage)的概念,就因為多了這一個概念,而使很多人疑惑。其實,在初學者來說,每個區具體怎么工作的,我們完全不需要關心,而只要知道有這么4個區就夠了:

工作區(Working Area)

暫存區(Stage)

本地倉庫(Local Repository)

遠程倉庫(Remote Repository)

5種狀態

以上4個區,進入每一個區成功之后會產生一個狀態,再加上最初始的一個狀態,一共是5種狀態。以下我們把這5種狀態分別命名為:

未修改(Origin)

已修改(Modified)

已暫存(Staged)

已提交(Committed)

已推送(Pushed)

檢查修改

了解了基本概念之后,我們來談一談犯錯誤之后如何撤銷的問題。首先,我們要了解如何檢查這3個步驟當中每一個步驟修改了什么,然后才好判斷有沒有修改成功。檢查修改的二級命令都相同,都是diff,只是參數有所不同。

已修改,未暫存

git diff

首先,我們來看一下,如果我們只是簡單地在瀏覽器里保存了一下文件,但是還沒有做git add .之前,我們如何檢查有哪些修改。我們先隨便拿一個文件來做一下實驗:

77fbd42b00e3e2ec6d5a1c93c922ac90.png

我們在文件開頭的第2行胡亂加了4個數字1234,存盤,這時文件進入了已修改狀態,但是還沒有進入暫存區,我們運行git diff,結果如下:

diff --git a/index.md b/index.md

index 73ff1ba..1066758 100644

--- a/index.md

+++ b/index.md

@@ -1,5 +1,5 @@

---

-layout: main

+1234layout: main

color: black

---

git diff的結果告訴我們哪些文件已經做了哪些修改。

已暫存,未提交

git diff --cached

現在我們把修改放入暫存區看一下。先執行git add .,然后執行git diff,你會發現沒有任何結果:

804d1d789da923f5f2aa399fd2b83245.png

這說明git diff這個命令只檢查我們的工作區和暫存區之間的差異,如果我們想看到暫存區和本地倉庫之間的差異,就需要加一個參數git diff --cached:

diff --git a/index.md b/index.md

index 73ff1ba..1066758 100644

--- a/index.md

+++ b/index.md

@@ -1,5 +1,5 @@

---

-layout: main

+1234layout: main

color: black

---

這時候我們看到的差異是暫存區和本地倉庫之間的差異。

已提交,未推送

git diff master origin/master

現在,我們把修改從暫存區提交到本地倉庫,再看一下差異。先執行git commit,然后再執行git diff --cached,沒有差異,執行git diff master origin/master,可以看到差異:

5adbbc1f6a26878c8d0fea9a67c91be1.png

在這里,master就是你的本地倉庫,而origin/master就是你的遠程倉庫,master是主分支的意思,因為我們都在主分支上工作,所以這里兩邊都是master,而origin就代表遠程。

撤銷修改

了解清楚如何檢查各種修改之后,我們開始嘗試各種撤銷操作。

已修改,未暫存

如果我們只是在編輯器里修改了文件,但還沒有執行git add .,這時候我們的文件還在工作區,并沒有進入暫存區,我們可以用:

git checkout .

或者

git reset --hard

來進行撤銷操作。

0f70416c6c98943236badeece7136312.png

可以看到,在執行完git checkout .之后,修改已被撤銷,git diff沒有任何內容了。

一對反義詞

git add .的反義詞是git checkout .。做完修改之后,如果你想向前走一步,讓修改進入暫存區,就執行git add .,如果你想向后退一步,撤銷剛才的修改,就執行git checkout .。

已暫存,未提交

你已經執行了git add .,但還沒有執行git commit -m "comment"。這時候你意識到了錯誤,想要撤銷,你可以執行:

git reset

git checkout .

或者

git reset --hard

git reset只是把修改退回到了git add .之前的狀態,也就是說文件本身還處于已修改未暫存狀態,你如果想退回未修改狀態,還需要執行git checkout .。

或許你已經注意到了,以上兩個步驟都可以用同一個命令git reset --hard來完成。是的,就是這個強大的命令,可以一步到位地把你的修改完全恢復到未修改的狀態。

已提交,未推送

你的手太快,你既執行了git add .,又執行了git commit,這時候你的代碼已經進入了你的本地倉庫,然而你后悔了,怎么辦?不要著急,還有辦法。

git reset --hard origin/master

還是這個git reset --hard命令,只不過這次多了一個參數origin/master,正如我們上面講過的,origin/master代表遠程倉庫,既然你已經污染了你的本地倉庫,那么就從遠程倉庫把代碼取回來吧。

已推送

很不幸,你的手實在是太快了,你既git add了,又git commit了,并且還git push了,這時你的代碼已經進入遠程倉庫。如果你想恢復的話,還好,由于你的本地倉庫和遠程倉庫是等價的,你只需要先恢復本地倉庫,再強制push到遠程倉庫就好了:

git reset --hard HEAD^

git push -f

530f08d2f0198f1fc34e2305c0d2bf90.png

總結

以上4種狀態的撤銷我們都用到了同一個命令git reset --hard,前2種狀態的用法甚至完全一樣,所以只要掌握了git reset --hard這個命令的用法,從此你再也不用擔心提交錯誤了。

更多參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移除Java對象中的屬性_在java對象中添加和刪除屬性

我怎樣才能在 java中實現這一點.我有一個具有屬性的對象.public class Object {private final Credentials Credentials;private final int PageSize;private final int PageStart;private final int DefaultFilterId;public Object(Credentials Credentials, int PageSize, in…

java軟件開發ea介紹_開發說明 — Eacloud 1.0 documentation

PHP 代碼示例( Linux 版)解壓后,參考 phplinux/v3.4.0.1/文檔/PHP版服務器端工具包(Linux版)軟件使用手冊.pdfDemo 運行1.安裝對應版本的 PHP2.安裝運行時環境(glibc 庫等)3.修改 PHP 的配置文件 php.ini修改 php.ini,使 php 允許加載擴展,并…

java中operationBox_Java使用PDFBox開發包實現對PDF文檔內容編輯與保存

pdfbox開發包下載地址:http://pdfbox.apache.org/程序實現了PDF文檔的創建,讀入,與修改PDF內容并保存。可能有個前提,PDF文檔不是加密的,如果加密怎么辦,我沒研究過!源代碼如下:pack…

java訪問權限最高_java 訪問權限

Java語言中的訪問權限修飾符有4種,但是僅有3個關鍵字,因為不寫訪問權限,在Java中被稱為默認權限,或同包權限,本文中以(default)代替。下面按照權限從小到大的順序對4中訪問權限分別介紹。class我個人,我有很…

java中 queryparam_java – 何時使用@QueryParam和@PathParam

我不是問這里已經問過的問題:What is the difference between PathParam and QueryParam這是一個“最佳實踐”或常規問題。什么時候使用PathParam和QueryParam。我可以想到的是,決定可能使用兩者來區分信息模式。讓我在下面說明我的LTPO – 不完美的觀察…

java中fork函數_java中的forkjoin框架的使用

fork join框架是java 7中引入框架,這個框架的引入主要是為了提升并行計算的能力。fork join主要有兩個步驟,第一就是fork,將一個大任務分成很多個小任務,第二就是join,將第一個任務的結果join起來,生成最后…

Java h264起始碼_h.264 – 使用H264視頻的起始碼

有兩種H.264流格式,有時也稱為>附件B(在原始H.264流中找到)> AVCC(在像MP4這樣的容器中找到)H.264流由NAL(包裝單位)組成(1)附件B:在每個NAL單元的字節[x00] [x00] [x00] [x01]之前有4字節的起始碼.[start code]--[NAL]--[start code]--[NAL] etc(2)AVCC&…

java中已定義類型car_Java 8 習慣用語(8):Java 知道您的類型

Java?8是第一個支持類型推斷的 Java 版本,而且它僅對 lambda 表達式支持此功能。在 lambda表達式中使用類型推斷具有強大的作用,它將幫助您做好準備以應對未來的 Java版本,在今后的版本中還會將類型推斷用于變量等更多可能。這里的訣竅在于恰…

ATM柜員機JAVA課程設計_ATM柜員機學年論文設計(Java課程設計)

內容簡介:ATM柜員機學年論文設計(Java課程設計),共23頁,4599字,附源程序。一. 程序介紹3二. 開發環境搭建31. MyEclipse 5.5.1 GA安裝32. MyEclipse Designer 圖形設計插件安裝33. MySQL數據庫安裝4三&…

mysql 結果集什么意思_結果集中的mysql“和”邏輯

假設我有一個類似以下的數據集:table fooid | employeeType | employeeID-------------------------1 | Developer | 12 | Developer | 23 | Developer | 34 | Manager | 15 | Manager | 46 | Manager | 57 | CEO | 18 | CEO | 6我想運行一個查詢,該查詢將返回所有e…

opencv java 去干擾_java - OpenCV Java修補圖像格式要求 - 堆棧內存溢出

一直試圖讓修復工作在Android上進行,int height (int) viewMat.size().height;int width (int) viewMat.size().width;Mat maskMat new Mat();maskMat.create(viewMat.size(), CvType.CV_8U);maskMat.setTo(bColor);Point r1 new Point(width/2-width/10, heigh…

java中 set集合_第8篇 Java中的集合(Set)

Java 集合的 Set 接口Set類型與List類型的區別Set: 無序、不可重復List: 有序、可重復1、HashSetHashSet的存儲結構:HashMap特點:HashSet通過比較存放的哈希碼(hashCode)來確定對象存放的位置當兩個對象的哈希值相等時&#xff0c…

android mysql實現登錄注冊_android簡單登陸和注冊功能實現+SQLite數據庫學習

android簡單登陸和注冊功能實現SQLite數據庫學習發布時間&#xff1a;2018-07-04 17:23,瀏覽次數&#xff1a;1027, 標簽&#xff1a;androidSQLite這里我只是建立了一個用簡單的存儲用戶名和密碼的表單MyDBHelper.java<>public class MyDBHelper extends SQLiteOpenHelp…

java web 來源頁_Java:Java Web--分頁效果

先來看一看分頁的實現原理萬能公式.jpg項目目錄.PNG首先,新建Java Web項目一. 梳理業務邏輯重定向到URL(跳轉到StudentViewAction頁面)//index.jsp頁面1.從頁面接收可變的值2.接收值有問題時,初始化為13.如果沒有問題,把String類型接收值強轉成Integer4.實例DAO方法,調用findSt…

java 瀏覽器 安全_安全策略-IE瀏覽器防黑十大秘籍

1.管理好Cookie在IE6.0中&#xff0c;打開“工具”→“Internet選項”→“隱私”對話框&#xff0c;這里設定了“阻止所有Cookie”、“高”、“中高”、“中”、“低”、“接受所有Cookie”六個級別&#xff0c;你只要拖動滑塊就可以方便地進行設定&#xff0c;而點擊下方的“編…

什么是java中的枚舉法_enum枚舉javajava,enum枚舉使用詳解+,總結

enum 的全稱為 enumeration&#xff0c; 是 JDK 1.5 中引入的新特性&#xff0c;存放在 java.lang 包中。下面是我在使用 enum 過程中的一些經驗和總結。原始的接口定義常量語法(定義)創建枚舉類型要使用 enum 關鍵字&#xff0c;隱含了所創建的類型都是 java.lang.Enum 類的子…

java 審計 漏洞函數_Java Web代碼審計流程與漏洞函數

常見框架與組合常見框架Struts2SpringMVCSpring Boot框架執行流程View層&#xff1a;視圖層Controller層&#xff1a;表現層Service層&#xff1a;業務層Dom層&#xff1a;持久層常見組合SpringStruts2HibernateSpringSpringMVCMybatisSpring BootMybatis代碼審計方法根據業務功…

java前期_【JAVA】前期環境配置

一、java的環境配置及在eclipse中如何安裝JRE或JDK環境eclipse下載地址&#xff1a;JDK下載地址&#xff1a;1)安裝JDK或JRE注&#xff1a;JDK使用與開發者運用&#xff0c;其中包含了開發環境和運行環境。而JRE只包含了java的運行環境。2)配置設置執行路徑UNiX&#xff1a;在C…

php截取指定字符串之后,php截取字符串(截取指定字符串之間的字符串)

一、PHP截取兩個指定字符后邊的字符$a "123abc#456";$b (strpos($a,""));$c (strpos($a,"#"));echo substr($a,$b1,$c-1);二、常用截取字符串技巧。//構造字符串$str "ABCDEFGHIJKLMNOPQRSTUVWXYZ";echo "原字符串&#xff1a;…

php 日志按天截取,Laravel 日志管理:按日期切割日志

日志存儲Laravel 默認的錯誤文件記錄在一個文件里&#xff0c;隨著時間的推移&#xff0c;此文件將會變得巨大&#xff0c;不方便查閱。我們可以通過修改 config/app.php 配置文件中的 log 選項來配置 Laravel 使用的存儲機制。如果你希望每天產生日志都存放在不同的文件中&…