iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天 Git 版本控制實戰筆記系列 第 10

Day 10:Git Rebase 進階操作 - 整理提交歷史

  • 分享至 

  • xImage
  •  

今日目標
• 理解 Git Rebase 與 Merge 的差異
• 學習整理提交歷史的技巧
• 掌握 Interactive Rebase 進階操作
• 建立專業的程式碼提交習慣
為什麼需要 Git Rebase?
職場真實情況:
你的提交歷史:
A → B → C → 修復錯字 → 再修復錯字 → 修正縮排 → 完成功能

主管看到:「這提交歷史好亂...」

用 Rebase 整理:
A → B → C → 完成功能

主管:「很乾淨專業的提交歷史!」
Rebase vs Merge 比較:
Merge(合併):
main: A---B---C-------F
\ /
feature: D---E
• 保留完整歷史
• 會產生合併節點
• 歷史比較複雜
Rebase(重新定基):
main: A---B---C---D'---E'
• 線性歷史
• 看起來更乾淨
• 專業感更強
操作步驟
步驟1:建立練習環境

確保在專案資料夾

cd company-website
git checkout main
git pull origin main

建立新功能分支

git checkout -b feature/news-section

查看目前狀態

git log --oneline -3
步驟2:建立新聞區塊功能(故意做多個小提交)
建立 news.html:

<h1>最新消息</h1>

.news-item {
border-bottom: 1px solid #eee;
padding: 20px 0;
}

.news-date {
color: #666;
font-size: 0.9em;
}
第三次提交:
git add css/css_style.css
git commit -m "add news styles"
修正樣式(故意的小修改):
/* 修改 .news-container /
.news-container {
max-width: 800px;
margin: 30px auto;
padding: 0 20px; /
新增這行 */
}
第四次提交:
git add css/css_style.css
git commit -m "fix news container padding"
加入更多新聞:

你會看到類似:

a1b2c3d add more news items

e4f5g6h fix news container padding

i7j8k9l add news styles

m1n2o3p add news list

q4r5s6t add news page structure

Git Rebase 實戰操作
步驟4:使用 Interactive Rebase 整理歷史
指令詳解:
git rebase -i HEAD~5
├── git rebase # Git 的 rebase 功能
├── -i # interactive(互動式)
├── HEAD # 目前分支的最新提交
└── ~5 # 往前數 5 個提交
執行 rebase:

重新整理最近 5 個提交

git rebase -i HEAD~5

會開啟編輯器,顯示類似內容:

pick q4r5s6t add news page structure

pick m1n2o3p add news list

pick i7j8k9l add news styles

pick e4f5g6h fix news container padding

pick a1b2c3d add more news items

在編輯器中修改(將小修改合併):
pick q4r5s6t add news page structure
pick m1n2o3p add news list
pick i7j8k9l add news styles
squash e4f5g6h fix news container padding
pick a1b2c3d add more news items
儲存並關閉編輯器
接下來會要求輸入合併後的提交訊息:

會顯示:

add news styles

fix news container padding

修改為:

feat: add news page styles with proper container layout
步驟5:檢查整理後的歷史

查看整理後的提交歷史

git log --oneline

現在變成:

x1y2z3a add more news items

b4c5d6e feat: add news page styles with proper container layout

f7g8h9i add news list

j1k2l3m add news page structure

步驟6:與 main 分支同步(Rebase onto main)

假設 main 分支有新的更新

git checkout main
git pull origin main

回到功能分支

git checkout feature/news-section

將功能分支重新定基到最新的 main

git rebase main

如果有衝突,解決後:

git add .

git rebase --continue

步驟7:推送整理後的分支

第一次推送

git push origin feature/news-section

如果之前已經推送過,需要強制推送(小心使用)

git push -f origin feature/news-section

Rebase 進階技巧
常用的 Interactive Rebase 指令:
pick = 保留提交
squash = 合併到前一個提交(保留訊息)
fixup = 合併到前一個提交(丟棄訊息)
edit = 暫停讓你修改提交
drop = 刪除提交
reword = 修改提交訊息
實用範例:

修改最後一個提交訊息

git rebase -i HEAD~1

合併最近 3 個提交

git rebase -i HEAD~3

刪除某個提交

git rebase -i HEAD~5 # 然後將要刪除的改為 drop
注意事項與最佳實踐
⚠️ Rebase 使用時機:
✅ 適合使用:

  • 整理自己分支的提交歷史
  • 功能分支尚未推送或分享
  • 想要乾淨的線性歷史

❌ 避免使用:

  • 已經推送並與他人共享的分支
  • main 或 develop 等共用分支
  • 不確定影響範圍的情況
    ✅ 最佳實踐:

1. 功能完成前整理歷史

git rebase -i HEAD~5

2. 與主分支同步

git rebase main

3. 最後才推送乾淨的歷史

git push origin feature/branch-name
完整工作流程範例
步驟8:完成新聞功能並提交 PR

檢查最終狀態

git log --oneline
git status

推送完整功能

git push origin feature/news-section

然後在 GitHub 建立 PR

echo "在 GitHub 建立 PR:"
echo "標題:feat: 新增最新消息頁面"
echo "說明:完整的新聞展示功能,包含響應式設計"
今日重點回顧
• ✅ 理解 Rebase 與 Merge 的差異
• ✅ 學會使用 Interactive Rebase 整理歷史
• ✅ 掌握提交訊息的合併技巧
• ✅ 建立乾淨專業的提交習慣
核心指令總結
git rebase -i HEAD~n # 互動式重新定基最近 n 個提交
git rebase main # 將當前分支重新定基到 main
git rebase --continue # 解決衝突後繼續
git rebase --abort # 取消 rebase 操作
明天預告
Day 11 - Git Tag 版本標記:學會為重要版本打標籤,建立專業的版本管理!


🎉 恭喜完成 Day 10!現在你能建立專業乾淨的提交歷史了!


上一篇
Day 9:Git Stash 暫存技巧 - 工作切換神器
下一篇
Day 11:Git Tag 版本標記 - 專業版本管理
系列文
30天 Git 版本控制實戰筆記13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言