前言
這次給大家帶來Git稍微高級一點的用法,上一篇基礎篇還沒看的同學可以去看看,傳送門:Git教程——入門基礎
撤銷
撤銷工作區的修改
單個文件
git checkout HEAD README.md
多個文件
git checkout HEAD README.md SUMMARY.md
所有文件
git checkout HEAD .
關于 checkout
,除了切換分支、撤銷修改以外,還有一個很好的用法,就是快速查看項目舊版本,比如
git checkout commitId
通過傳入歷史提交的 id,將 HEAD 移動到相應的歷史提交處,方便查看歷史代碼
取消暫存
單個文件
git reset HEAD README.md
多個文件
git reset HEAD README.md SUMMARY.md
所有文件
git reset HEAD .
取消暫存并撤銷工作區的修改,以所有文件為例
git reset --hard HEAD .
復位到上上次提交(HEAD代表上次提交)
git reset --hard HEAD^^
復位到歷史某一次提交
git reset --hard commitId
反轉提交
有時候你可能想撤銷某次提交,但不想改變提交歷史,這時候可以用revert
Revert:撤銷一個提交的同時會創建一個新的提交。這是一個安全的方法,因為它不會重寫提交歷史。
git log
查看歷史提交
commit e19c68095958937387cfb7ccd9a870448e7d4495 (HEAD -> master)
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:54 2017 +0800
third
commit 0f90338c7bbeced9e486e5c4448881316538b3e8
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:37 2017 +0800
second
commit 2695da1b0503c514a476f126ecc8b8ec2847de1c
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 14:52:59 2017 +0800
first
你想對撤銷 third
這次提交,你可以
git revert HEAD
再 git log
查看提交
commit 9073bf136a0f4be829834ce85b9b293007d27067 (HEAD -> master)
Author: Charming <cm19951018@gmail.com>
Date: Mon Nov 13 15:09:30 2017 +0800
Revert "third"
This reverts commit e19c68095958937387cfb7ccd9a870448e7d4495.
commit e19c68095958937387cfb7ccd9a870448e7d4495
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:54 2017 +0800
third
commit 0f90338c7bbeced9e486e5c4448881316538b3e8
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:37 2017 +0800
second
commit 2695da1b0503c514a476f126ecc8b8ec2847de1c
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 14:52:59 2017 +0800
first
發現多了一次 Revert "third"
的提交,這次提交為了撤銷 third
而創建的,屬于一次反提交。這樣,既達到了撤銷的效果,也保存了歷史提交,這種用法一般在主分支上
變基
當你想對歷史某一次提交進行修改,又不想增加新的提交時,可以使用變基操作。
比如:你正在進行開發,你發現有個參數名寫錯了,屬于小問題,而這個參數正是你歷史提交中某一次引入的,你想修改這個參數名而不產生新提交,這時候可以使用變基
git rebase -i commitId
先查看歷史提交 git log
commit 87ca1e73c3cf59966f07c6ee657af4ade18a8061 (HEAD -> master)
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:54 2017 +0800
third
commit b1fb0abe4355f2df1d607b65b326d3b79a32772d
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:37 2017 +0800
second
commit 2695da1b0503c514a476f126ecc8b8ec2847de1c
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 14:52:59 2017 +0800
first
你想對 second
這次提交進行修改,你可以變基到 first
提交,也就是以 first
提交為基礎(想修改最近n次提交的其中一次,可以使用 git rebase -i 最近第n+1次提交的id
列出最近n次提交,然后挑選要修改的提交)
因此
git rebase -i 2695da1b0503c514a476f126ecc8b8ec2847de1c
這時候會出現
pick 0f90338 second
pick e19c680 third
修改為
edit 0f90338 second
pick e19c680 third
保存退出,git log
commit 0f90338c7bbeced9e486e5c4448881316538b3e8 (HEAD)
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 15:17:37 2017 +0800
second
commit 2695da1b0503c514a476f126ecc8b8ec2847de1c
Author: Charming <cm19951018@gmail.com>
Date: Sun Nov 12 14:52:59 2017 +0800
first
這時候你可以對 second
提交進行修改,然后增補提交
git add .
git commit --amend
修改完提交,結束變基,回到最新的提交結點
git rebase --continue
若是想取消變基操作,放棄修改,則可以
git rebase --abort
總結
checkout
、reset
、revert
和 rebase
是幾個非常容易混淆的命令,通過學習理解它們對工作區、暫存區和提交歷史的影響,想必現在你已經對在什么場景使用什么命令已經非常清楚了吧
下面這個表格總結了這些命令最常用的使用場景。記得經常對照這個表格,因為你使用 Git 時一定會經常用到
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改 |
git reset | 文件層面 | 將文件從緩存區中移除 |
git checkout | 提交層面 | 切換分支或查看舊版本 |
git checkout | 文件層面 | 舍棄工作目錄中的更改 |
git revert | 提交層面 | 在公共分支上回滾更改 |
git revert | 文件層面 | 無 |