Git コマンド早見表 — やりたいこと別
直前のコミットの取り消し、ブランチ名の変更、リモートブランチの削除など、やりたいこと別に整理した Git コマンド。新しい switch/restore と従来のコマンド、危険度バッジ付き。
最終確認日:2026-10-18 に Git 2.56 の git-scm.com リファレンスと GitHub CLI マニュアル と照合。出典:Git reference (git-scm.com/docs), git restore, git switch, git reset, git config, GitHub CLI manual。
初期設定(マシンごとに 1 回)
--global を付けると設定は ~/.gitconfig に保存されます。Git 2.46 以降のドキュメントでは git config set / get / list の形式が使われていますが、従来の形式も使えます。
git config set --global user.name "Ana Lee" git config set --global user.email "ana@example.com"
従来の書き方:git config --global user.name "Ana Lee"
すべてのコミットに記録されます。コミットが自分のアカウントにひも付くよう、Git ホスティングサービスに登録したメールアドレスを使ってください。
git config set --global init.defaultBranch main
従来の書き方:git config --global init.defaultBranch main
設定しないと、git init は今も最初のブランチを master と名付けます(ヒントも表示されます)。
git config set --global core.editor "code --wait"
従来の書き方:git config --global core.editor "code --wait"
ファイルを閉じるまで待機するコマンドなら何でも使えます:"nano"、"vim"、"subl -n -w"。
git config set --global core.autocrlf true # Windows git config set --global core.autocrlf input # macOS, Linux
従来の書き方:git config --global core.autocrlf true
コミットは LF で、Windows ではチェックアウト時に CRLF にします。チーム全体なら、個人ごとの設定より "* text=auto" を書いた .gitattributes ファイルのほうが確実です。
git --version
git switch と git restore には 2.23 以降、git config のサブコマンドには 2.46 以降が必要です。
リポジトリを始める
git init
git init -b main # name the first branch.git ディレクトリを作成します。ビルド成果物や機密情報が入らないよう、最初のコミットの前に .gitignore を追加しましょう。
git clone https://github.com/owner/repo.git git clone git@github.com:owner/repo.git my-folder
全履歴をダウンロードし、リモート "origin" を設定します。2 つ目の形式は SSH を使い、フォルダー名を指定します。
git clone --depth 1 https://github.com/owner/repo.git
履歴を省略します。CI や大きなリポジトリ向けです。残りは後から git fetch --unshallow で取得できます。
git remote add origin git@github.com:owner/repo.git git push -u origin main
先にホスティングサービス側で空のリポジトリを作成してください(または下の gh repo create を使用)。-u で origin/main を上流ブランチとして記憶します。
ステージとコミット
git status
git status -s # short formステージ済み、未ステージ、未追跡のファイルを一覧表示し、次に実行するコマンドを提案します。
git add file.txt
git add . # everything in this folder and belowgit add -A はリポジトリ全体の削除もステージします。
git add -p file.txt
変更(「hunk」)を 1 つずつ確認します。y でステージ、n でスキップ、s で分割、e で編集。
git commit -m "Add login form"
git commit -am "Fix typo" # stage tracked files and commit-a は変更・削除された追跡済みファイルを含めますが、新しいファイルは含めません。
git mv old.txt new.txt git rm file.txt
どちらも変更を自動でステージします。Git は内容から名前変更を検出するので、普通の mv と git add でも大丈夫です。
git rm --cached .env echo ".env" >> .gitignore
次のコミット以降、リポジトリから削除されます。以前のコミットには残るため、機密情報が含まれていた場合はその情報を無効化して再発行してください。
ブランチ
git branch git branch -a # include remote branches git branch -vv # show upstream and ahead/behind
現在のブランチには * が付きます。
git switch -c feature/login
従来の書き方:git checkout -b feature/login
現在のコミットから始まります。別の場所から分岐するには起点を指定します:git switch -c hotfix origin/main。
git switch main
git switch - # back to the previous branch従来の書き方:git checkout main
origin/feature しかない場合、git switch feature でローカルの追跡ブランチが自動的に作成されます。
git branch -m new-name # current branch
git branch -m old-name new-nameローカルだけの変更です。リモートでも変更するには次の項目を参照してください。
git branch -m old-name new-name git push -u origin new-name git push origin --delete old-name
リモートで直接名前を変える操作はないため、新しい名前を push して古い名前を削除します。古い名前に対して開いているプルリクエストは閉じられることがあります。GitHub の Web 画面の名前変更ボタンなら、プルリクエストの対象も付け替えられます。
git branch -d feature/login
git branch -D feature/login # even if unmerged-d は、上流ブランチや HEAD にマージされていないコミットがあると削除を拒否します。-D は構わず削除します。
復旧方法: マージされていないコミットは reflog に残っています。git reflog で先端を探し、git branch feature/login <sha> を実行します。
git push origin --delete feature/login
従来の書き方:git push origin :feature/login
チームメンバーには git fetch --prune を実行するまで表示されたままです。
復旧方法: そのブランチをローカルに持っている人(または git reflog を使ったあなた)なら push し直せます。
git branch -u origin/main
git push -u origin HEAD # push current branch and track it従来の書き方:git branch --set-upstream-to=origin/main
上流ブランチは、引数なしの git pull と git push が使うブランチです。
git switch --detach a1b2c3d
git switch -c rescue # keep work made there従来の書き方:git checkout a1b2c3d
detached の状態で作ったコミットはどのブランチにも属しません。他へ切り替える前にブランチを作らないと、reflog からしかたどれなくなります。
マージ、リベース、チェリーピック
git switch main
git merge feature/login
git merge --no-ff feature/login # always create a merge commit可能ならファストフォワードします。--no-ff を付けると履歴にブランチが残ります。
git merge --squash feature/login git commit -m "Add login"
まとめた変更をステージしますが、マージとしては記録しません。そのためブランチはマージ済みとして扱われません。
git status # list conflicted files # edit the files, remove <<<<<<< ======= >>>>>>> markers git add file.txt git commit # or: git rebase --continue
片方を丸ごと採用するには git restore --ours file.txt または --theirs を使います。リベース中は「ours」がリベース先のブランチを指し、マージとは逆になります。
git merge --abort
マージを始める前の状態に戻ります。
復旧方法: 行ったコンフリクトの解決は失われます。マージ開始時に未コミットの変更があった場合、--abort では復元できないことがあるため、マージ前にコミットするか stash してください。
git switch feature/login git rebase main
自分のコミットを main の上に再適用して履歴を一直線にします。コンフリクトを解決して git add し、git rebase --continue を実行します。--abort で中止できます。
復旧方法: 直後なら git reset --hard ORIG_HEAD。後からなら git reflog で元の先端を探します。
git rebase -i HEAD~3
一覧が開きます。pick を squash/fixup に変えると結合、reword でメッセージ編集、drop で削除、行の入れ替えで並べ替えができます。
復旧方法: git reflog にリベース前のコミットが表示されます。git reset --hard <sha> で元に戻せます。
git commit --fixup=a1b2c3d git rebase -i --autosquash a1b2c3d~1
fixup コミットは、リベース時に a1b2c3d へ自動的に統合されます。
復旧方法: インタラクティブリベースと同じく git reflog。
git pull --rebase
git config set --global pull.rebase true # make it the default取得した内容の上にローカルのコミットをリベースします。
git cherry-pick a1b2c3d
git cherry-pick -x a1b2c3d # note the source in the message同じ変更を持つ新しいコミットを作ります。範囲指定:git cherry-pick A..B(A は含まない)。
リモート:fetch、pull、push
git remote -v git remote set-url origin git@github.com:owner/repo.git
set-url でクローンの接続先を HTTPS から SSH に(または名前が変わったリポジトリに)切り替えます。
git fetch
git fetch --prune # also drop deleted remote branchesorigin/* だけを更新し、自分のブランチには触れません。
git pull
git fetch とマージ(pull.rebase を設定していればリベース)。
git push
git push -u origin HEAD # first push of a new branch
git config set --global push.autoSetupRemote truepush.autoSetupRemote(Git 2.37 以降)を設定すると、新しいブランチで引数なしの git push を実行するだけで上流ブランチが設定されます。
git push --force-with-lease
--force と違い、まだ fetch していないコミットがリモートにあると拒否します。バックグラウンドの fetch に備えてさらに安全にするには --force-if-includes(Git 2.30 以降)を追加します。
復旧方法: 上書きされたリモートのコミットは、それを持っていた人の reflog に残っています。GitHub でもしばらくは SHA でアクセスできます。
git remote add upstream https://github.com/original/repo.git git fetch upstream git switch main git merge upstream/main
GitHub CLI なら gh repo sync でも可能です。
元に戻す
ミスがどこにあるかで選びます:作業ツリー、ステージングエリア、ローカルのコミット、すでに push したコミット。一度でもコミットしたものは大抵 git reflog で見つけられますが、破棄した未コミットの編集は戻せません。
git reset --soft HEAD~1
コミットは消え、変更はステージされた状態で残るので、すぐコミットし直せます。ステージせずに残すなら git reset HEAD~1(--soft なし)を使います。
復旧方法: git reset ORIG_HEAD でコミットが戻ります。すでに push していた場合は git revert を使ってください。
git reset --hard HEAD~1
ブランチを 1 コミット戻し、追跡中のすべてのファイルをそれに合わせてリセットします。
復旧方法: コミットは git reflog に残っています(到達不能なエントリは既定で 30 日後に期限切れ):git reset --hard HEAD@{1}。追跡中のファイルの未コミットの変更は完全に失われます。
git revert a1b2c3d
git revert HEAD # the latest commit元のコミットを打ち消す新しいコミットを追加するので、他の人の履歴は変わりません。共有ブランチで安全に取り消す方法です。
git revert -m 1 <merge-sha>
-m 1 で 1 番目の親(通常は main)を残します。後でそのブランチを再マージするには、先にこの revert を revert する必要があります。
git commit --amend -m "Better message"
直前のコミットを新しいコミットで置き換えます。push 前なら問題ありませんが、push 後は --force-with-lease が必要です。
復旧方法: git reset --soft HEAD@{1} で amend 前のコミットに戻ります。
git add forgotten.txt git commit --amend --no-edit
メッセージはそのままでファイルを追加します。
復旧方法: git reset --soft HEAD@{1}。
git restore --staged file.txt
git restore --staged . # everything従来の書き方:git reset HEAD file.txt
変更は作業ツリーに残り、ステージだけが取り消されます。
git restore file.txt
従来の書き方:git checkout -- file.txt
ファイルをステージ済みのバージョン(何もステージしていなければ直前のコミット)に戻します。
復旧方法: 編集はコミットされていないので Git からは復旧できません。エディターのローカル履歴に残っている可能性はあります。
git restore --staged --worktree .
git clean -fd # also delete untracked files従来の書き方:git reset --hard
git clean -fd
直前のコミットに戻ります。先に git clean -n を実行して、削除されるものを確認してください。
復旧方法: 復旧できません。未コミットの編集と未追跡ファイルは削除されます。元に戻せる代替手段は git stash -u です。
git restore file.txt # deletion not committed git restore --source=a1b2c3d~1 file.txt # deleted in commit a1b2c3d
従来の書き方:git checkout a1b2c3d~1 -- file.txt
削除したコミットは git log --diff-filter=D -- file.txt で探せます。
git restore --source=main -- config.yml
従来の書き方:git checkout main -- config.yml
作業コピーだけを上書きします。ステージもするなら --staged --worktree を追加します。見るだけなら git show main:config.yml。
復旧方法: そのファイルの未コミットの編集は上書きされます。
git reflog git branch rescued a1b2c3d
reflog には HEAD がたどったすべての位置が記録されています。ミスの前の SHA を探して、そこにブランチを作ります。
git reset --hard ORIG_HEAD
ORIG_HEAD は merge、rebase、reset の実行時に直前の位置に設定され、次に同様のコマンドを実行すると上書きされます。
復旧方法: git reflog にはマージコミットがまだ残っています。
git reflog # find "rebase (start)"; the entry below it is the old tip
git reset --hard HEAD@{5}リベースの直後なら git reset --hard ORIG_HEAD でも同じです。
復旧方法: 未コミットの変更は --hard で破棄されるので、先に stash してください。
git reset --hard HEAD@{1}HEAD@{1} は直前の移動の前に HEAD があった位置です。コミット済みの作業にのみ有効です。
git filter-repo --invert-paths --path secrets.env
git filter-repo は別ツール(pip install git-filter-repo)で、git-filter-branch のドキュメントでも推奨されています。実行後は全員がクローンし直す必要があります。いずれにせよ機密情報は無効化して再発行してください。push した時点で公開されています。
復旧方法: filter-repo は新しいクローンで実行します。確実になるまで古いクローンは残しておきましょう。
stash
git stash
git stash push -m "half-done login"
git stash -u # include untracked files追跡中のファイルの変更を保存して作業ツリーをきれいにするので、ブランチを切り替えられます。
git stash pop # apply and drop git stash apply stash@{1} # apply, keep the stash
コンフリクトが起こることがあります。pop では、適用に失敗した場合 stash は残ります。
git stash list
git stash show -p stash@{0}新しい順に並び、stash@{0} が最新です。
git stash push -- src/login.ts
git stash push --staged # only what is staged (2.35+)パスを指定した stash では、それ以外はそのまま残ります。
git stash branch feature/login stash@{0}stash したコミットにブランチを作り、stash を適用して削除します。コンフリクトを避けられます。
git stash drop stash@{0}
git stash clearclear ですべての stash を削除します。
復旧方法: 削除した stash はガベージコレクションまで到達不能なコミットとして残ります:git fsck --unreachable | grep commit の後、git stash apply <sha>。
履歴と差分
git log --oneline --graph --all
1 コミット 1 行でブランチ構造を表示します。かなり古い Git ではブランチ名を表示するのに --decorate を追加します。
git log --follow -p -- path/file.txt
--follow で名前変更をまたいで追跡し、-p で各変更を表示します。
git log -S "functionName" --oneline git log -G "regex" --oneline
-S は出現回数が変わったものを、-G は変更された行を正規表現で照合します。
git log --author="Ana" --since="2 weeks ago" --oneline
ほかに --until、メッセージ検索の --grep="fix"、main にはなく feature にあるコミットを示す main..feature も使えます。
git show a1b2c3d git show a1b2c3d:path/file.txt
2 つ目の形式は、作業コピーに触れずに、そのコミット時点のファイルを表示します。
git diff # unstaged git diff --staged # staged, i.e. what will be committed
--stat はファイルごとに要約し、--word-diff は文章の比較に向いています。
git diff main...feature # changes on feature since it branched git diff main feature # the two tips directly
ドット 3 つはマージベースと比較します。プルリクエストで表示されるのはこれです。
git blame -L 10,20 path/file.txt
-w で空白を無視し、-C で他のファイルから移動した行を追跡します。
git bisect start git bisect bad # current commit is broken git bisect good v1.4.0 # this one worked # test, then mark each step good or bad git bisect reset
二分探索で、約 log2(n) ステップです。git bisect run ./test.sh で自動化できます。
git grep -n "TODO"
大きなリポジトリでは grep より速く、無視されたファイルはスキップします。コミットを指定すると古いバージョンを検索できます。
タグとリリース
git tag -a v1.2.0 -m "Release 1.2.0"
git tag -a v1.1.1 a1b2c3d -m "Hotfix" # tag an older commit注釈付きタグ(-a)は作成者、日付、メッセージを保存するので、リリースにはこちらがおすすめです。git tag v1.2.0 だけだと軽量タグになります。
git tag -d v1.2.0 git push origin --delete v1.2.0
削除したリリースタグの名前は再利用しないでください。他のクローンには古いタグが残っています。
復旧方法: タグを付けたコミットには影響しないので、そのコミットにタグを付け直します。
サブモジュールとワークツリー
git submodule add https://github.com/owner/lib.git vendor/lib git commit -m "Add lib submodule"
.gitmodules に URL を記録し、もう一方のリポジトリの特定のコミットに固定します。
git clone --recurse-submodules <url>
git submodule update --init --recursive # already clonedこれを実行しないと、サブモジュールのフォルダーは空のままです。
git submodule update --remote git commit -am "Bump submodules"
各サブモジュールの追跡ブランチを取得します。新しい固定先は親リポジトリでコミットしてください。
git worktree add ../repo-hotfix hotfix git worktree add -b review ../repo-review origin/main
同じリポジトリを共有する 2 つ目の作業フォルダーです。stash や 2 つ目のクローンは不要です。
git worktree list
git worktree remove ../repo-hotfix
git worktree prune # forget folders deleted by hand未コミットの変更があると remove は拒否します(強制するには --force)。
お掃除
git clean -n -d
git clean -f の前には必ず実行してください。
git clean -fd # untracked files and folders git clean -fdx # also ignored files (build output, .env!)
-x を付けると無視されたファイルも削除され、.env などのローカル設定も含まれます。
復旧方法: 復旧できません。これらのファイルは一度も Git に入っていません。
git branch --merged main git branch -d branch-a branch-b
先に一覧を確認してください。-d は未マージのブランチを拒否するので、試しても安全です。
git fetch --prune git config set --global fetch.prune true
サーバー上で削除されたブランチの origin/* 参照を削除します。
git maintenance start git gc
maintenance start はバックグラウンドの prefetch、commit-graph、repack のジョブをスケジュールします。gc はその場でオブジェクトをパックし、到達不能なものを削除します。
設定とエイリアス
git config list --show-origin
従来の書き方:git config --list --show-origin
システム、グローバル、リポジトリの値を、それぞれが書かれたファイルと一緒に表示します。
git config set --global alias.st "status -s" git config set --global alias.lg "log --oneline --graph --all"
従来の書き方:git config --global alias.st "status -s"
その後は git st や git lg が使えます。! を先頭に付けるとシェルコマンドを実行します:alias.root "!pwd"。
git config set --global pull.rebase true git config set --global push.autoSetupRemote true git config set --global rerere.enabled true git config set --global merge.conflictStyle zdiff3 git config set --global diff.algorithm histogram
従来の書き方:git config --global pull.rebase true
pull 時にリベース、初回 push で上流を自動設定(2.37 以降)、コンフリクトの解決を記憶、コンフリクトに共通の祖先を表示(2.35 以降)、より見やすい差分。
git config set --global core.excludesFile ~/.gitignore_global
従来の書き方:git config --global core.excludesFile ~/.gitignore_global
OS やエディターが作る不要ファイル(.DS_Store、.idea/)向けです。プロジェクト固有のルールはリポジトリの .gitignore に書きます。
GitHub CLI(gh)の基本
gh は GitHub 公式のコマンドラインツールで、Git とは別にインストールします。
gh auth login
gh auth setup-git # let git use gh for HTTPS credentialsブラウザを開くか、トークンを受け付けます。github.com と GitHub Enterprise の両方で使えます。
gh repo create my-app --private --source=. --push
リポジトリを作成して origin として追加し、現在のブランチを push します。
gh repo clone owner/repo
フォークの場合は、親リポジトリも upstream リモートとして追加します。
gh pr create --fill gh pr create --draft --title "WIP: login" --body "…"
--fill でコミットメッセージをタイトルと本文に使います。
gh pr checkout 123
PR のブランチ(フォークを含む)を取得して切り替えます。
gh pr list gh pr view 123 --web gh pr merge 123 --squash --delete-branch
gh pr status で自分に関係する PR を表示します。
gh issue create --title "Bug: …" --body "…" gh issue list --assignee @me
gh issue view 42 --comments でスレッドをターミナルで読めます。
gh run list gh run watch
gh run view --log-failed で失敗したステップだけを表示します。
.gitignore のひな形が必要なら .gitignore ジェネレーターを使ってください。Git の外でファイルの 2 つのバージョンを比べるなら、差分チェッカーで変更を左右に並べて確認できます。
静的なリファレンスです。検索はブラウザ内で行われ、入力した内容はどこにも送信されません。 すべての無料ツールを見る.
不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。
この Git 早見表は、コマンド別ではなくやりたいこと別に整理しています。「git reset --soft」で検索する人はいません。みんな「直前のコミットを取り消す」で検索するからです。やりたいことを見つけてコマンドをコピーし、何が変わるのかを 1 行の説明で確認してください。検索ではタスクが優先されるので、「リモートブランチを削除」や「ブランチ名を変更」と入力すれば、該当する項目にすぐたどり着けます。
履歴を書き換えるコマンドや作業を破棄するコマンドには印を付け、何を復旧できるかのメモを添えています。一度でもコミットしたものは git reflog でほぼ必ず見つけ直せますが、restore、reset --hard、clean で破棄したコミット前の変更は失われます。Git にもっとわかりやすいコマンドが加わったもの(2.23 以降の git switch と git restore、2.46 以降の git config set と list)は、そちらを先に示して従来の書き方を併記しているので、チームが Git を去年覚えた人でも 2010 年に覚えた人でも使えます。Git 2.56 の git-scm.com リファレンスと照合済みです。
使い方
- 検索ボックスに「直前のコミットを取り消す」「ステージを取り消す」「コミットをまとめる」などやりたいことを入力するか、よく使うタスクをクリックします。
- 実行する前にバッジを確認してください。琥珀色は履歴を書き換えるコマンド、赤は作業を破棄する可能性があるコマンドです。復旧メモに元に戻す方法が書いてあります。
- 「コマンドをコピー」をクリックします。コピーには # のコメントが含まれないので、そのままターミナルに貼り付けられます。a1b2c3d や feature/login のようなプレースホルダーは自分の値に置き換えてください。
- 各タスクの横にある # リンクで特定の答えを共有したり、早見表全体を 2 列の PDF として印刷したりできます。
よくある質問
Git で直前のコミットを取り消すには?
まだプッシュしていなければ、git reset --soft HEAD~1 でコミットを取り消し、変更はステージされたまま残ります。git reset HEAD~1 なら変更はステージされていない状態で残ります。git reset --hard HEAD~1 はコミットとその変更の両方を消します。共有ブランチにすでにプッシュしたコミットの場合は、代わりに git revert HEAD を使ってください。誰の履歴も書き換えずに、取り消し用の新しいコミットを追加します。
git reset、git restore、git revert の違いは何ですか?
git restore はファイルを変更します。作業ツリーの編集を破棄したりステージを取り消したりするだけで、ブランチは動かしません。git reset は現在のブランチを別のコミットに移動させ(--hard ではファイルも上書き)、履歴を書き換えます。git revert は以前のコミットの逆の変更を適用する新しいコミットを作ります。履歴は増えるだけなので、他の人が使うブランチでは安全な選択肢です。
Git のブランチ名をローカルとリモートで変更するには?
git branch -m new-name で今いるブランチの名前を変更します(別のブランチなら git branch -m old new)。リモートには名前変更の操作がないため、git push -u origin new-name で新しい名前をプッシュし、git push origin --delete old-name で古いほうを削除します。GitHub では、Web 画面でブランチ名を変更すると、開いているプルリクエストの対象も切り替わります。
git switch と git checkout、どちらを使うべきですか?
どちらでも構いません。git checkout は、ブランチの切り替えとファイルの復元という無関係な 2 つの仕事をこなすため、Git 2.23 でそれが git switch と git restore に分けられました。新しいコマンドのほうがわかりやすく、誤用しにくい(git checkout -- file は黙って編集を破棄します)ので、この早見表では新しいほうを先に示しています。git checkout は非推奨ではなく、ここにあるどのコマンドにも従来の書き方を併記しています。
git reset --hard のあとでコミットを復旧できますか?
たいていは可能です。git reflog を実行し、reset 前の行を見つけて、git reset --hard HEAD@{n} を実行するか、その SHA にブランチを作成します。他から参照されなくなったコミットも、既定では 30 日間は reflog から到達できます。復旧できないのはコミットしていない作業です。一度もコミットも stash もしていない変更は完全に上書きされます。
git push --force-with-lease は何をするのですか?
リモートのブランチが、最後に fetch したときと同じ場所を指している場合にだけ上書きします。その間に誰かがプッシュしていれば、単純な --force のように相手のコミットを黙って消すのではなく、プッシュが拒否されます。すでにプッシュしたブランチで rebase や amend をしたあとに使いましょう。
どの取り消しコマンドを使う?変更がどこにあるかで決める
• ファイルを編集したが、その編集をなくしたい:git restore file。一度もコミットしていないので復旧できません。
• 間違えてステージした:git restore --staged file。何も失われず、編集はファイルに残ります。
• コミットしたがプッシュしていない:git reset --soft HEAD~1 でコミットをやり直すか、git commit --amend でその場で修正します。
• コミットして共有ブランチにプッシュした:git revert <sha>。他の人が pull したブランチを reset してはいけません。
• コミットやブランチ、失敗した rebase の結果を失った:git reflog のあと、git branch rescued <sha>。
根本にあるルールは、コミットを書き換える操作は、そのコミットが自分だけのものである間は問題ないが、共有した途端に全員の問題になる、ということです。
merge と rebase、どちらを使う?
どちらも、あるブランチの変更を別のブランチに取り込みます。merge は 2 つの履歴が合流したことを、親を 2 つ持つマージコミットとして記録します。何も書き換えないので、共有ブランチでも常に安全です。rebase は自分のコミットを相手のブランチの上に再適用し、最新のコミットから作業を始めたかのような一直線の履歴を作りますが、新しいコミット ID が生成されるため、古いコミットをすでに持っている人は調整が必要になります。
チームでよくある慣習は、自分のフィーチャーブランチは main に rebase して最新に保ち(git pull --rebase または git rebase main)、完成したブランチはプルリクエストで main に merge する、というものです。スカッシュマージなら main には機能ごとに 1 つのコミットが残り、通常の merge ならすべてのコミットとブランチの形が残ります。履歴の一貫性を保つため、リポジトリごとにどちらかに決めて、ホスティングサービスの設定で指定しておきましょう。
既定値から変えておきたい Git の設定
• pull.rebase true:git pull で同期のたびにマージコミットを作らず、rebase します。
• push.autoSetupRemote true(Git 2.37 以降):新しいブランチを最初に git push したときに上流ブランチが設定され、-u が不要になります。
• merge.conflictStyle zdiff3(Git 2.35 以降):コンフリクトマーカーに共通の祖先が含まれるため、ほとんどのコンフリクトが一目瞭然になります。
• rerere.enabled true:コンフリクトをどう解決したかを Git が記憶し、rebase 中に同じコンフリクトが再び起きたときに自動で再適用します。
• fetch.prune true:サーバーで削除されたリモートブランチが、次の fetch でローカルからも消えます。
• init.defaultBranch main:新しいリポジトリが main ブランチで始まります。
関連する無料ツール
- .gitignore ジェネレーター — 言語、フレームワーク、エディター、OS の .gitignore テンプレートを組み合わせて、1 つのすっきりしたファイルにまとめます。
- 差分チェッカー — テキスト、コード、JSON ファイルの 2 つのバージョンを比較し、どの行、単語、文字が変わったかを正確に確認できます。
- Markdown 早見表 — すべての Markdown 要素をソースと表示結果で掲載。拡張記法(表、タスクリスト、脚注、数式、Mermaid、アラート)、9 プラットフォームの対応表、ライブで試せるプレイグラウンド付き。
- 正規表現早見表 — 正規表現のすべてのトークンを、動作する例、JavaScript・PCRE/PHP・Python・Go・Java・.NET での対応状況、入力済みの正規表現テスターを開く「試す」リンク付きで掲載。