SlideShare a Scribd company logo
5
Most read
9
Most read
10
Most read
git merge 與 rebase 的
觀念與實務應用
多奇數位創意有限公司
技術總監 黃保翕 ( Will 保哥 )
部落格:http://blog.miniasp.com/
關於「合併」的觀念解析
The "Merge" Concepts
常見的三種合併方法 (Merge)
• 關於 Git 的快轉機制 (Fast-forward)
– 所謂的「快轉機制」,就是 Git 得知這個合併的過程,其實會依序套用
new_feature 原本就有的變更,所以在合併的時候會直接修改 master 分
支的 HEAD 參照位址,直接移動到 new_feature的 HEAD 那個版本。
• 正常的合併
– git checkout master
– git merge new_feature
• 不快轉的合併
– git checkout master
– git merge new_feature --no-ff
• 壓縮的合併
– git checkout master
– git merge new_feature --squash
不同的合併方式
• git merge <branch1> <branch2> <branch3> …
• git merge --no-ff
• git merge –squash
• git rebase <commit_id>
• git rebase <commit_id> -I
• git cherry-pick <commit_id>
• git revert <commit_id>
一般的合併方法
• 主要步驟
– 先切換至最終要合併完成的分支
• git checkout -b master
– 將另一個分支的變更合併回來
• git merge <new_feature_branch>
– 若合併成功
• 會自動引發一個新的 commit
– 若合併失敗 (發生衝突)
• 會停留在 Unmerged 狀態,需人工介入處理
• 處理完衝突,需繼續完成合併動作 (需做一次commit動作)
– git add
– git commit
• 放棄衝突,可選擇復原至合併前的狀態
– git reset --hard
安全的合併方法
• 方法 1
– git checkout -b merge1
– git merge <new_feature_branch>
– 若合併成功
• git checkout master
• git merge merge1 (Fast-forward)
• git branch –d merge1
– 若合併失敗
• git checkout master
• git branch -D merge1
安全的合併方法
• 方法 2
– git tag -f try_merge_master
– git merge <new_feature_branch>
– 若合併成功
• git tag -d try_merge_master
– 若合併失敗
• git reset try_merge_master --hard
• git tag -d try_merge_master
重新指定基礎位置 (Rebase)
• 將另一個分支當成目前分支的起點
– git checkout branch1
– git rebase master
– git rebase --continue
– git rebase --abort
– git rebase --skip
• 主要任務
– 先找出兩個分支之間的共同起點
– 將目前分支的所有變更套用在另一個分支
• 這就是所謂【重新指定基礎位置】的意思
• 是一個版本一個版本的套用變更
• 注意事項
– 不要在 git rebase 發生衝突的過程中執行 git commit 命令
– 如果真的做了,請改執行 git rebase --skip 跳過這一版套用
MERGE 與 REBASE 的線圖差異
• MERGE
– git checkout master
– git merge branch1
• REBASE
– git checkout branch1
– git rebase master
– git checkout master
– git merge branch1
• REBASE + MERGE --no-ff
– git checkout branch1
– git rebase master
– git checkout master
– git merge branch1 --no-ff
了解 MERGE 與 REBASE 的差異
• 相同之處
– 都是合併的一種,但合併的方式與步驟不同
• MERGE 如何合併
– 假設你有一個 new_feature 分支想合併回 master
– 你會這樣執行
• git checkout master
• git merge new_feature (會建立起一條分支線圖)
• REBASE 如何合併
– 假設你有一個 new_feature 分支想合併回 master
( 事實上是將自己的所有變更 commit 在 master 最新版後面)
– 你會這樣執行
• git checkout new_feature
• git rebase master (會讓 new_feature 併進 master 的線圖上)
• git checkout master
• git merge new_feature
Rebase 能做的事
• 0. 重新 commit (Pick)
• 1. 調換 commit 的順序
• 2. 修改 commit 的訊息 (Edit)
• 3. 插入一個 commit
• 4. 編輯一個 commit
• 5. 拆解一個 commit
• 6. 壓縮一個 commit,且合併訊息紀錄 (Squash)
• 7. 壓縮一個 commit,但丟棄版本紀錄
• 8. 刪除一個 commit (Skip)
關於「合併」的實務應用
The "Merge" Best Practices
正常合併
• 預設會啟用 快轉 (fast-forward) 機制
• 給自己專用的小分支可以直接這樣用的
– 允許一條線畫到底的情境
• 本地 功能分支 (feature branch) 常用
13
不快轉合併 ( --no-ff )
• 用來確保主要分支的線圖保持乾淨
• 本地分支合併回主線時使用
– 主線可能是 master 或 develop
• 遠端分支合併時預設採用這個模式
– GitHub
14
正常變基 ( Rebase )
• 用來確保整體分支線圖保持乾淨
• 通常是在 git pull 的時候發生使用
– 請記得:一個本地分支配一個遠端分支
• 還有在整理分支線圖時會用到
15
常用於有遠端儲存庫的情境
• git pull
– git fetch
– git merge
• git pull --rebase
– git fetch
– git rebase
– 此設定為 GitHub Desktop 的預設值
– 使用 git pull --rebase 可有效避免無謂的合併線圖
使用 git rebase 避免無謂的 merge | ihower { blogging }
http://ihower.tw/blog/archives/3843
• 把 rebase 當做 git pull 的預設
值
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
總結
Summary
關於 Git 合併與變基
• Git 打從骨子裡都是分支與合併
• Git 的分支與合併既便宜又安全!
– git reflog
• 釐清 merge 與 rebase 的用途與使用情境
18
聯絡資訊
• The Will Will Web
記載著 Will 在網路世界的學習心得與技術分享
– http://blog.miniasp.com/
• Will 保哥的技術交流中心 (臉書粉絲專頁)
– http://www.facebook.com/will.fans
• Will 保哥的噗浪
– http://www.plurk.com/willh/invite
• Will 保哥的推特
– https://twitter.com/Will_Huang

