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埠配置
然後在提交到遠端覆蓋。