人生不能重來,但 Git 可以
...人生中,我們常常會後悔某些決定,但卻無法回到過去重新來過。然而,在軟體開發的世界中,有一個強大的工具可以幫助我們紀錄、回顧和修正過去的決定,這個工具就是 Git 而其中強大的功能就是 git reset
reset = become 的概念,也可以說是對 git 說我想要變成xxx的樣子
假設一個專案已經 commit 5次分別是:
A1 -> A2 -> A3 -> A4(a3742e17) -> A5(main/HEAD所在)
$ git reset a3742e17 #目前的分支以及 HEAD 由 A5移動到 A4 這個提交a3742e17(commit)
A5 會暫時移動到工作目錄(預設行為) 後面的參數決定檔案去留
git reset commit編號 後面加上--mixed / soft / hard
mixed
: 把檔案丟回工作目錄soft
: 把檔案丟回暫存區hard
: 直接丟掉
別擔心,可以用 git reflog
指令去查看,Git 保留了一個叫做 reflog 的日誌,它記錄了分支和 HEAD 的移動歷史。就可以使用 git reflog 指令來找這些日誌,找到之前的提交位置。然後用 git reset 將 HEAD 移回到之前的位置,進行恢復就行了
# 查看 reflog
$ git reflog
# 使用 reflog 恢復 HEAD 到指定位置
$ git reset --hard HEAD@{N}
tips: N 是你想要恢復到的 reflog 的索引
在剛剛的示範中如果想要再變成上一步 A3 可以用 ^
表示,等於是我想要回到A4前一個狀態,或是使用HEAD~1
後面的數字代表要變成HEAD的前一個狀態
$ git reset a3742e17^ # 由A4 變成 A3
$ git reset HEAD~1 # 變成HEAD前一個狀態
一般專案協作會在 GitHub 上操作,首先第一次需要先 clone 專案到你的本地端,記得要確定有先 checkout 到 main(dev)
接著要從 git 拉下來的一個最新的 main 或是 dev 的分支
$ git pull origin main(dev)
替自己建立一個分支(貼上標籤) issue_n(這就是你要做的功能或是修改之類的,想一個好的名字讓你可以清楚知道自己在做什麼)
$ git branch issue_n
接著在本機完成做XX功能或是xx修改等等,每次做完在本機存檔然後輸入:
$ git add <新增/更改的文件檔案> # 除非你確定所有檔案都要推上去才用 $ git add .
$ git commit -m "說明提交"
當做完確定要上傳 push 到 GitHub 前請切換到最新的分支 main/dev
$ git checkout dev
下載 GitHu 上最新的 main/dev
$ git pull origin main(dev)
接著切回自己實作的分支
$ git checkout issue_n
rebase 確認是否有衝突要解
$ git rebase main(dev)
如果有的話就解衝,解完記得 存檔 git add
然後git rebase --continue
接著上傳到 GitHub
$ git push origin issue_n # 把本機的issue_n分支推到遠端的儲存庫
然後就可以發 PR 給協作者們,在 PR 的說明也是越清楚越好讓協作者們去看 PR ,可以用截圖或是錄製影片的方式搭配文字說明,就跟 ruby on rails 一樣, 可讀性
是非常重要的!
Day 19 預計介紹 Rails 的 CRUD,我們明天見!