More Related Content

What's hot (20)

PDF
Git Tutorial 教學
Wen-Tien Chang
 
PDF
Git - An Introduction
Behzad Altaf
 
PPT
Introduction to Git Commands and Concepts
Carl Brown
 
PDF
Git and github 101
Senthilkumar Gopal
 
PDF
Git tutorial
Elli Kanal
 
PDF
Git Started With Git
Nick Quaranto
 
PPTX
Intro to git and git hub
Venkat Malladi
 
PDF
Introducing GitLab (June 2018)
Noa Harel
 
PPTX
Git Lab Introduction
Krunal Doshi
 
PDF
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
PDF
What's New for GitLab CI/CD February 2020
Noa Harel
 
PDF
Git slides
Nanyak S
 
PDF
Intro to Git and GitHub
Panagiotis Papadopoulos
 
PPTX
Git
Shinu Suresh
 
PDF
Git and git flow
Fran García
 
PPTX
A successful Git branching model
abodeltae
 
PPTX
工程師必備第一工具 - Git
Alan Tsai
 
PDF
Git 입문자를 위한 가이드
chandler0201
 
PPTX
Introduction to Git/Github - A beginner's guide
Rohit Arora
 
PDF
Git real slides
Lucas Couto
 
Git Tutorial 教學
Wen-Tien Chang
 
Git - An Introduction
Behzad Altaf
 
Introduction to Git Commands and Concepts
Carl Brown
 
Git and github 101
Senthilkumar Gopal
 
Git tutorial
Elli Kanal
 
Git Started With Git
Nick Quaranto
 
Intro to git and git hub
Venkat Malladi
 
Introducing GitLab (June 2018)
Noa Harel
 
Git Lab Introduction
Krunal Doshi
 
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
What's New for GitLab CI/CD February 2020
Noa Harel
 
Git slides
Nanyak S
 
Intro to Git and GitHub
Panagiotis Papadopoulos
 
Git and git flow
Fran García
 
A successful Git branching model
abodeltae
 
工程師必備第一工具 - Git
Alan Tsai
 
Git 입문자를 위한 가이드
chandler0201
 
Introduction to Git/Github - A beginner's guide
Rohit Arora
 
Git real slides
Lucas Couto
 

Viewers also liked (20)

PPTX
ASP.NET 5 的創新與變革
Will Huang
 
PPTX
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
Will Huang
 
PPTX
簡介 GitHub 平台
Will Huang
 
PPTX
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
Will Huang
 
PPTX
Growth Mindset 經驗分享
Will Huang
 
PPTX
Visual Studio 2015 與 Git 開發實戰
Will Huang
 
