Git
English ▾ トピック ▾ 最新バージョン ▾ git-push は 2.45.0 で最後に更新されました

NAME

git-push - 関連オブジェクトと共にリモート参照を更新します

SYNOPSIS

git push [--all | --branches | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
	   [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-q | --quiet] [-v | --verbose]
	   [-u | --set-upstream] [-o <string> | --push-option=<string>]
	   [--[no-]signed|--signed=(true|false|if-asked)]
	   [--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]]
	   [--no-verify] [<repository> [<refspec>…​]]

DESCRIPTION

指定された参照を完了するために必要なオブジェクトを送信しながら、ローカル参照を使用してリモート参照を更新します。

リポジトリにプッシュするたびに、hooksを設定することで、リポジトリで興味深いことを発生させることができます。git-receive-pack[1]のドキュメントを参照してください。

コマンドラインで <repository> 引数を使用してプッシュ先を指定しない場合、プッシュ先を決定するために現在のブランチの branch.*.remote 設定が参照されます。設定が見つからない場合は、デフォルトでoriginになります。

コマンドラインで <refspec>... 引数または --all--mirror--tags オプションを使用してプッシュするものを指定しない場合、コマンドは remote.*.push 設定を参照してデフォルトの <refspec> を見つけ、見つからない場合は push.default 設定を尊重してプッシュするものを決定します(push.defaultの意味についてはgit-config[1]を参照してください)。

コマンドラインも設定もプッシュするものを指定しない場合、デフォルトの動作が使用されます。これは push.defaultsimple 値に対応します。つまり、現在のブランチが対応する上流ブランチにプッシュされますが、安全対策として、上流ブランチがローカルブランチと同じ名前でない場合はプッシュが中止されます。

OPTIONS

<repository>

プッシュ操作の宛先である「リモート」リポジトリ。このパラメーターは、URL(以下のGIT URLセクションを参照)またはリモートの名前(以下のREMOTESセクションを参照)のいずれかです。

<refspec>…​

どのソースオブジェクトでどの宛先参照を更新するかを指定します。<refspec>パラメーターの形式は、オプションのプラス +、その後にソースオブジェクト <src>、その後にコロン :、その後に宛先参照 <dst> が続きます。

<src>は、プッシュするブランチの名前であることが多いですが、master~4HEAD などの任意の「SHA-1式」(gitrevisions[7]を参照)にすることができます。

<dst>は、このプッシュでリモート側のどの参照が更新されるかを指定します。ここでは任意の式を使用することはできず、実際の参照に名前を付ける必要があります。git push [<repository>]<refspec>引数なしで、remote.<repository>.push 設定変数を使用して宛先の参照を <src>で更新するように設定されている場合、:<dst>部分は省略できます。そのようなプッシュは、コマンドラインで<refspec>なしで <src>が通常更新する参照を更新します。それ以外の場合、:<dst>が欠落している場合は、<src>と同じ参照を更新することを意味します。

