---
title: 【Git】使用 git-rebase 修改 Commit
date: 2019-12-13
is_modified: false
categories:
- "軟體開發 › 版本管控"
tags:
- "Git"
---
{%hackmd @CynthiaChuang/Github-Page-Theme %}
<br>
記錄一下自己常用的 `git-rebase` 的用法。
<!--more-->
## 情境假設
假設目前 git log 存在多筆 commit , A → B → C → D → E, e 是目前最新的 commit ,也就是 HEAD。
<br>現在我想對某一筆 commit 進行修改,可以使用 rebase -i 命令選擇要修改的提交
```shell=
$ git rebase -i <B 的 commit id>
```
<br>此時文字編輯器會顯示從 HEAD 到 B 的 commit 之間的所有 commit,如下圖顯示:
```shell
pick <C 的 commitId> <C 的 commit 內容>
pick <D 的 commitId> <E 的 commit 內容>
pick <E 的 commitId> <E 的 commit 內容>
# Rebase 326fc9f..0d4a808 onto d286baa
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
```
在文字編輯器以看到好幾個指令,需依照目的來挑選指令,這邊列一下我常做的操作:
## 修改 commits message
這是我最常做的,在要修正的 commit 前的 `pick` 換成 `r` 或 `reword`:
```shell
r <C 的 commitId> <C 的 commit 內容>
```
接著就會回到一般 commit 的編輯畫面,將新的 commits message 打完存檔、退出就行了。
## 合併 commits
我這比較常用在開發一個比較大的 function 時。我會將每一步測試完後,先用 commit 暫存起來,當整體功能開發完成後,再把合併成一個完整的 commit。
先選擇一個 base,再將要向前合併的 commit 前改為 `s` 或 `squash`。
```shell=
pick <C 的 commitId> <C 的 commit 內容>
s <D 的 commitId> <E 的 commit 內容>
```
接著會跳到 commit 編輯畫面,畫面上會同顯示要合併的兩個 commit message:
```shell=
# This is a combination of 2 commits.
# The first commit's message is:
<C 的 commit 內容>
# This is the 2nd commit message:
<E 的 commit 內容>
```
把舊的 commit message 註解掉後,輸入新的 commit message 後存檔、退出。此時用 `git log` 就能看到新的 commit 了。
## 修改 commits 中 tracked 的檔案
這個通常我是用來修正未上傳前 commit 中的檔案,例如錯別字修正的狀況。在這情況下,在要修正的 commit 前改為 `e` 或 `edit`。
```
e <C 的 commitId> <C 的 commit 內容>
```
接下來會收到下列提示,此時就可以去修正檔案,假設我需要修改的檔案為 `sample_C.txt`。
```
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
```
當檔案修改完後,先用 `diff` 檢查一下檔案的差異,再 `add` 用將檔案加進索引,最後按照提示依序輸入 `amend` 與 `continue`。
```shell=
$ git diff
$ git add sample_C.txt
$ git commit --amend
$ git rebase --continue
```
回頭使用 `git diff` 檢查下檔案的差異,就會看到原本的 commit 中多了剛剛修改的內容。
## 修改 commits 的作者資訊
這件之前在《[【Git】修改 Git commits 的作者資訊](/@CynthiaChuang/Change-the-Git-Commit-Author-for-the-Specific-Commits)》,這算是 edit 模式的另一種應用?