PPTX
開發人員不可不知的 Windows Container 容器技術預覽
Will Huang
 
PPTX
Visual Studio 2017 新功能探索 (Study4.TW)
Will Huang
 
PPTX
簡介 Git hub 平台 ( 1.5 hrs )
Will Huang
 
PPTX
SQL Server 資料庫版本控管
Will Huang
 
PPTX
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
Will Huang
 
PPTX
初學者都該了解的 HTTP 通訊協定基礎
Will Huang
 
PPTX
DEV305 - ASP.NET 5 開發攻略
Will Huang
 
PPTX
你所不知道的 Microsoft Azure 雲端資源採購技巧 (2016 Azure 新春特惠方案)
Will Huang
 
PPTX
快速上手 Windows Containers 容器技術 (Docker Taipei)
Will Huang
 
PPTX
中小企業選擇雲端服務的實戰密技
Will Huang
 
PPTX
Azure Web App on Linux @ Global Azure Bootcamp 2017 Taiwan
Will Huang
 
PPTX
使用 Visual Studio Code 建構 JavaScript 應用程式
Will Huang
 
PPTX
Windows Container 101: dotNET, Container, Kubernetes
Will Huang
 
PPTX
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang
 
ASP.NET 5 的創新與變革
Will Huang
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
Will Huang
 
簡介 GitHub 平台
Will Huang
 
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
Will Huang
 
Growth Mindset 經驗分享
Will Huang
 
Visual Studio 2015 與 Git 開發實戰
Will Huang
 
開發人員不可不知的 Windows Container 容器技術預覽
Will Huang
 
Visual Studio 2017 新功能探索 (Study4.TW)
Will Huang
 
簡介 Git hub 平台 ( 1.5 hrs )
Will Huang
 
SQL Server 資料庫版本控管
Will Huang
 
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
Will Huang
 
初學者都該了解的 HTTP 通訊協定基礎
Will Huang
 
DEV305 - ASP.NET 5 開發攻略
Will Huang
 
你所不知道的 Microsoft Azure 雲端資源採購技巧 (2016 Azure 新春特惠方案)
Will Huang
 
快速上手 Windows Containers 容器技術 (Docker Taipei)
Will Huang
 
中小企業選擇雲端服務的實戰密技
Will Huang
 
Azure Web App on Linux @ Global Azure Bootcamp 2017 Taiwan
Will Huang
 
使用 Visual Studio Code 建構 JavaScript 應用程式
Will Huang
 
Windows Container 101: dotNET, Container, Kubernetes
Will Huang
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang
 
Ad

Similar to git merge 與 rebase 的觀念與實務應用 (20)

ODP
Git 教學
Ming-Sian Lin
 
PPTX
Git基礎介紹
Max Ma
 
ODP
Git 程式碼版本控制軟體介紹
PingLun Liao
 
PDF
Git 經驗分享
Mu Chun Wang
 
PDF
Git in a nutshell
Nelson Tai
 
PDF
Git 入門與應用
Allen Chou
 
PDF
Intro to Git 投影片
Tony Yeh
 
PDF
How to Use Git?
newegg
 
PPTX
Git &amp; git hub v1.2
Chris Chen
 
PPT
Git簡報
Ted Liang
 
PDF
如何與 Git 優雅地在樹上唱歌
Mu Chun Wang
 
PPTX
Git flow 與團隊合作
Bo-Yi Wu
 
PDF
Introduction to git
Bo-Yi Wu
 
PPTX
Git introduction
mythnc
 
PPT
Patch merge
Chao-Tang Wang
 
PPTX
Git rebase -i
Charile Tsai
 
PDF
初心者 Git 上手攻略
Lucien Lee
 
ODP
Git basis - usage
Eason Cao
 
PDF
Yet another introduction to Git - from the bottom up
Wen-Tien Chang
 
PPTX
Git and git hub
唯 李
 
Git 教學
Ming-Sian Lin
 
Git基礎介紹
Max Ma
 
Git 程式碼版本控制軟體介紹
PingLun Liao
 
Git 經驗分享
Mu Chun Wang
 
Git in a nutshell
Nelson Tai
 
Git 入門與應用
Allen Chou
 
Intro to Git 投影片
Tony Yeh
 
How to Use Git?
newegg
 
