HOWTO · Git

Git リポジトリから特定のコミットをプルする

この記事では、リモート Git リポジトリから特定のコミットをプルする方法について説明します。

このページの内容

現在のブランチに1つのコミットの変更を取り込むには、リモートの履歴をフェッチして git cherry-pick <commit-id> を実行します。そのコミット時点の状態を確認したり、そこから作業を続けたりする場合は、そのコミットでブランチを作成します。ブランチの履歴を取り込む場合は git merge または git pull を使います。この場合、以前のコミットも含まれることがあります。現在のブランチを過去の時点に戻す場合に限り、git reset を使います。

特定のコミットに適した操作を選ぶ

これらの操作は、それぞれ結果が異なります。git cherry-pick は、選択したコミットで導入された変更を、新しいコミットとして現在のブランチに適用します。コミットからブランチを作成すると、その時点の状態を起点に作業できます。コミットをマージすると、まだ現在のブランチに存在しない、そのコミットから到達可能な履歴が取り込まれます。pullはリモートからフェッチし、設定されたpullの動作に従って統合します。resetは現在のブランチ参照を移動します。--hard を指定すると、作業ツリーとインデックスも置き換わります。必要なのが1つの変更なのか、過去の状態を起点にした作業なのか、リモートの履歴の統合なのか、ブランチを過去に戻すことなのかに応じて選んでください。

コミットハッシュを確認する

git log を実行すると、コミットID、作成者、メッセージを確認できます。簡潔な一覧には git log --oneline を使います。目的のコミットに表示されているIDをコピーしてください。Gitでは、完全なオブジェクトIDのほか、一意に特定できる短縮IDも使えます。コミットがリモートにしかない場合は、先に git fetch origin を実行してから、更新された履歴を確認します。origin は使用するリモート名に、<commit-id> は選んだコミットIDに置き換えてください。

git cherry-pick で1つのコミットを適用する

リモートのブランチまたはそのオブジェクトをフェッチしてから、git fetch origin に続けて git cherry-pick <commit-id> を実行し、選んだコミットを適用します。ブランチ全体をマージせずに1つのコミットの変更だけを取り込みたい場合に適した方法です。次のローカル例では、トピックブランチでコミットを作成し、それを main に適用します。

repo=$(mktemp -d)
trap 'rm -rf "$repo"' EXIT
git -C "$repo" init -q -b main
git -C "$repo" config user.name "Example User"
git -C "$repo" config user.email "example@example.com"
printf 'base\n' > "$repo/notes.txt"
git -C "$repo" add notes.txt
git -C "$repo" commit -qm "Add notes"
git -C "$repo" switch -q -c topic
printf 'one change\n' >> "$repo/notes.txt"
git -C "$repo" add notes.txt
git -C "$repo" commit -qm "Add one change"
commit_id=$(git -C "$repo" rev-parse HEAD)
git -C "$repo" switch -q main
git -C "$repo" cherry-pick "$commit_id"
printf 'Applied one commit to main.\n'
[main 5ede2b1] Add one change
 Date: Mon Oct 26 03:50:14 2026 +0000
 1 file changed, 1 insertion(+)
Applied one commit to main.

変更が競合した場合は、競合箇所が示されたファイルを解決し、git add で解決内容をステージしてから git cherry-pick --continue を実行します。操作を中止して実行前の状態に戻すには、git cherry-pick --abort を使います。別の操作を始める前に、現在の操作を完了するか中止してください。

特定のコミットでブランチを作成する

現在のブランチを移動せずに、あるコミットの状態を確認したり、その状態から作業を始めたりするには、リモートをフェッチして git checkout -b review-branch <commit-id> を実行します。これにより、そのコミットを起点とする review-branch が作成され、そこに切り替わります。このブランチにはそのコミットまでの履歴が含まれますが、別のブランチにある後続コミットは、マージまたはcherry-pickしない限り含まれません。

リモートのコミットをフェッチしてマージする

git fetch origin を実行すると、リモート追跡参照を更新できます。この時点では、履歴はまだ統合されません。次に git merge <commit-id> を使うと、選んだコミットと、そこから到達可能で現在のブランチにまだない履歴をマージできます。親コミットも取り込まれることがあるため、選択した変更だけを適用する方法とは異なります。マージ後の履歴を確認するには、git log --oneline --graph --decorate を使います。

コミットハッシュを指定して git pull を使う

そのオブジェクトに到達可能で、サーバーがリクエストを許可している場合、リモートからコミットIDを直接フェッチできることがあります。対応状況はリモートによって異なるため、git pull origin <commit-id> は、特定の変更だけを選ぶための汎用的な方法ではありません。受け付けられた場合、pullは設定に従ってフェッチした内容を統合します。「このコミットだけを適用する」という意味ではありません。1つの変更だけを取り込むには、フェッチしてからcherry-pickしてください。それ以外の場合は、名前を指定したブランチをフェッチして、そのブランチをpullまたはマージします。

ブランチを特定のコミットに戻す

現在のブランチを移動し、インデックスと作業ツリーをそのコミットの状態に置き換える場合に限り、git reset --hard <commit-id> を使います。未コミットの変更が失われることがあります。移動したブランチを後でpushすると、共有履歴を書き換えたことで、共同作業者側で調整が必要になる場合があります。resetの前に git status を確認し、残しておきたい作業を退避してください。公開済みの履歴を保ったまま取り消すには、git revert <commit-id> を使って、選択した変更を打ち消す新しいコミットを作成します。

よくある質問

コミットIDはどうすれば確認できますか? git log または git log --oneline を使います。リモートにしかないコミットの場合は、先にフェッチしてください。

cherry-pickで競合が発生した場合はどうすればよいですか? 各ファイルの競合を解決してステージし、git cherry-pick --continue を実行します。中止するには git cherry-pick --abort を使います。

複数のコミットをcherry-pickできますか? はい。適用したい順に複数のIDを git cherry-pick に渡すか、範囲の両端にどのコミットが含まれるか確認してからコミット範囲を指定します。

resetとrevertは同じですか? いいえ。git reset はブランチ参照を移動し、ローカルファイルを置き換えることがあります。git revert は、以前の変更を取り消す新しいコミットを記録します。