🍣

コミットを綺麗にするためによく使うgit操作

2023/05/07に公開

概要

最近コミットを綺麗にするようgit操作をするために以下のコマンドを多用している。

今回の修正を一つ前のコミットに含ませたい

amendで1つ前のコミットに入れる。no-editでコミットメッセージを変えない。
歴史を変えているためforce pushを行う。

git commit --amend --no-edit
git push -f

今回の修正を2つ以上前のコミットに含ませたい

含ませたいコミットのIDを特定する

git log --oneline

fixupコミットを作る

git commit --fixup <コミットID>

fixupコミットを rebase し push する

git rebase -i <コミットID>~ --autosquash
# コミット履歴が表示されるので修正コミットが含ませたいコミットの下にあることを確認し保存

git push -f

特定のコミットAを別のコミットBに混ぜたい

git rebasae -i <コミットID>~
# Aの行をBの下に移動
# Aのプレフィックスをfに変更
# 保存
git push -f

他人のforkのブランチにpushしたい

他人のforkをローカルに落とす

git remote add <他人の名前> <他人のforkのgit URL>
git fetch <他人の名前>
git switch <ブランチ名>

他人側作業: 作業者アカウントにpush権限をつける

pushする

git push

修正があるのにpull, push, rebaseしたい

git stash save を pop を勝手にやってくれるオプション

git pull --autostash

squash and merge 後のコンフリクト解消

以下のようにブランチを切った時

A-->B-->C
例:merge -> API B -> API C

BをAにsquash and mergeした時

B-(squash and merge)->A

Cにpullするとコンフリクトを起こす

git checkout C
# コンフリクト!!

これはsquash and mergeでAの歴史が変わるから。
解消にはAから再びC'を作りCのコミットをC'にcherry-pickする。

git checkout A
git checkout -B C_bk
git checkout A
git branch -D C
git checkout -B C
cherry-pic <コミットID X>..<コミットID Y>
git push

コミットID X : Cの最初のコミットの1つ前のコミット
コミットID Y : Cの最後のコミット

GitHubで編集を提案

Discussion