git操作之二:git restore

迷茫中守候發表於2020-11-18

在上篇部落格中留了一個問題,那就是git restore命令是做什麼的,下面重點分析。

一、概述

git restore命令是撤銷的意思,也就是把檔案從快取區撤銷,回到未被追蹤的狀態。

該命令有git restore <file>和git restore --staged <file>兩種常用的用法。

二、詳述

在git中有工作區、暫存區、倉庫區(原生程式碼區)三部分,要注意git restore命令在工作區是不會其作用的,也就是一個檔案在工作區,使用git restore是不起作用的。如下圖

MyFirst2.java該檔案未被加入暫存區,也就是未使用過git add MyFirst2.java命令,那麼使用git restore命令如下,

可見使用git restore命令報錯。從使用git status命令檢視的結果也可以看出,對應在工作區未使用過git add命令的檔案,是untracked files的檔案,需要使用git add命令,加入暫存區,那麼放到暫存區的檔案如何回到工作區那,下面再看下git status 的截圖

從上面的圖片中知道MyFirst.java在暫存區中,看上邊的提示git restore --staged <file>也就是使用該命令可以把檔案從暫存區撤銷到工作區(前提是該檔案未被修改),下面使用git restore --staged <file>命令的截圖

從上圖中可以看到暫存區中已無該檔案,而在untracked files(工作區)中有src/資料夾(該資料夾下的所以檔案均未被追蹤),下面使用git add src/命令,

可以看到src下的兩個檔案均新增到了暫存區。現在把MyFirst.java檔案進行修改,如下

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");

    }

}

使用git status檢視狀態,

從上面可以看出MyFirst.java出現了兩次,第一次提示是使用git restore --stage <file>,下面使用該命令並檢視git的狀態

可以看到MyFirst.java從暫存區被移除了,現在看檔案本身是否有變化

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");

    }

}

從上面看無變化,也就是git restore --staged <file> 會把檔案從暫存區移除,檔案的修改不會受影響。下面看第二種情況。再貼上上面的圖,

此時MyFirst.java是下面的樣子,

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");
        System.out.println("b");

    }

}

此時,使用git restore <file>命令並檢視狀態,

此時,檢視MyFirst.java檔案的內容,

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");

    }

}

看到檔案的內容第二行列印沒有了,為什麼那,因為第二行列印是再把MyFirst.java加到暫存區後新增的,也就是在把檔案加到暫存區後對檔案進行修改,再執行git restore <file>會撤銷檔案的修改,撤銷到最近一次執行git add的內容。

下面把MyFirst提交到本地倉庫,提交後的內容為,

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");

    }

}

在該基礎上進行修改,修改為下面的內容,

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");
        System.out.println("提交後修改");

    }

}

下面看git的狀態,

看到上邊給出了兩個提示,先使用git restore <file>命令,

檔案內容,

package cn.com.my;

public class MyFirst {
    public static void main(String[] args) {
        System.out.println("a");

    }

}

可以看到使用git restore <file>後檔案恢復為提交的狀態。如果是使用git add命令,

可以看到使用了git add <file>後檔案被加到了暫存區,需要重新提交到本地倉庫。

三、總結

本文分析了git restore --stage <file>和git restore <file>兩個命令,總結如下,

1、檔案在暫存區且未作修改的情況

使用git restore --staged <file> 把檔案從暫存區移動到工作區,即檔案不被追蹤;

2、檔案在暫存區且已經修改的情況

使用git restore --staged <file> 把檔案從暫存區移動到工作區,且不會撤銷修改的內容;

使用git restore <file> 檔案仍在暫存區且會撤銷檔案修改的內容;

3、檔案在原生程式碼庫已經修改的情況

使用git add <file> 把檔案重新放到暫存區,且保留檔案的修改;

使用git restore <file> 檔案仍在原生程式碼庫且會撤銷檔案的修改;

對於git restore <file>命令,會撤銷檔案的修改,使檔案恢復到暫存區或原生程式碼庫(取決於檔案在修改前的狀態);

對於git restore --staged <file>命令,把檔案從暫存區撤回到工作區,保留檔案最後一次修改的內容;

 

有不正之處,歡迎指正,感謝!