Git &amp; git hub v1.2
Chris Chen
 
Git簡報
Ted Liang
 
如何與 Git 優雅地在樹上唱歌
Mu Chun Wang
 
Git flow 與團隊合作
Bo-Yi Wu
 
Introduction to git
Bo-Yi Wu
 
Git introduction
mythnc
 
Patch merge
Chao-Tang Wang
 
Git rebase -i
Charile Tsai
 
初心者 Git 上手攻略
Lucien Lee
 
Git basis - usage
Eason Cao
 
Yet another introduction to Git - from the bottom up
Wen-Tien Chang
 
Git and git hub
唯 李
 
Ad

More from Will Huang (20)

PPTX
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
Will Huang
 
PPTX
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
PPTX
ASP.NET Core 6.0 全新功能探索
Will Huang
 
PPTX
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
Will Huang
 
PPTX
你一定不能不知道的 Markdown 寫作技巧
Will Huang
 
PPTX
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
Will Huang
 
PPTX
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
Will Huang
 
PPTX
Micro-frontends with Angular 10 (Modern Web 2020)
Will Huang
 
PPTX
從實戰經驗看到的 K8S 導入痛點
Will Huang
 
PPTX
RxJS 6 新手入門
Will Huang
 
PPTX
极速 Angular 开发:效能调校技巧 (ngChina 2019)
Will Huang
 
PPTX
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
Will Huang
 
PPTX
Protractor: The Hacker way (NG-MY 2019)
Will Huang
 
PPTX
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
Will Huang
 
PPTX
Angular 开发技巧 (2018 ngChina 开发者大会)
Will Huang
 
PPTX
Angular 7 全新功能探索 (Angular Taiwan 2018)
Will Huang
 
PPTX
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
Will Huang
 
PPTX
AKS 與開發人員體驗 (Kubernetes 大講堂)
Will Huang
 
PPTX
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
Will Huang
 
PPTX
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
Will Huang
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
ASP.NET Core 6.0 全新功能探索
Will Huang
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
Will Huang
 
你一定不能不知道的 Markdown 寫作技巧
Will Huang
 
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
Will Huang
 
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
Will Huang
 
Micro-frontends with Angular 10 (Modern Web 2020)
Will Huang
 
從實戰經驗看到的 K8S 導入痛點
Will Huang
 
RxJS 6 新手入門
Will Huang
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
Will Huang
 
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
Will Huang
 
Protractor: The Hacker way (NG-MY 2019)
Will Huang
 
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
Will Huang
 
Angular 开发技巧 (2018 ngChina 开发者大会)
Will Huang
 
Angular 7 全新功能探索 (Angular Taiwan 2018)
Will Huang
 
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
Will Huang
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
Will Huang
 
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
Will Huang
 
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 

