【Git】fatal: invalid upstream 'HEAD~n'エラーの原因と解決方法!

Gitでリベースを使用する際にfatal: invalid upstream 'HEAD~n'というエラー(nは数字)が出る場合があります。

この記事では、このエラー原因と解決方法についてわかりやすく解説します。

fatal: invalid upstream 'HEAD~n' エラーの原因

まず、次のようなコミット履歴があるとします。

$ git log --oneline --reverse
e988a35 commit A # ← 最初のコミット
216dd56 commit B
8019534 commit C
35b43cf (HEAD -> main) commit D

上記の例で、最新の4つのコミットメッセージを変更したい場合、以下のようなコマンドを使用することが多いです。

git rebase -i HEAD~4
# 以下のコマンドでも可能
git rebase --interactive HEAD~4

上記のコマンドはHEADから4つ分のコミットを対象にリベースを開始するコマンドです。しかし、上記のコマンドでは、最初のコミットを含むリベースをしているため、以下に示すようなエラーが発生します。

$ git rebase -i HEAD~4
fatal: invalid upstream 'HEAD~4'

このエラーが発生する理由は、リベースの対象範囲がリポジトリの最初のコミット(root commit)まで含まれているためです。

通常、git rebaseでは内部的に修正したいコミットの「親コミット」を辿り、その親コミットを基準に新しい変更を適用する仕組みになっています。しかし、最初のコミット(root commit)は親を持たないため、リベース対象に最初のコミットが含まれると、Gitは「親コミットが見つからない」という状態になり、fatal: invalid upstream 'HEAD~n'というエラーが発生します。

fatal: invalid upstream 'HEAD~n' エラーの解決方法

最初のコミットまで含めてリベースを実行したい場合、以下のコマンドを使うことで解決できます。

git rebase -i --root

このコマンドを使うことで、最初のコミットからすべてのコミットを対象にリベースを行うことができます。

本記事のまとめ

fatal: invalid upstream 'HEAD~n'というエラーは、次の場合に発生します。

  • コミット履歴を指定する際、指定した数が実際の履歴を超えている
    • nがコミット数を超えるとエラーが発生します。例えば、コミットの数が4個の場合において、git rebase -i HEAD~5と入力すると、fatal: invalid upstream 'HEAD~5'というエラーが発生します。
  • 最初のコミットをリベース対象にしようとした
    • 例えば、コミットの数が4個の場合において、git rebase -i HEAD~4と入力しても、fatal: invalid upstream 'HEAD~4'というエラーが発生することがあります。これは、最初のコミットをリベース対象にしているからです。

解決策として、最初のコミットもリベース対象にしたい場合は、git rebase -i --root コマンドを使用します。