🎲はじめに
そろそろ rebase
が美味しい季節になってきましたね
分散型ヴァージョン管理システムを破壊しないように、rebase
のことを把握して コミットID
を意識していることをアピールするチャンス到来
基本gitコマンドはこちらの記事で確認してほしい
🎬プロローグ
作業してたらmainブランチに知らないコミットができてた
📥pullの場合
リモートで merge branch してもいいけど、
コンフリクトの可能性あるしローカルで merge する手順。
1. merge_commitを作る
どっち向きにmergeしても結果は同じ
# リモートmainブランチから、作業ブランチにpullする
git switch feature/my作業
git pull origin main
または
# ローカルのmainブランチを最新にする
git switch main
git pull origin main
# git pull origin main:main 上記2行を1行にしたもの
# ローカルmainブランチから、作業ブランチにmergeする
git switch feature/my作業
git merge main
2. リモートにpushする
# リモートmainブランチにpushする
git switch feature/my作業
git push origin main
📝説明
-
pull
=fetch
+merge
-
fetch
: 最新の取得 -
merge
: 合併
pullを使うと、マージコミットが作成される
- メリット:変更が明確になる
- デメリット:履歴が複雑になる
🔧rebaseの場合
1. 作業ブランチのコミットIDを変更する
# ローカルのmainブランチを最新にする
git switch main
git pull origin main
# ローカルmainブランチから、作業ブランチにrebaseする
git switch feature/my作業
git rebase main
2. リモートにpushする
# リモートmainブランチにpushする
git switch feature/my作業
git push origin main
📝説明
mainの最新の取得してその先頭にリベース(移動)する
コミットIDのみ変わる
マージコミットが作成されない
- メリット:履歴が線形で理解しやすい
- デメリット:履歴が書き換えられるため、他の人とコンフリクトするかも
※すでにプッシュしているコミットを改変すると大変カオスなことになるので、 絶対に使用しないでください
🛠️interactive rebase
リベースの過程で各コミットを手動で変更できるモード
- squash : 複数のコミットを1つにまとめる
- edit : コミットメッセージや内容の変更
- pick : コミットの順序変更
- drop : 不要なコミットの削除
🎯選び方
プロジェクトのニーズ、チームの運用方針、目的で使い分ける
コミット履歴を意識するなら rebase
🔧 git rebase でコンフリクトが起きたときの解消手順
# 競合しているファイルを確認する
git status
# 競合を手動で解消する(対象のファイルをエディタで開いて、コンフリクトを修正)
git add <ファイル名>
git rebase --continue
❌ リベースをやめたいとき
git rebase --abort
リモートに push 済みのブランチを rebase した場合、履歴が書き換わるため通常の git push
はできない
代わりに「強制 push(git push --force-with-lease
)」が必要