git merge 與 rebase 的觀念與實務應用

  • 1. git merge 與 rebase 的 觀念與實務應用 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/
  • 3. 常見的三種合併方法 (Merge) • 關於 Git 的快轉機制 (Fast-forward) – 所謂的「快轉機制」,就是 Git 得知這個合併的過程,其實會依序套用 new_feature 原本就有的變更,所以在合併的時候會直接修改 master 分 支的 HEAD 參照位址,直接移動到 new_feature的 HEAD 那個版本。 • 正常的合併 – git checkout master – git merge new_feature • 不快轉的合併 – git checkout master – git merge new_feature --no-ff • 壓縮的合併 – git checkout master – git merge new_feature --squash
  • 4. 不同的合併方式 • git merge <branch1> <branch2> <branch3> … • git merge --no-ff • git merge –squash • git rebase <commit_id> • git rebase <commit_id> -I • git cherry-pick <commit_id> • git revert <commit_id>
  • 5. 一般的合併方法 • 主要步驟 – 先切換至最終要合併完成的分支 • git checkout -b master – 將另一個分支的變更合併回來 • git merge <new_feature_branch> – 若合併成功 • 會自動引發一個新的 commit – 若合併失敗 (發生衝突) • 會停留在 Unmerged 狀態,需人工介入處理 • 處理完衝突,需繼續完成合併動作 (需做一次commit動作) – git add – git commit • 放棄衝突,可選擇復原至合併前的狀態 – git reset --hard
  • 6. 安全的合併方法 • 方法 1 – git checkout -b merge1 – git merge <new_feature_branch> – 若合併成功 • git checkout master • git merge merge1 (Fast-forward) • git branch –d merge1 – 若合併失敗 • git checkout master • git branch -D merge1
  • 7. 安全的合併方法 • 方法 2 – git tag -f try_merge_master – git merge <new_feature_branch> – 若合併成功 • git tag -d try_merge_master – 若合併失敗 • git reset try_merge_master --hard • git tag -d try_merge_master
  • 8. 重新指定基礎位置 (Rebase) • 將另一個分支當成目前分支的起點 – git checkout branch1 – git rebase master – git rebase --continue – git rebase --abort – git rebase --skip • 主要任務 – 先找出兩個分支之間的共同起點 – 將目前分支的所有變更套用在另一個分支 • 這就是所謂【重新指定基礎位置】的意思 • 是一個版本一個版本的套用變更 • 注意事項 – 不要在 git rebase 發生衝突的過程中執行 git commit 命令 – 如果真的做了,請改執行 git rebase --skip 跳過這一版套用
  • 9. MERGE 與 REBASE 的線圖差異 • MERGE – git checkout master – git merge branch1 • REBASE – git checkout branch1 – git rebase master – git checkout master – git merge branch1 • REBASE + MERGE --no-ff – git checkout branch1 – git rebase master – git checkout master – git merge branch1 --no-ff
  • 10. 了解 MERGE 與 REBASE 的差異 • 相同之處 – 都是合併的一種,但合併的方式與步驟不同 • MERGE 如何合併 – 假設你有一個 new_feature 分支想合併回 master – 你會這樣執行 • git checkout master • git merge new_feature (會建立起一條分支線圖) • REBASE 如何合併 – 假設你有一個 new_feature 分支想合併回 master ( 事實上是將自己的所有變更 commit 在 master 最新版後面) – 你會這樣執行 • git checkout new_feature • git rebase master (會讓 new_feature 併進 master 的線圖上) • git checkout master • git merge new_feature
  • 11. Rebase 能做的事 • 0. 重新 commit (Pick) • 1. 調換 commit 的順序 • 2. 修改 commit 的訊息 (Edit) • 3. 插入一個 commit • 4. 編輯一個 commit • 5. 拆解一個 commit • 6. 壓縮一個 commit,且合併訊息紀錄 (Squash) • 7. 壓縮一個 commit,但丟棄版本紀錄 • 8. 刪除一個 commit (Skip)
  • 13. 正常合併 • 預設會啟用 快轉 (fast-forward) 機制 • 給自己專用的小分支可以直接這樣用的 – 允許一條線畫到底的情境 • 本地 功能分支 (feature branch) 常用 13
  • 14. 不快轉合併 ( --no-ff ) • 用來確保主要分支的線圖保持乾淨 • 本地分支合併回主線時使用 – 主線可能是 master 或 develop • 遠端分支合併時預設採用這個模式 – GitHub 14
  • 15. 正常變基 ( Rebase ) • 用來確保整體分支線圖保持乾淨 • 通常是在 git pull 的時候發生使用 – 請記得:一個本地分支配一個遠端分支 • 還有在整理分支線圖時會用到 15
  • 16. 常用於有遠端儲存庫的情境 • git pull – git fetch – git merge • git pull --rebase – git fetch – git rebase – 此設定為 GitHub Desktop 的預設值 – 使用 git pull --rebase 可有效避免無謂的合併線圖 使用 git rebase 避免無謂的 merge | ihower { blogging } http://ihower.tw/blog/archives/3843 • 把 rebase 當做 git pull 的預設 值 [branch "master"] remote = origin merge = refs/heads/master rebase = true
  • 18. 關於 Git 合併與變基 • Git 打從骨子裡都是分支與合併 • Git 的分支與合併既便宜又安全! – git reflog • 釐清 merge 與 rebase 的用途與使用情境 18
  • 19. 聯絡資訊 • The Will Will Web 記載著 Will 在網路世界的學習心得與技術分享 – http://blog.miniasp.com/ • Will 保哥的技術交流中心 (臉書粉絲專頁) – http://www.facebook.com/will.fans • Will 保哥的噗浪 – http://www.plurk.com/willh/invite • Will 保哥的推特 – https://twitter.com/Will_Huang