<dst>が refs/ で始まらない場合(たとえば、refs/heads/master)、プッシュされている<src>のタイプと <dst> が曖昧かどうかに基づいて、宛先 <repository> の refs/* のどこに属するかを推測しようとします。

  • <dst>が <repository> リモートの参照を明確に参照している場合は、その参照にプッシュします。

  • <src>が refs/heads/ または refs/tags/ で始まる参照に解決される場合は、それを <dst> に付加します。

  • 他の曖昧さの解決方法が将来追加される可能性がありますが、今のところ他の場合は、試した内容を示すエラーが表示され、advice.pushUnqualifiedRefname 設定(git-config[1]を参照)に応じて、プッシュしたかった可能性のある refs/ 名前空間を示唆します。

<src>が参照するオブジェクトは、リモート側の <dst> 参照を更新するために使用されます。これが許可されるかどうかは、refs/* 内の <dst> 参照が存在する場所によって決まります。以下で詳細に説明されているように、「更新」とは、削除を除くすべての変更を意味します。これは、次のいくつかのセクションの後に記載されているように、異なる方法で処理されます。

refs/heads/* 名前空間はコミットオブジェクトのみを受け入れ、高速転送できる場合にのみ更新されます。

refs/tags/* 名前空間はあらゆる種類のオブジェクト(コミット、ツリー、ブロブはタグ付けできるため)を受け入れ、それらへの更新はすべて拒否されます。

refs/{tags,heads}/* の外部の名前空間には、あらゆるタイプのオブジェクトをプッシュできます。タグとコミットの場合、更新が許可されるかどうかという目的のために、refs/heads/* 内のコミットであるかのように扱われます。

つまり、refs/{tags,heads}/* の外部のコミットとタグの高速転送は、高速転送されるものがコミットではなく、最後のタグ(またはコミット)を置き換えるコミットの高速転送である新しいコミットを指すタグオブジェクトである場合でも許可されます。既存のタグと同じコミットを指している場合は、完全に異なるタグでタグを置き換えることも許可されます。また、剥がされたタグ、つまり既存のタグオブジェクトが指すコミット、または既存のコミットが指す新しいタグオブジェクトをプッシュすることも許可されます。

refs/{tags,heads}/* の外部のツリーおよびブロブオブジェクトは、refs/tags/* 内にある場合と同じように扱われ、それらの更新はすべて拒否されます。

更新として許可されない上記で説明したすべてのルールは、refspec にオプションの先頭の + を追加するか、--force コマンドラインオプションを使用することで上書きできます。この唯一の例外は、強制しても refs/heads/* 名前空間で非コミットオブジェクトを受け入れることはできないということです。フックと設定もこれらのルールを上書きまたは修正できます。たとえば、git-config[1]receive.denyNonFastForwards、および githooks[5]pre-receiveupdate を参照してください。

空の <src> をプッシュすると、リモートリポジトリから <dst> 参照を削除できます。削除は、設定またはフックによって禁止されている場合を除き、refspec(または --force)に先頭の + なしで常に受け入れられます。git-config[1]receive.denyDeletes、および githooks[5]pre-receiveupdate を参照してください。

特別な refspec :(または非高速転送更新を許可する場合は +:)は、Git に「一致する」ブランチをプッシュするように指示します。ローカル側に存在するすべてのブランチについて、リモート側に同じ名前のブランチが既に存在する場合は、リモート側が更新されます。

tag <tag> は、refs/tags/<tag>:refs/tags/<tag> と同じ意味です。

--all
--branches

すべてのブランチ(つまり、refs/heads/ の下の参照)をプッシュします。他の <refspec> と一緒に使用することはできません。

--prune

ローカルに対応するものがないリモートブランチを削除します。たとえば、ローカルブランチと同じ名前のブランチが存在しなくなった場合、リモートブランチ tmp は削除されます。これは refspec も尊重します。たとえば、git push --prune remote refs/heads/*:refs/tmp/* は、リモート refs/tmp/foorefs/heads/foo が存在しない場合に削除されることを保証します。

--mirror

プッシュする各参照に名前を付ける代わりに、refs/refs/heads/refs/remotes/refs/tags/ が含まれますが、これらに限定されません)の下のすべての参照がリモートリポジトリにミラーされるように指定します。新しく作成されたローカル参照はリモート側にプッシュされ、ローカルで更新された参照はリモート側で強制的に更新され、削除された参照はリモート側から削除されます。これは、設定オプション remote.<remote>.mirror が設定されている場合のデフォルトです。

-n
--dry-run

実際に更新を送信する以外はすべて実行します。

--porcelain

機械可読な出力を生成します。各参照の出力ステータス行はタブ区切りで、stderr ではなく stdout に送信されます。参照の完全なシンボリック名が与えられます。

-d
--delete

リストされたすべての参照がリモートリポジトリから削除されます。これは、すべての参照にコロンをプレフィックスするのと同じです。

--tags

コマンドラインで明示的に指定された refspec に加えて、refs/tags 配下のすべての ref が push されます。

--follow-tags

このオプションなしで push されるすべての ref に加え、リモートに存在しないが、push される ref から到達可能な commit-ish を指している refs/tags 内のアノテーション付きタグも push します。これは設定変数 push.followTags でも指定できます。詳細は git-config[1]push.followTags を参照してください。

--[no-]signed
--signed=(true|false|if-asked)

受信側でフックによってチェックしたり、ログに記録できるように、受信側での ref の更新に対する push リクエストを GPG 署名します。false または --no-signed の場合、署名は試行されません。true または --signed の場合、サーバーが署名付き push をサポートしていないと push は失敗します。if-asked に設定すると、サーバーが署名付き push をサポートしている場合にのみ署名します。gpg --sign の実際の呼び出しが失敗した場合も push は失敗します。受信側の詳細については、git-receive-pack[1] を参照してください。

--[no-]atomic

利用可能な場合、リモート側でアトミックトランザクションを使用します。すべての ref が更新されるか、エラーが発生した場合は、どの ref も更新されません。サーバーがアトミック push をサポートしていない場合、push は失敗します。

-o <option>
--push-option=<option>

指定された文字列をサーバーに送信し、サーバーはそれらを pre-receive フックと post-receive フックに渡します。指定された文字列に NUL 文字または LF 文字を含めてはなりません。複数の --push-option=<option> が指定された場合、コマンドラインにリストされた順序ですべてが相手側に送信されます。コマンドラインから --push-option=<option> が指定されていない場合は、設定変数 push.pushOption の値が代わりに使用されます。

--receive-pack=<git-receive-pack>
--exec=<git-receive-pack>

リモート側の git-receive-pack プログラムへのパス。ssh 経由でリモートリポジトリに push する場合で、プログラムがデフォルトの $PATH 上のディレクトリにない場合に役立ちます。

--[no-]force-with-lease
--force-with-lease=<refname>
--force-with-lease=<refname>:<expect>

通常、"git push" は、上書きするために使用されたローカル ref の祖先ではないリモート ref を更新することを拒否します。

このオプションは、リモート ref の現在の値が期待値である場合に、この制限を上書きします。それ以外の場合、"git push" は失敗します。

すでに公開しているものをリベースする必要があると想像してください。リベースされた履歴で最初に公開した履歴を置き換えるためには、「早送りでなければならない」というルールを回避する必要があります。リベース中に他の誰かが元の履歴に基づいて構築した場合、リモートのブランチの先端はコミットで進む可能性があり、--force で盲目的に push すると、その人の作業が失われます。

このオプションを使用すると、更新している履歴がリベースしたもので、置き換えたいことを示すことができます。リモート ref が指定したコミットをまだ指している場合、他の誰かが ref に何もしていないことを確認できます。これは、明示的にロックせずに ref の「リース」を取得するようなもので、リモート ref は「リース」がまだ有効な場合にのみ更新されます。

--force-with-lease 単独で、詳細を指定せずに使用すると、更新される予定のすべてのリモート ref が保護され、その現在の値が、それらのリモート追跡ブランチと同じであることが必要になります。

期待値を指定せずに --force-with-lease=<refname> を使用すると、更新される予定の場合、名前付き ref (単独) が保護され、その現在の値が、それらのリモート追跡ブランチと同じであることが必要になります。

--force-with-lease=<refname>:<expect> は、更新される予定の場合、名前付き ref (単独) を保護し、その現在の値が、指定された値 <expect> (refname のリモート追跡ブランチとは異なる場合があります。または、この形式を使用する場合は、そのようなリモート追跡ブランチを持つ必要さえありません) と同じであることを要求します。<expect> が空の文字列の場合、名前付き ref はまだ存在してはなりません。

ref の期待される現在の値を明示的に指定する --force-with-lease=<refname>:<expect> 以外のすべての形式はまだ実験的であり、この機能の経験を積むにつれてそのセマンティクスが変更される可能性があることに注意してください。

"--no-force-with-lease" は、コマンドラインの以前の --force-with-lease をすべてキャンセルします。

安全性に関する一般的な注意事項: 期待値を指定せずにこのオプションを提供すること、つまり --force-with-lease または --force-with-lease=<refname> として提供することは、バックグラウンドで push するリモートで暗黙的に git fetch を実行するもの、例えば cronjob でリポジトリで git fetch origin を実行するものと非常にうまく相互作用しません。

--force より提供される保護は、自分の作業が基盤としていない後続の変更が破壊されないようにすることですが、バックグラウンドで何らかのプロセスが ref を更新している場合、これは簡単に打ち破られます。自分が見ていて破壊しても構わないと思われる ref のヒューリスティックとして、リモート追跡情報以外に頼るものはありません。

エディターまたはその他のシステムがバックグラウンドで git fetch を実行している場合、これを軽減する方法は、別のリモートを単純に設定することです。

git remote add origin-push $(git config remote.origin.url)
git fetch origin-push

これで、バックグラウンドプロセスで git fetch origin が実行されても、origin-push の参照は更新されないため、次のようなコマンドは

git push --force-with-lease origin-push

git fetch origin-push を手動で実行しない限り失敗します。この方法は、git fetch --all を実行するものでは完全に打ち破られます。その場合は、無効にするか、次のようなさらに面倒なことを行う必要があります。

git fetch              # update 'master' from remote
git tag base master    # mark our base point
git rebase -i master   # rewrite some commits
git push --force-with-lease=master:base master:master

つまり、自分が閲覧し上書きしても構わないと思っているアップストリームコードのバージョンに base タグを作成し、履歴を書き換え、最後に、リモートバージョンがローカルの remotes/origin/master がバックグラウンドで更新された内容に関係なく、base にある場合は、master に変更を強制的に push します。

または、--force-with-lease[=<refname>] とともに補助オプションとして --force-if-includes を指定する (つまり、リモート側の ref が指している正確なコミット、またはリモート側のどの ref が保護されているかを明示的に指定しない) ことにより、"push" の時点で、バックグラウンドで暗黙的に更新された可能性のあるリモート追跡 ref からの更新が、強制更新を許可する前にローカルに統合されているかどうかを検証します。

-f
--force

通常、コマンドは、上書きするために使用されたローカル ref の祖先ではないリモート ref を更新することを拒否します。また、--force-with-lease オプションを使用すると、コマンドは、現在の値が期待値と一致しないリモート ref を更新することを拒否します。

このフラグはこれらのチェックを無効にし、リモートリポジトリがコミットを失う可能性があります。注意して使用してください。

--force は push されるすべての ref に適用されるため、push.defaultmatching に設定されている場合、または remote.*.push で複数の push 先が構成されている場合は、現在のブランチ以外の ref (リモートの対応するブランチよりも厳密に遅れているローカル ref を含む) が上書きされる可能性があることに注意してください。1つのブランチにのみ強制的に push するには、push する refspec の前に + を使用します (例: git push origin +mastermaster ブランチに強制的に push する)。詳細については、上記の <refspec>... セクションを参照してください。

--[no-]force-if-includes

リモート追跡 ref の先端がローカルに統合されている場合にのみ更新を強制します。

このオプションは、リモート追跡 ref の先端が、書き換えのためにローカルブランチの「reflog」エントリのいずれかから到達可能かどうかを検証するチェックを有効にします。このチェックにより、リモートからの更新がローカルに組み込まれていることが保証され、そうでない場合は強制更新が拒否されます。

このオプションが --force-with-lease を指定せずに渡された場合、または --force-with-lease=<refname>:<expect> とともに指定された場合は、「何もしない」状態になります。

--no-force-if-includes を指定すると、この動作が無効になります。

--repo=<repository>

このオプションは <repository> 引数と同等です。両方が指定された場合、コマンドライン引数が優先されます。

-u
--set-upstream

最新であるか、正常に push されたすべてのブランチに対して、引数なしの git-pull[1] およびその他のコマンドで使用される、アップストリーム (追跡) 参照を追加します。詳細については、git-config[1]branch.<name>.merge を参照してください。

--[no-]thin

これらのオプションは git-send-pack[1] に渡されます。シン転送は、送信側と受信側が多くの同じオブジェクトを共有している場合、送信されるデータの量を大幅に削減します。デフォルトは --thin です。

-q
--quiet

エラーが発生した場合を除き、更新された ref のリストを含むすべての出力を抑制します。標準エラーストリームに進捗状況は報告されません。

-v
--verbose

詳細な情報を表示して実行します。

--progress

-q が指定されていない限り、標準エラーストリームがターミナルに接続されている場合、デフォルトで標準エラーストリームに進捗状況が報告されます。このフラグは、標準エラーストリームがターミナルにリダイレクトされていない場合でも、進捗状況を強制的に表示します。

--no-recurse-submodules
--recurse-submodules=check|on-demand|only|no

プッシュされるリビジョンで使用されるすべてのサブモジュールコミットが、リモート追跡ブランチで利用可能であることを確認するために使用できます。check を使用すると、Git は、プッシュされるリビジョンで変更されたすべてのサブモジュールコミットが、サブモジュールの少なくとも1つのリモートで利用可能であることを検証します。コミットが不足している場合、プッシュは中断され、ゼロ以外のステータスで終了します。on-demand を使用すると、プッシュされるリビジョンで変更されたすべてのサブモジュールがプッシュされます。オンデマンドですべて必要なリビジョンをプッシュできなかった場合も、中断され、ゼロ以外のステータスで終了します。only を使用すると、すべてのサブモジュールがプッシュされ、スーパープロジェクトはプッシュされないままになります。サブモジュール再帰が必要ない場合は、no の値を使用するか、--no-recurse-submodules を使用して、push.recurseSubmodules 設定変数をオーバーライドできます。

on-demand または only を使用する場合、サブモジュールに "push.recurseSubmodules={on-demand,only}" または "submodule.recurse" 設定がある場合は、さらに再帰が発生します。この場合、"only" は "on-demand" として扱われます。

--[no-]verify

pre-pushフックを切り替えます ( githooks[5]を参照)。デフォルトは --verify で、フックにプッシュを阻止する機会を与えます。--no-verify を使用すると、フックは完全にバイパスされます。

-4
--ipv4

IPv6アドレスを無視して、IPv4アドレスのみを使用します。

-6
--ipv6

IPv4アドレスを無視して、IPv6アドレスのみを使用します。

GIT URL

一般に、URLには、トランスポートプロトコル、リモートサーバーのアドレス、リポジトリへのパスに関する情報が含まれています。トランスポートプロトコルによっては、この情報の一部がない場合があります。

Gitは、ssh、git、http、およびhttpsプロトコルをサポートしています(さらに、ftpおよびftpsをフェッチに使用できますが、これは非効率で非推奨です。使用しないでください)。

ネイティブトランスポート(つまり、git:// URL)は認証を行わず、安全でないネットワークでは注意して使用する必要があります。

次の構文をそれらで使用できます

  • ssh://[<user>@]<host>[:<port>]/<path-to-git-repo>

  • git://<host>[:<port>]/<path-to-git-repo>

  • http[s]://<host>[:<port>]/<path-to-git-repo>

  • ftp[s]://<host>[:<port>]/<path-to-git-repo>

代替のscpのような構文をsshプロトコルで使用することもできます

  • [<user>@]<host>:/<path-to-git-repo>

この構文は、最初のコロンの前にスラッシュがない場合にのみ認識されます。これにより、コロンを含むローカルパスを区別できます。たとえば、ローカルパス foo:bar は、絶対パスとして、またはssh URLとして誤解されないように ./foo:bar として指定できます。

sshおよびgitプロトコルは、~<username> の展開もサポートしています

  • ssh://[<user>@]<host>[:<port>]/~<user>/<path-to-git-repo>

  • git://<host>[:<port>]/~<user>/<path-to-git-repo>

  • [<user>@]<host>:~<user>/<path-to-git-repo>

ローカルリポジトリの場合、Gitによってネイティブにサポートされている、次の構文を使用できます

これら2つの構文は、クローン作成時を除いて、ほとんど同等です。前者は --local オプションを意味します。詳しくは git-clone[1] をご覧ください。

git clonegit fetch、および git pull は、git push はそうではありませんが、適切なバンドルファイルも受け入れます。git-bundle[1] を参照してください。

Gitが特定のトランスポートプロトコルの処理方法を認識しない場合、remote-<transport> リモートヘルパーが存在すれば、それを使用しようとします。リモートヘルパーを明示的に要求するには、次の構文を使用できます

  • <transport>::<address>

ここで、<address> は、パス、サーバーとパス、または呼び出される特定のリモートヘルパーによって認識される任意のURLのような文字列にすることができます。詳細については、gitremote-helpers[7] を参照してください。

多数の類似した名前のリモートリポジトリがあり、それらに異なる形式を使用したい場合(使用するURLが機能するURLに書き換えられるように)、次の形式の設定セクションを作成できます

	[url "<actual-url-base>"]
		insteadOf = <other-url-base>

たとえば、これを使用して

	[url "git://git.host.xz/"]
		insteadOf = host.xz:/path/to/
		insteadOf = work:

「work:repo.git」のようなURLまたは「host.xz:/path/to/repo.git」のようなURLは、URLを受け取るすべてのコンテキストで「git://git.host.xz/repo.git」に書き換えられます。

プッシュ専用にURLを書き換えたい場合は、次の形式の設定セクションを作成できます

	[url "<actual-url-base>"]
		pushInsteadOf = <other-url-base>

たとえば、これを使用して

	[url "ssh://example.org/"]
		pushInsteadOf = git://example.org/

「git://example.org/path/to/repo.git」のようなURLは、プッシュの場合には「ssh://example.org/path/to/repo.git」に書き換えられますが、プルでは元のURLが引き続き使用されます。

REMOTES

<repository> 引数としてURLの代わりに、次のいずれかの名前を使用できます

  • Git設定ファイル内のリモート: $GIT_DIR/config

  • $GIT_DIR/remotes ディレクトリ内のファイル、または

  • $GIT_DIR/branches ディレクトリ内のファイル。

これらはすべて、gitがデフォルトで使用するrefspecが含まれているため、コマンドラインからrefspecを省略することもできます。

設定ファイル内の名前付きリモート

git-remote[1]git-config[1]、または $GIT_DIR/config ファイルを手動で編集して事前に設定したリモートの名前を指定できます。このリモートのURLは、リポジトリにアクセスするために使用されます。このリモートのrefspecは、コマンドラインでrefspecを指定しない場合にデフォルトで使用されます。設定ファイルのエンティティは次のようになります

	[remote "<name>"]
		url = <URL>
		pushurl = <pushurl>
		push = <refspec>
		fetch = <refspec>

<pushurl> はプッシュのみに使用されます。オプションであり、デフォルトは <URL> です。リモートへのプッシュは、プッシュURLが定義されている場合はすべてのプッシュURLに影響し、プッシュURLが定義されていない場合は定義されているすべてのURLに影響します。ただし、フェッチは、複数のURLが定義されている場合は、最初に定義されたURLからのみフェッチします。

$GIT_DIR/remotes 内の名前付きファイル

$GIT_DIR/remotes 内のファイルの名前を指定できます。このファイルのURLは、リポジトリにアクセスするために使用されます。このファイルのrefspecは、コマンドラインでrefspecを指定しない場合にデフォルトとして使用されます。このファイルは次の形式である必要があります

	URL: one of the above URL formats
	Push: <refspec>
	Pull: <refspec>

Push: 行は *git push* で使用され、Pull: 行は *git pull* および *git fetch* で使用されます。追加のブランチマッピングに対して、複数の Push: および Pull: 行を指定できます。

$GIT_DIR/branches 内の名前付きファイル

$GIT_DIR/branches 内のファイルの名前を指定できます。このファイルのURLは、リポジトリにアクセスするために使用されます。このファイルは次の形式である必要があります

	<URL>#<head>

<URL> は必須です。#<head> はオプションです。

操作に応じて、コマンドラインでrefspecを指定しない場合、gitは次のいずれかのrefspecを使用します。<branch>$GIT_DIR/branches 内のこのファイルの名前であり、<head> はデフォルトで master になります。

git fetchは以下を使用します

	refs/heads/<head>:refs/heads/<branch>

git pushは以下を使用します

	HEAD:refs/heads/<head>

出力

"git push" の出力は、使用されるトランスポートメソッドによって異なります。このセクションでは、Git プロトコル(ローカルまたは ssh 経由)でプッシュするときの出力について説明します。

プッシュのステータスは表形式で出力され、各行は単一の参照のステータスを表します。各行は次の形式です

 <flag> <summary> <from> -> <to> (<reason>)

--porcelain が使用されている場合、出力の各行は次の形式になります

 <flag> \t <from>:<to> \t <summary> (<reason>)

最新の参照のステータスは、--porcelain オプションまたは --verbose オプションが使用されている場合にのみ表示されます。

フラグ

参照のステータスを示す単一の文字

(スペース)

プッシュが成功したfast-forwardの場合;

+

強制更新が成功した場合;

-

削除された参照が成功した場合;

*

プッシュされた新しい参照が成功した場合;

!

拒否された、またはプッシュに失敗した参照の場合; および

=

最新であり、プッシュする必要がなかった参照の場合。

概要

正常にプッシュされた参照の場合、概要は、git log の引数として使用するのに適した形式で参照の古い値と新しい値を示します(これは、ほとんどの場合 <old>..<new> であり、強制された非fast-forward更新の場合は <old>...<new> です)。

更新に失敗した場合は、詳細が提供されます

拒否済み

通常、fast-forwardではなく、更新を強制しなかったため、Gitは参照を送信しようとしませんでした。

リモート拒否済み

リモートエンドが更新を拒否しました。通常、リモート側のフックが原因であるか、リモートリポジトリで次のいずれかの安全オプションが有効になっていることが原因です。receive.denyCurrentBranch (チェックアウトされたブランチへのプッシュの場合)、receive.denyNonFastForwards (強制された非fast-forward更新の場合)、receive.denyDeletes または receive.denyDeleteCurrentgit-config[1] を参照してください。

リモートエラー

リモートエンドが参照の正常な更新を報告しませんでした。これは、リモート側の一時的なエラー、ネットワーク接続の切断、またはその他の一時的なエラーが原因である可能性があります。

from

プッシュされるローカル参照の名前から、refs/<type>/ プレフィックスを引いたものです。削除の場合、ローカル参照の名前は省略されます。

to

更新されるリモート参照の名前から、refs/<type>/ プレフィックスを引いたものです。

理由

人間が読める説明。プッシュに成功した参照の場合、説明は必要ありません。失敗した参照の場合、失敗の理由が説明されます。

FAST-FORWARDに関する注意

更新によって、コミットAを指していたブランチ(またはより一般的には参照)が別のコミットBを指すように変更された場合、BがAの子孫である場合に限り、fast-forward更新と呼ばれます。

AからBへのfast-forward更新では、元のコミットAがその上に構築されたコミットのセットは、新しいコミットBがその上に構築するコミットのサブセットです。したがって、履歴は失われません。

対照的に、非fast-forward更新は履歴を失います。たとえば、あなたと他の誰かが同じコミットXで開始し、あなたがコミットBにつながる履歴を作成し、他の人がコミットAにつながる履歴を作成したとします。履歴は次のようになります

      B
     /
 ---X---A

さらに、あなたがたが元のコミット X を取得した元のリポジトリに、別の人が変更をプッシュして A に戻したと仮定します。

別の人が行ったプッシュは、コミット X を指していたブランチを更新して、コミット A を指すようにしました。これは fast-forward です。

しかし、あなたがプッシュしようとすると、ブランチ(現在は A を指している)をコミット B で更新しようとすることになります。これはfast-forwardではありません。もしそうしてしまうと、コミット A によって導入された変更は失われてしまいます。なぜなら、誰もが B をベースに開発を始めることになるからです。

このコマンドは、デフォルトでは、履歴の損失を防ぐために fast-forward でない更新を許可しません。

もし、あなたの作業(X から B への履歴)や他の人の作業(X から A への履歴)を失いたくないのであれば、まずリポジトリから履歴を取得し、両者によって行われた変更を含む履歴を作成し、その結果をプッシュバックする必要があります。

"git pull" を実行し、潜在的な競合を解決し、その結果を "git push" します。"git pull" は、コミット A と B の間にマージコミット C を作成します。

      B---C
     /   /
 ---X---A

結果として得られるマージコミットで A を更新すると、fast-forward になり、プッシュが受け入れられます。

あるいは、"git pull --rebase" を使用して、X と B の間の変更を A の上にリベースし、その結果をプッシュバックすることもできます。リベースは、X と B の間の変更を A の上に構築する新しいコミット D を作成します。

      B   D
     /   /
 ---X---A

ここでも、このコミットで A を更新すると、fast-forward になり、プッシュが受け入れられます。

プッシュしようとしたときに fast-forward でない拒否に遭遇する可能性のあるもう1つの一般的な状況があります。それは、自分しかプッシュしないリポジトリにプッシュしている場合でも起こり得ます。自分でコミット A をプッシュした後(このセクションの最初の図)、それを "git commit --amend" でコミット B に置き換え、すでに A をプッシュしたことを忘れてプッシュしようとする場合です。このような場合、そして、その間に誰もあなたの以前のコミット A をフェッチしていない(そしてその上に開発を開始していない)ことを確信している場合に限り、"git push --force" を実行して上書きすることができます。言い換えれば、"git push --force" は、履歴を失わせることを意図している場合にのみ使用される方法です。

git push

git push <remote> のように動作します。ここで <remote> は、現在のブランチのリモート(または、現在のブランチにリモートが設定されていない場合は origin)です。

git push origin

追加の設定がない場合、現在のブランチが現在のブランチと同じ名前の場合、設定済みの upstream (branch.<name>.merge 設定変数) に現在のブランチをプッシュします。それ以外の場合は、プッシュせずにエラーになります。

<refspec> が指定されていない場合のこのコマンドのデフォルトの動作は、リモートの push オプション、または push.default 設定変数を設定することで構成できます。

たとえば、現在のブランチのみを origin にプッシュするようにデフォルト設定するには、git config remote.origin.push HEAD を使用します。有効な <refspec>(以下の例のようなもの)は、git push origin のデフォルトとして設定できます。

git push origin :

"マッチングする" ブランチを origin にプッシュします。「マッチングする」ブランチの説明については、上記の OPTIONS セクションの <refspec> を参照してください。

git push origin master

ソースリポジトリで master に一致する参照 (おそらく refs/heads/master) を見つけ、origin リポジトリで同じ参照 (例: refs/heads/master) をそれで更新します。master がリモートに存在しない場合は作成されます。

git push origin HEAD

現在のブランチをリモートの同じ名前のブランチにプッシュするための便利な方法です。

git push mothership master:satellite/master dev:satellite/dev

master に一致するソース参照(例: refs/heads/master)を使用して、mothership リポジトリの satellite/master (おそらく refs/remotes/satellite/master) に一致する参照を更新します。dev および satellite/dev についても同様に処理します。

マッチングのセマンティクスについては、上記の <refspec>... の説明を参照してください。

これは、satellite で行われた作業を統合するために、逆方向に実行される git push を使用して mothership で実行される git fetch をエミュレートするためのもので、一方向でしか接続できない場合にしばしば必要になります (つまり、satellite は mothership に ssh で接続できますが、mothership はファイアウォール内にあるか、sshd を実行していないため、satellite への接続を開始できません)。

satellite マシンでこの git push を実行した後、mothership に ssh で接続し、そこで git merge を実行して、mothership で実行された git pull のエミュレーションを完了し、satellite で行われた変更をプルします。

git push origin HEAD:master

現在のブランチを origin リポジトリ内の master に一致するリモート参照にプッシュします。この形式は、ローカル名を気にせずに現在のブランチをプッシュするのに便利です。

git push origin master:refs/heads/experimental

現在の master ブランチをコピーして、origin リポジトリにブランチ experimental を作成します。この形式は、ローカル名とリモート名が異なる場合に、リモートリポジトリに新しいブランチまたはタグを作成する場合にのみ必要です。それ以外の場合は、参照名だけを使用できます。

git push origin :experimental

origin リポジトリで experimental に一致する参照 (例: refs/heads/experimental) を見つけて、削除します。

git push origin +dev:master

fast-forward でない更新を許可して、origin リポジトリの master ブランチを dev ブランチで更新します。これにより、origin リポジトリに参照されていないコミットが残ってしまう可能性があります。fast-forward が不可能な次の状況を検討してください。

	    o---o---o---A---B  origin/master
		     \
		      X---Y---Z  dev

上記のコマンドは、origin リポジトリを次のように変更します。

		      A---B  (unnamed branch)
		     /
	    o---o---o---X---Y---Z  master

コミット A と B は、シンボリック名を持つブランチに属さなくなるため、到達不能になります。そのため、これらのコミットは、origin リポジトリでの git gc コマンドによって削除されます。

セキュリティ

fetch プロトコルと push プロトコルは、一方の側が共有されることを意図していない他方のリポジトリからデータを盗むことを防ぐようには設計されていません。悪意のあるピアから保護する必要があるプライベートデータがある場合は、別のリポジトリに保存するのが最善の選択肢です。これは、クライアントとサーバーの両方に当てはまります。特に、サーバー上の名前空間は、読み取りアクセス制御には効果的ではありません。リポジトリ全体への読み取りアクセスを信頼できるクライアントにのみ、名前空間への読み取りアクセスを許可する必要があります。

既知の攻撃ベクトルは次のとおりです。

  1. 被害者は、明示的に共有されることを意図されていないが、ピアも持っていれば転送を最適化するために使用できるオブジェクトの ID をアドバタイズする "have" 行を送信します。攻撃者は盗むオブジェクト ID X を選択し、X への参照を送信しますが、被害者がすでに持っているため、X のコンテンツを送信する必要はありません。これで、被害者は攻撃者が X を持っていると信じ、後で X のコンテンツを攻撃者に送り返します。(この攻撃は、クライアントがアクセスできる名前空間に X への参照を作成してフェッチすることにより、クライアントがサーバー上で実行するのが最も簡単です。サーバーがクライアント上で実行する最も可能性の高い方法は、X をパブリックブランチに「マージ」し、ユーザーがこのブランチで追加の作業を行い、マージに気づかずにサーバーにプッシュバックすることを期待することです。)

  2. #1と同様に、攻撃者は盗むオブジェクトID Xを選択します。被害者は攻撃者がすでに持っているオブジェクトYを送信し、攻撃者はXを持っていてYを持っていないと偽って主張するため、被害者はXに対するデルタとしてYを送信します。デルタは、Yに類似したXの領域を攻撃者に明らかにします。

設定

このセクションのこの行より下の内容は、git-config[1] ドキュメントから選択的に含まれています。内容はそこに記載されているものと同じです。

push.autoSetupRemote

「true」に設定すると、現在のブランチにアップストリーム追跡が存在しない場合に、デフォルトのプッシュで --set-upstream を想定します。このオプションは、push.default オプションの *simple*、*upstream*、および *current* で有効になります。デフォルトで新しいブランチをデフォルトのリモートにプッシュしたい場合(*push.default=current* の動作のように)、アップストリーム追跡も設定したい場合に便利です。このオプションの恩恵を受ける可能性が高いワークフローは、すべてのブランチがリモートで同じ名前を持つことが期待される *simple* な中央ワークフローです。

push.default

refspec が与えられていない場合(コマンドライン、設定、またはその他の場所から)、git push が取るべきアクションを定義します。異なる値は、特定のワークフローに最適です。たとえば、完全に中央のワークフロー(つまり、fetch ソースが push 先と同じ)では、upstream がおそらく望ましいものです。可能な値は次のとおりです。

  • nothing - refspec が指定されていない限り、何もプッシュしません (エラーになります)。これは主に、常に明示的にして間違いを避けたい人を対象としています。

  • current - 現在のブランチをプッシュして、受信側の同じ名前のブランチを更新します。中央ワークフローと非中央ワークフローの両方で機能します。

  • upstream - 通常は現在のブランチに統合される変更のブランチ(@{upstream} と呼ばれます)に、現在のブランチをプッシュバックします。このモードは、通常プルするのと同じリポジトリにプッシュしている場合にのみ意味があります (つまり、中央ワークフロー)。

  • tracking - これは upstream の非推奨の同義語です。

  • simple - リモートで同じ名前の現在のブランチをプッシュします。

    集中型ワークフロー(通常は origin であるプル元のリポジトリと同じリポジトリにプッシュする場合)で作業している場合は、同じ名前のアップストリームブランチを設定する必要があります。

    このモードは、Git 2.0 以降のデフォルトであり、初心者向けの最も安全なオプションです。

  • matching - 両端で同じ名前を持つすべてのブランチをプッシュします。これにより、プッシュ先のリポジトリはプッシュされるブランチのセットを記憶します (例: 常に *maint* と *master* をそこにプッシュし、他のブランチをプッシュしない場合、プッシュ先の リポジトリにはこれら 2 つのブランチがあり、ローカルの *maint* と *master* がそこにプッシュされます)。

    このモードを効果的に使用するには、git pushを実行する前に、プッシュする予定のすべてのブランチがプッシュできる状態になっていることを確認する必要があります。このモードの要点は、すべてのブランチを一度にプッシュできるようにすることだからです。通常、1つのブランチでの作業を終えて結果をプッシュし、他のブランチが未完成のままである場合、このモードはあなたには向いていません。また、このモードは共有の中央リポジトリへのプッシュには適していません。他の人が新しいブランチを追加したり、あなたの制御外で既存のブランチの先端を更新したりする可能性があるためです。

    これは以前はデフォルトでしたが、Git 2.0以降はそうではありません (simpleが新しいデフォルトです)。

push.followTags

trueに設定すると、デフォルトで--follow-tagsオプションが有効になります。--no-follow-tagsを指定することで、プッシュ時にこの構成を上書きできます。

push.gpgSign

ブール値、または文字列if-askedに設定できます。trueの値は、git-push[1]--signedが渡された場合と同様に、すべてのプッシュをGPG署名付きにします。文字列if-askedは、サーバーがサポートしている場合、git push--signed=if-askedが渡された場合と同様に、プッシュに署名します。falseの値は、優先度の低い構成ファイルの値よりも優先されます。明示的なコマンドラインフラグは、常にこの構成オプションを上書きします。

push.pushOption

コマンドラインから--push-option=<option>引数が指定されていない場合、git pushは、この変数の各<value>が--push-option=<value>として指定されたかのように動作します。

これは複数値の変数であり、優先度の高い構成ファイル (例: リポジトリ内の.git/config) で空の値を使用して、優先度の低い構成ファイル (例: $HOME/.gitconfig) から継承された値をクリアできます。

Example:

/etc/gitconfig
  push.pushoption = a
  push.pushoption = b

~/.gitconfig
  push.pushoption = c

repo/.git/config
  push.pushoption =
  push.pushoption = b

This will result in only b (a and c are cleared).
push.recurseSubmodules

"check"、"on-demand"、"only"、または "no" を指定でき、"push --recurse-submodules" と同じ動作をします。設定されていない場合、submodule.recurseが設定されていない限り、デフォルトでnoが使用されます (この場合、trueの値はon-demandを意味します)。

push.useForceIfIncludes

"true" に設定すると、コマンドラインでgit-push[1]のオプションとして--force-if-includesを指定することと同等になります。プッシュ時に--no-force-if-includesを追加すると、この構成設定が上書きされます。

push.negotiate

"true"に設定すると、クライアントとサーバーが共通のコミットを見つけようとする交渉ラウンドで、送信されるパックファイルのサイズを縮小しようと試みます。"false" の場合、Gitは共通のコミットを見つけるためにサーバーのrefアドバタイズのみに依存します。

push.useBitmaps

"false" に設定すると、pack.useBitmaps が "true" であっても、他の git 操作でのビットマップの使用を妨げることなく、"git push" でのビットマップの使用を無効にします。デフォルトはtrueです。

GIT

git[1] スイートの一部

scroll-to-top