1. 程式人生 > >git 撤銷暫存區

git 撤銷暫存區

git的撤銷與回滾在平時使用中還是比較多的,比如說我們想將某個修改後的檔案撤銷到上一個版本,或者是想撤銷某次多餘的提交,都要用到git的撤銷和回滾操作。撤銷分兩種情況,一個是commit之前,一個是commit之後,下面具體看下這兩種情況。

  一.git commit之前

        未新增到暫存區的撤銷(沒有git add)

        新增進暫存區的撤銷(git add後)

複製程式碼

$ git status
On branch test_git
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: new_src/app/Http/Controllers/Frontend/KyHome/KyHomeUnitTrait.php
    modified: new_src/app/Http/Controllers/Frontend/KyHome/KyHomeWordFilterTrait.php

複製程式碼

可以通過

 git checkout -- filename來撤銷修改
git checkout -- new_src/app/Http/Controllers/Frontend/KyHome/KyHomeWordFilterTrait.php

再次檢視檔案狀態發現選擇的檔案已經成功被撤銷了。

複製程式碼

$ git status
On branch test_git
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: new_src/app/Http/Controllers/Frontend/KyHome/KyHomeUnitTrait.php
    

複製程式碼

如果想將多個檔案一次性撤銷可以用

 git checkout -- .

上面是 未新增到暫存區的撤銷

下面是新增到暫存區的

複製程式碼

$ git status
On branch test_git
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:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php
        modified:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeComment.php

複製程式碼

複製程式碼

$ git add -A
$ git status
On branch test_git
Changes to be committed:    已經新增暫存區了
  (use "git reset HEAD <file>..." to unstage)

        modified:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php
        modified:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeComment.php

複製程式碼

從暫存區撤銷

$ git reset HEAD new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php
Unstaged changes after reset:
M       new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php

如果想一次性將所有暫存區檔案撤銷回來,還是上面的命令,不過不用加檔案路徑。

$ git reset HEAD
Unstaged changes after reset:

M       new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php
M       new_src/app/Http/Controllers/Frontend/KyHome/KyHomeComment.php

二.git commit之後

如果當commit提交後想撤銷的話,這就需要revert命令。git revert 命令是撤銷某次操作,而在此次操作之前和之後的提交記錄都會保留。

先修改了幾個檔案然後commit 再用git log檢視提交記錄。

commit 2842c8065322085c31fb7b8207b6296047c4ea3
Author: songguojun <[email protected]>
Date:   Sat Apr 28 11:21:30 2018 +0800

    add content

然後使用revert  後面跟上git提交的commitid

git  revert 2842c8065322085c31fb7b8207b6296047c4ea3

複製程式碼

Revert "add content"

This reverts commit 2842c8065ffe2085c31fb7b8207b6296047c4ea3.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch test_git
# Changes to be committed:
#       modified:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeApp.php
#       modified:   new_src/app/Http/Controllers/Frontend/KyHome/KyHomeComment.php

複製程式碼

然後在推送到遠端更新遠端倉庫程式碼,修改的檔案就撤銷回來了。注意的是revert奇數次生效,偶數次又回到之前的修改狀態。比如一個檔案內容是a,那麼修改為ab,revert後文件變成了a,如果在revert後文件又還原成ab了。

還有就是如果想回到之前某個版本,可以用reset命令,可以回退到某次提交,那該提交之後的提交都會回滾,不過這種覆蓋是不可逆的,之前的提交記錄都沒有了。所以平時開發中儘量注意,避免使用reset。

用法:

git  reset --hard  commit_id
  • --hard – 強制將快取區和工作目錄都同步到你指定的提交
 git  reset --hard fdeb212a5418cc8e31f32d63cf197550297468ec
HEAD is now at fdeb212 增加mysql埠配置

然後在提交到遠端覆蓋。