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 <songgj@kingnet.sh> 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端口配置
然后在提交到遠端覆蓋。