Open10

Gitのコミット整理方法まとめ

N.WayamaN.Wayama

初期状態

branch切った

git branch feature/commit_work

git checkout feature/commit_work

git push -u origin feature/commit_work

N.WayamaN.Wayama

ファイル登録

README.md -> main.py の順番でコミット

touch README.md

git add README.md

git commit -m "add: README"

touch main.py

git add main.py

git commit -m "add: main.py"
N.WayamaN.Wayama

README.md 更新

ファイル更新する

echo "# Commit Test" > README.md

git add README.md

git commit -m "update: title"

N.WayamaN.Wayama

直前のコミットを修正

含み損ねた変更を直前のコミットに入れる方法

git commit --amend

含み損ねたファイルをaddする
先程echoで入れたREADME.mdを適当に編集したファイルをaddした

git add README.md

コマンド実行

git commit --amend

コミットメッセージを修正して完了。
これで直前のコミットにgit addしたファイルが含まれた。
これ便利だな

N.WayamaN.Wayama

コミット履歴の書き換え

git rebase --interactive

今までの履歴書き換えを行える

# コミットの書き換え
reward/edit

# コミットをめとめる
squash/fixup

# コミット順序変更
インタラクティブモードでコミット順序を入れ替えるだけ

# コミット削除
drop

editにすると、当該コミットでリベース処理が一時停止するため、必要な処理をする
そしたら、add してcomit --amendで一つのコミットにマージさせる

全部終わったらgit rebase --continueでリベース処理を継続させる

N.WayamaN.Wayama

任意のコミットに修正を追加する方法

git commit --fixup=<commit>

任意のコミットに追加修正を行うだけの場合に使用する

$ git log --oneline
5572a63 (HEAD -> feature/commit_work) add: main.py
6898d14 update: title and amend
bc85a1a add: README
4c20704 (origin/main, origin/feature/commit_work, origin/develop, origin/HEAD, main, develop) Initial commit

6898d14に修正を入れたい場合

# 修正後
git add README.md

git commit --fixup=6898d14
# [feature/commit_work 8ba5567] fixup! update: title and amend
# 1 file changed, 3 insertions(+)

# 現時点ではコミットが増えただけ
git log --oneline 
8ba5567 (HEAD -> feature/commit_work) fixup! update: title and amend
5572a63 add: main.py
6898d14 update: title and amend
bc85a1a add: README
4c20704 (origin/main, origin/feature/commit_work, origin/develop, origin/HEAD, main, develop) Initial commit

ここで変更の起点となるコミットハッシュに--autosquashオプションを指定し、git rebaseを実行するとコミット履歴が書き換えられる

変更の起点となるコミットハッシュは追加対象コミットの一つ前のコミットである
今回の場合は6898d14の一つ前なのでbc85a1a

git log --oneline 
8ba5567 (HEAD -> feature/commit_work) fixup! update: title and amend
5572a63 add: main.py
6898d14 update: title and amend
bc85a1a add: README
4c20704 (origin/main, origin/feature/commit_work, origin/develop, origin/HEAD, main, develop) Initial commit

git rebase --autosquash bc85a1a

git log --oneline                 
15f92b6 (HEAD -> feature/commit_work) add: main.py
a8a765e update: title and amend
bc85a1a add: README

N.WayamaN.Wayama

--autosquash 自動設定

git configに追加

git config --global rebase.autosquash true
N.WayamaN.Wayama

一部だけコミットしたい場合

あるファイルの特定行だけコミットしたい場合は
git add -pを使うと便利

git add -p 
# or
git add -p <filepath>

yでその変更をステージング、nでステージングスキップ
eでファイルの変更箇所を選択できるエディタモード(vi, vim)
コミットしたい箇所だけ残して、後は行削除すればOK