前言

在之前寫了一篇🚀Github 最正規的協作工作流的文章中,和大家推薦的非常專業的码农高天又出新的內容了。

這次的影片是關於使用git過程中的撤銷操作的,我一樣整理成筆記並加上一些自己的補充記錄下來。

而且才短短兩三個月,他訂閱人數已經衝到8000多了,果然寶藏是不會被埋沒的嗎 🤩

初始狀態

在git運作流程中,包含4個區域

  • Disk:硬碟實際儲存的內容
  • Staging:暫存區
  • Local:本地的git
  • Remote:遠端的git(例如Github

假設在初始狀態下,4個區域目前都是同步的,都是Init

Disk層級的修改&撤銷

修改

何時產生修改?

當一個已經被git追蹤的檔案,只要被修改後
就會自動被追蹤到

如何查看變化?

git diff # 查看目前修改後的文件,有什麼不同

撤銷

使用git restore撤銷Disk的修改

git restore <changed_file> # 舊版本會使用 git checkout

在比較早版本的git checkout有兩個功能:

  • 切換分支:目前仍然使用,如git checkout <branch>
  • 檢出文檔:目前被git restoregit switch取代

Staging層級的修改&撤銷

修改

何時產生修改?

對於Disk層級的修改,使用

git add <changed_file>

即可添加到git追蹤的暫存區

如何查看變化?

git status # changes to be committed

撤銷

只撤銷Staging層級的修改

git restore --staged <chaged_file> # 亦可使用 git reset
  • 效果是讓Commit的時候不會包含該檔案變化
  • 不會對Disk的程式進行修改
  • 只會撤銷前面的git add操作

撤銷到Disk層級的修改

git checkout HEAD <changed_file>
  • HEAD 表示最近的一次Commit
    • 目前就是Init
  • 同時撤銷
    • 檔案在的硬碟的修改
    • 添加到 git 暫存區的部分

Local層級的修改&撤銷

修改

何時產生修改?

對於Staging層級的修改,使用

git commit

此修改就成為了一個commit被加入到local git中

如何查看變化?

git log # 查看 commit 記錄

一些相關參數

  • --oneline:以簡潔的單行方式顯示提交歷史。
  • --graph:以圖形化的方式顯示提交歷史的分支和合併情況。
  • --stat:顯示每個提交的簡要統計信息,包括修改的文件和行數變化。
  • --author=<author>:只顯示特定作者的提交歷史。
  • <file>:只顯示與特定文件相關的提交歷史。
  • --since=<date>:只顯示從指定日期之後的提交歷史。

撤銷

只撤銷Local git層級的修改

git reset --soft HEAD~1
  • HEAD~1表示前一個commit
  • 透過移動HEAD的位置,撤銷到前一個commit
  • --soft表示不撤銷暫存區內容,差異見下方
  • 效果
    • Disk:不變
    • Staging:不變
    • Local:撤銷

撤銷Local git與Staging層級的修改

git reset HEAD~1

# 等價於
# git reset --mixed HEAD~1
  • Disk:不變
  • Staging:撤銷
  • Local:撤銷

撤銷Local git、Staging、Disk層級的修改

git reset --head HEAD~1
  • Disk:撤銷
  • Staging:撤銷
  • Local:撤銷

[!warning]
這個修改指令雖然是可以撤銷
但是操作起來會很麻煩

另一種撤銷方式:revert

效果是建立一個反作用的commit並加在後面

  • 若前面加一行,則添加一個減一行的commit
  • 這個反作用commit稱為:-change

使用revert抵銷最後一個commit

git revert HEAD
  • 增加一個 -change commit,來抵銷最後一個commit的效果

使用revert的好處

  • reset:只能撤銷到前N個commit的位置
  • revert:可以撤銷其中任意一個commit的效果
git revert <commit_id>

Remote層級的修改&撤銷

修改

何時產生修改?

對於Local層級的修改,使用

git push

就可以把修改的變化push到遠端

公有分支 vs. 個人分支

  • 公有分支
    • 不只你自己一個人在使用
    • 例如:大多數項目的主分支
    • 只能往前、不能後退
      • 因為只要做了刪除操作,其他人的分支就會被弄亂
  • 個人分支
    • 自己一個人使用的分支
    • 例如:自己的feature branch

撤銷

撤銷公有分支

git revert HEAD
git push
  • 因為無法在公有分支上刪除commit
  • 所以必須要使用revert

撤銷私人分支

git reset --head HEAD~1
git push -f
  • 必須使用push -f強制推送

整理

內容整理成圖片,歡迎有需要的存下來收藏。