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] [-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
指定のrefを完全にするために必要なオブジェクトを送信により、ローカルrefを使用してリモートrefを更新します。
リポジトリに「フック」を設定することで、あなたがリポジトリにプッシュするたびに興味深いことが起こります。 git-receive-pack(1) のドキュメントを参照してください。
コマンドラインで <repository>
引数を使用してプッシュする場所が指定されてい無い場合、現在のブランチの branch.*.remote
構成を参照して、プッシュする場所を決定します。 branch.*.remote
構成が無い場合、デフォルトは origin
になります。
コマンドラインで <refspec>...
引数や --all
, --mirror
, --tags
オプションを使って何をプッシュするか指定し無かった場合、コマンドは remote.*.push
構成を参照してデフォルトの <refspec>
を探し、それで見つからなかった場合は push.default
構成に準拠して何をプッシュするか決定します(push.default
の意味は git-config(1) を参照ください)。
コマンドラインと構成のどちらもプッシュする対象を指定しない場合、デフォルトの振る舞いが使用されます。それは、 push.default
の simple
値に対応します。 現在のブランチは対応する上流ブランチにプッシュされますが、安全対策として、上流ブランチがローカルブランチと同じ名前でない場合はプッシュが中断(abort)されます。
OPTIONS
- <repository>
-
「リモート」(remote)リポジトリはプッシュ操作の宛先です。 このパラメーターは、URL(下記セクション GIT URLS 参照)、または、リモートの名前(下記セクション REMOTES 参照)のどちらかです。
- <refspec>…
-
どの宛先refをどのソースオブジェクトで更新するかを指定します。 <refspec> パラメータの形式は、オプションのプラス
+
、ソースオブジェクト <src> 、コロン:
、宛先ref <dst> の順です。<src> は、プッシュするブランチの名前であることがよくありますが、
master~4
とかHEAD
などの任意の「SHA-1式」にすることができます(gitrevisions(7) 参照)。<dst>は、このプッシュでリモート側のどのrefが更新されるかを示します。 ここでは任意の式を使用できません。実際のrefには名前を付ける必要があります。
git push [<repository>]
に<refspec>
引数を指定せず、remote.<repository>.push
構成変数で<src>
を指定して同一のrefを更新する場合、:<dst>
の部分を省略することができるようになりました — このようなプッシュは、コマンドラインで<refspec>
を指定しなくても、<src>
が通常更新するrefを更新することになります。 それ以外の場合、:<dst>
がないということは、<src>
と同一のrefを更新することを意味します。<dst> が
refs/
(例:refs/heads/master
)で始まらない場合、プッシュされる <src> の種類と <dst> があいまいかどうかから、それがrefs/*
上のどこに属するか推測しようとします。-
<dst> が <repository> リモートのrefを明確に参照している場合は、そのrefにプッシュします。
-
<src>が
refs/heads/
またはrefs/tags/
で始まるrefに解決される場合は、その解決されたrefを <dst> の前に追加します。 -
将来、他のあいまいさの解決策が追加される可能性がありますが、今のところ、他の場合では、試行した内容を示すエラー出力し、そして
advice.pushUnqualifiedRefname
構成に応じて、あなたがプッシュしたいrefs/
名前空間を提案します。
<src>によって参照されるオブジェクトは、リモート側の<dst>参照を更新するために使用されます。 これが許可されるかどうかは、以下で詳細に説明するように、
refs/*
のどこに<dst>参照が存在するかによって異なります。これらのセクションでは、「更新」(update)とは、削除以外の変更を意味します。refs/heads/*
名前空間はcommitオブジェクトのみを受け入れ、早送り(fast-forward)できる場合にのみ更新します。refs/tags/*
名前空間は(コミット、ツリー、ブロブにタグを付けることができるため、)あらゆる種類のオブジェクトを受け入れ、それらへの更新は拒否(reject)されます。refs/{tags,heads}/*
の外側の任意の名前空間に任意のタイプのオブジェクトをプッシュすることが可能です。 タグとコミットの場合、更新が許可されるかどうかの判断のために、これらはrefs/heads/*
内のコミットであるかのように扱われます。つまり、
refs/{tags,heads}/*
の外部でのコミットやタグの早送りは、早送りされるものがコミットではなく、たまたま置き換えられる最後のタグ(またはコミット)の早送りである新しいコミットを指しているタグオブジェクトであっても、許可されます。 タグを全く別のタグに置き換えることも、同一のコミットを指していれば可能です。また、剥かれたタグ(peeled tag)をプッシュすることもできます。つまり、既存のタグオブジェクトが指しているコミット、または既存のコミットが指している新しいタグオブジェクトをプッシュします。refs/{tags,heads}/*
の外側にあるツリーオブジェクトとブロブオブジェクトは、refs/tags/*
の内側にある場合と同一の扱いであり、更新は拒否されます。更新が許可されていないものに関する上記のすべてのルールは、オプションの先頭の
+
をrefspecに追加する(または--force
コマンドラインオプションを使用する)ことでオーバーライドできます。 これに対する唯一の例外は、refs/heads/*
名前空間が非コミットオブジェクトを受け入れるように強制することはないということです。 フックと構成は、これらのルールをオーバーライドまたは修正することもできます。たとえば、 git-config(1) のreceive.denyNonFastForwards
と、 githooks(5) のpre-receive
やupdate
を参照してください。空の <src> をプッシュすると、リモートリポジトリから <dst> ref を削除できます。 構成またはフックによって禁止されている場合を除き、削除は常に refspec の先頭に
+
を付けずに受け入れられます(または--force
)。 git-config(1) のreceive.denyDeletes
と、 githooks(5) のpre-receive
やupdate
を参照してください。特別なrefspec
:
(または非早送り更新を許可する場合は+:
)は、Gitに、「一致する」ブランチをプッシュするように指示します。 ローカル側に存在するすべてのブランチについて、同じ名前のブランチがリモート側にすでに存在する場合、リモート側が更新されます。tag <tag>
は、refs/tags/<tag>:refs/tags/<tag>
と同じ意味です。 -
-
--all
-
--branches
-
すべてのブランチ(つまり、
refs/heads/
の下のrefs)をプッシュします。 他の<refspec>と一緒に使用することはできません。 -
--prune
-
ローカルに対応するものがないリモートブランチを削除します。 たとえば、同じ名前のローカルブランチがもう存在しない場合、リモートブランチ
tmp
は削除されます。 これは refspecs も尊重し、git push --prune remote refs/heads/*:refs/tmp/*
は、リモートのrefs/tmp/foo
がrefs/heads/foo
が存在しない場合に削除されることを確認するものです。 -
--mirror
-
プッシュする各refに名前を付ける代わりに、
refs/
の下のすべての参照(refs/heads/
とrefs/remotes/
とrefs/tags/
を含むがこれらに限定されない)がリモートリポジトリへミラーリングされるように指定します。 新しく作成されたローカルrefはリモートエンドにプッシュされ、ローカルで更新されたrefはリモートエンドで強制的に更新され、削除されたrefはリモートエンドから削除されます。 これは、構成オプションremote.<remote>.mirror
が設定されている場合のデフォルトです。 -
-n
-
--dry-run
-
実際に更新を送信する以外はすべて行います。
-
--porcelain
-
機械可読出力を生成します。 各refの出力ステータス行はタブで区切られ、stderrではなくstdoutに送信されます。 refの完全な記号名が表示されます。
-
-d
-
--delete
-
リストされているすべてのrefがリモートリポジトリから削除されます。 これは、すべてのrefの前にコロン(
:
)を付けるのと同一です。 -
--tags
-
コマンドラインに明示的にリストされているrefspecsに加えて、
refs/tags
の下にあるすべてのrefがプッシュされます。 -
--follow-tags
-
このオプションがなければプッシュされるであろうすべてのrefをプッシュし、さらに
refs/tags
にある、リモートからは見つからないがプッシュされるrefから到達可能なコミットっぽい何かを指す注釈付きタグをプッシュします。 これは、設定変数push.followTags
で指定することもできます。 詳しくは git-config(1) にあるpush.followTags
を参照してください。 -
--[no-]signed
-
--signed=(true|false|if-asked)
-
プッシュ要求をGPG署名して、受信側のrefを更新し、フックでチェックしたり、ログに記録したりできるようにします。
false
または--no-signed
の場合、署名は試行されません。true
または--signed
の場合、サーバーが署名付きプッシュをサポートしていないと、プッシュは失敗します。if-asked
に設定されている場合、サーバーが署名されたプッシュをサポートしている場合にのみ署名します。gpg --sign
の実際の呼び出しが失敗した場合も、プッシュは失敗します。 受信側の詳細については、 git-receive-pack(1) を参照してください。 -
--[no-]atomic
-
可能な場合は、リモート側でアトミック取引(atomic transaction)を使用します。 すべてのrefが更新されるか、エラーが発生した場合、refは更新されません。 サーバーがアトミックプッシュをサポートしていない場合、プッシュは失敗します。
-
-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を介してリモートリポジトリにプッシュするときや、デフォルトの$PATHのディレクトリに当該プログラムが無いときに便利です。 -
--[no-]force-with-lease
-
--force-with-lease=<refname>
-
--force-with-lease=<refname>:<expect>
-
通常、「git push」は、上書きに使用されたローカルrefの祖先ではないリモートrefの更新を拒絶(refuse)します。
リモートrefの現在の値が期待の(expect)値である場合、このオプションはこの制限をオーバーライドします。 それ以外の場合、「git push」は失敗します。
あなたが、すでに公開しているものをリベースする必要があると想像してください。 最初に公開した履歴をリベースされた履歴に置き換えるには、「早送りしなければならない」ルールをバイパスする必要があります。 あなたのリベース作業中に他の誰かがあなたの元の履歴の上に構築した場合、リモートのブランチの先端は彼らのコミットで前進するかもしれません、そして、あなたが
--force
を伴って盲目的にプッシュすると彼らの作業内容は失われてしまいます。このオプションを使用すると、更新している履歴がリベースされ、置き換えたいものであると期待していると言う事ができます。 リモートrefがまだあなたが指定したコミットを指している場合は、誰もrefに対して何もしなかったことの確認になります。 これは、参照を明示的にロックせずに「リース」(lease;賃借権期間)を取得するようなものであり、リモートrefは「リース」がまだ有効な場合にのみ更新されます。
--force-with-lease
単独では、詳細を指定しないため、現在の値がリモート追跡ブランチと同じである必要があり、更新されるすべてのリモートrefを保護します。--force-with-lease=<refname>
では、期待する値(expected value)を指定しないので、名前付きrefを(単独で)保護します。更新される場合は、現在の値をリモート追跡ブランチと同じにする必要があります。--force-with-lease=<refname>:<expect>
は、現在の値が指定の値<expect>
と同じである必要があることで、指定のref(単独)を保護します(これは、refnameに対して持っているリモート追跡ブランチとは異なることが許可されています。または、この形式を使用する場合は、そのようなリモート追跡ブランチを持つ必要はありません)。<expect>
が空の文字列である場合、指定のrefはまだ存在していてはなりません。注意: refの期待される現在の値を明示的に指定する
--force-with-lease=<refname>:<expect>
以外のすべての形式はまだ実験的であり、この機能の経験を積むにつれてセマンティクスが変わる可能性があることに注意してください。--no-force-with-lease
は、コマンドラインでそれ以前に指定した全ての--force-with-lease
をキャンセルします。安全性に関する一般的な注意: このオプションを期待値(expected value)なしに指定すると、たとえば cronjob でリポジトリの
git fetch origin
のように、プッシュ先のリモートで暗黙的にgit fetch
を実行するものと非常に悪い相互作用が発生します。--force
に対して提供される保護は、作業の基になっていない後続の変更が破壊されないようにすることですが、バックグラウンドプロセスがバックグラウンドで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
タグを作成し、履歴を書き換え、最後にリモートバージョンがまだbase
にあれば、ローカルのremotes/origin/master
がバックグラウンドで何を更新したかに関わらず、変更をmaster
に強制的にプッシュします。あるいは、
--force-with-lease[=<refname>]
と共に補助オプションとして--force-if-includes
を指定すると(つまり、リモート側の ref が正確にどのコミットを指す必要があるか、あるいはリモート側のどの ref を保護しているのかを明示せずに)、 プッシュ時に、バックグラウンドで暗黙的に更新されていたかもしれないリモート追跡 ref からの更新がローカルで統合されているかを、強制更新ができる前に確認することができるようになります。 -
-f
-
--force
-
通常、コマンドは、上書きに使用されたローカルrefの祖先ではないリモートrefの更新を拒否します。 また、
--force-with-lease
オプションを使用すると、コマンドは、現在(current)値が期待(expect)値と一致しないリモートrefの更新を拒否します。このフラグはこれらのチェックを無効にし、リモートリポジトリがコミットを失う原因となる可能性があります。 注意して使用してください。
注意:
--force`は、プッシュされるすべてのrefに適用されることに注意してください。 したがって、 `push.default
をmatching
に設定したり、remote.*.push
で構成された複数のプッシュ先で使用すると、現在のブランチ以外のref(リモートの対応物の背後にあるローカル参照を含む)が上書きされる可能性があります。 1つのブランチのみにプッシュを強制するには、 refspecの前に+
を使用してプッシュします(例:git push origin +master
を使用して、master
ブランチにプッシュを強制します)。 詳細については、上記「<refspec>…」セクションを参照してください。 -
--[no-]force-if-includes
-
リモート追跡refの先端がローカルに統合されている場合にのみ、更新を強制します。
このオプションを使用すると、リモートトラッキング参照の先端が、書き換えのためにそれに基づいているローカルブランチの「ref log」エントリの1つから到達可能かどうかを確認(verify)するチェックが有効になります。 このチェックでは、リモートからの更新がローカルに取り込まれていない場合、強制更新を拒否することで、更新がローカルに取り込まれていることを確認します。
オプションが
--force-with-lease
を指定せずに渡された場合、または--force-with-lease=<refname>:<expect>
と一緒に指定された場合、それは「何もしません」(no-op)。--no-force-if-includes
を指定すると、この振る舞いが無効になります。 -
--repo=<repository>
-
このオプションは、<repository> 引数と同等です。 両方を指定すると、このオプションではなくコマンドライン引数が優先されます。
-
-u
-
--set-upstream
-
最新の、または正常にプッシュされたすべてのブランチについて、引数のない git-pull(1) および その他のコマンドで使用されるアップストリーム(追跡)参照を追加します。 詳細については git-config(1) の
branch.<name>.merge
を参照してください。 -
--[no-]thin
-
これらのオプションは git-send-pack(1) に渡されます。 送信側と受信側が同一オブジェクトを多く共有している場合、thin転送は送信データの量を大幅に削減します。 デフォルトは
--thin
です。 -
-q
-
--quiet
-
エラーが発生しない限り、更新されたrefのリストを含むすべての出力を抑制します。 進行状況を標準エラーストリームに報告しません。
-
-v
-
--verbose
-
おしゃべりな実行を行います。
-
--progress
-
-q
が指定されていない限り、進行状況は、端末に接続されている場合、デフォルトで標準エラーストリームに報告されます。 このフラグは、標準エラーストリームが端末に送信されていない場合でも、進行状況を強制します。 -
--no-recurse-submodules
-
--recurse-submodules=check|on-demand|only|no
-
プッシュされるリビジョンによって使用されるすべてのサブモジュールコミットがリモート追跡ブランチで使用可能であることを確認するために使用できます。
check
が使用されている場合、Gitは、プッシュされるリビジョンで変更されたすべてのサブモジュールコミットが、サブモジュールの少なくとも1つのリモートで使用可能であることを確認します。 コミットが欠落している場合、プッシュは中止され、ゼロ以外のステータスで終了(exit)します。on-demand
が使用されている場合、プッシュされるリビジョンで変更されたすべてのサブモジュールがプッシュされます。 on-demand で必要なすべてのリビジョンをプッシュできなかった場合も中止(abort)され、ゼロ以外のステータスで終了(exit)します。only
を使用すると、すべてのサブモジュールがプッシュされますが、 スーパープロジェクトはプッシュされないままになります。 サブモジュールの再帰が必要ない場合は、値no
または--no-recurse-submodules
を使用して、push.recurseSubmodules
構成変数をオーバーライドできます。on-demand
またはonly
を使用する場合にサブモジュールにpush.recurseSubmodules={on-demand,only}
または `submodule.recurse ` 構成がある場合、さらに再帰が発生します。この場合、 "only" が "on-demand" として扱われます。 -
--[no-]verify
-
pre-push フックをON/OFFします(githooks(5) 参照)。 デフォルトは
--verify` で、フックにプッシュを防ぐ機会を与えます。 `--no-verify
を使用すると、フックは完全にバイパスされます。 -
-4
-
--ipv4
-
IPv6アドレスを無視して、IPv4アドレスのみを使用します。
-
-6
-
--ipv6
-
IPv4アドレスを無視して、IPv6アドレスのみを使用します。
GIT URLS
一般に、URLには、トランスポートプロトコル、リモートサーバーのアドレス、およびリポジトリへのパスに関する情報が含まれています。トランスポートプロトコルによっては、一部の情報が欠落している場合があります。
Gitはsshとgitとhttpとhttpsプロトコルをサポートします(さらにftpとftpsをフェッチに使用できますが、これは非効率的で非推奨です。使用しないでください)。
ネイティブトランスポート(つまり、 git:// URL)は認証を行わないため、セキュリティで保護されていないネットワークでは注意して使用する必要があります。
以下の構文を使用できます:
-
ssh://[user@]host.xz[:port]/path/to/repo.git/
-
git://host.xz[:port]/path/to/repo.git/
-
http[s]://host.xz[:port]/path/to/repo.git/
-
ftp[s]://host.xz[:port]/path/to/repo.git/
代替のscpのような構文をsshプロトコルで使用することもできます:
-
[user@]host.xz:path/to/repo.git/
この構文は、最初のコロン(:)の前にスラッシュがない場合にのみ認識されます。これは、コロンを含むローカルパスを区別するのに役立ちます。たとえば、ローカルパス foo:bar
を、絶対パスまたは ./foo:bar
として指定して、 ssh url として誤って解釈されないようにすることができます。
sshおよびgitプロトコルは、さらに ~username 拡張をサポートします:
-
ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/
-
git://host.xz[:port]/~[user]/path/to/repo.git/
-
[user@]host.xz:/~[user]/path/to/repo.git/
Gitでもネイティブにサポートされているローカルリポジトリの場合、以下の構文を使用できます:
-
/path/to/repo.git/
-
file:///path/to/repo.git/
これらの2つの構文は、前者が --local
オプションの機能を含むクローン作成の場合を除いて、ほとんど同等です。 詳細については、 git-clone(1) を参照してください。
「git clone」と「git fetch」と「git pull」は、「git push」と違って適切なバンドルファイルを受け入れます。 git-bundle(1) を参照してください。
Gitが特定のトランスポートプロトコルを処理する方法を知らない場合、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" や "host.xz:/path/to/repo.git" のような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構成ファイル(configuration file)内のリモート(remote)として、
$GIT_DIR/config
または -
$GIT_DIR/remotes
ディレクトリ内のファイル または -
$GIT_DIR/branches
ディレクトリ内のファイル
これらはすべて、gitがデフォルトで使用するrefspecをそれぞれ含んでいるため、コマンドラインからrefspecを省略できます。
Named remote in configuration file
あなたは、 git-remote(1) を使うか、または git-config(1) を使うか、または $GIT_DIR/config
ファイルを手動で編集して、これ以前に構成したリモートの名前から選択できます。このリモートのURLは、リポジトリへのアクセスに使用されます。コマンドラインでrefspecを指定しない場合、このリモートのrefspecがデフォルトで使用されます。構成ファイルのエントリは以下のようになります:
[remote "<name>"]
url = <URL>
pushurl = <pushurl>
push = <refspec>
fetch = <refspec>
<pushurl>
はプッシュでのみ使用されます。 これはオプションであり、 デフォルトは <URL>
です。 リモートへのプッシュは、 定義されているすべての pushurl に影響します。 pushurl が定義されていない場合は、 すべての定義された url に影響します。 ただし、 複数の url が定義されている場合、 Fetch は最初に定義された url からのみ取得します。
Named file in $GIT_DIR/remotes
あなたは、 $GIT_DIR/remotes
でファイル名を指定できます。このファイルのURLは、リポジトリへのアクセスに使用されます。コマンドラインでrefspecを指定しない場合、このファイルのrefspecがデフォルトとして使用されます。このファイルの形式は以下のとおりです:
URL: one of the above URL format
Push: <refspec>
Pull: <refspec>
Push:
行は git push
で使用され、 Pull:
行は git pull
と git fetch
で使用されます。追加のブランチマッピングのために、複数の Push:
および Pull:
行を指定できます。
Named file in $GIT_DIR/branches
$GIT_DIR/branches
でファイル名を指定できます。このファイルのURLは、リポジトリへのアクセスに使用されます。 このファイルの形式は以下のとおりです:
<URL>#<head>
<URL>
は必須です。 #<head>
はオプションです。
コマンドラインで指定しない場合、操作に応じて、gitは以下のrefspecのいずれかを使用します。 <branch>
は $GIT_DIR/branchs
内のこのファイルの名前であり、 <head>`はデフォルトで `master
になります。
git fetch は以下を使用します:
refs/heads/<head>:refs/heads/<branch>
git push は以下を使用します:
HEAD:refs/heads/<head>
OUTPUT
git push
の出力は、使用する転送方法によって異なります。 このセクションでは、Gitプロトコルで(ローカルまたはssh経由で)プッシュするときの出力について説明します。
プッシュのステータスは表形式で出力され、各行は単一のrefのステータスを表します。 各行の形式は以下のとおりです:
<flag> <summary> <from> -> <to> (<reason>)
--porcelain
が使用されている場合、出力の各行は以下の形式になります:
<flag> \t <from>:<to> \t <summary> (<reason>)
最新のrefのステータスは、 --porcelain
または --verbose
オプションが使用されている場合にのみ表示されます。
- flag
-
refのステータスを示す単一の文字:
- (space)
-
早送り(fast-forward)プッシュに成功した
-
+
-
強制更新に成功した
-
-
-
refの削除に成功した
-
*
-
新しいrefのプッシュに成功した
-
!
-
プッシュが拒否された、またはプッシュに失敗したref
-
=
-
すでに最新でプッシュする必要がなかったref
- summary
-
正常にプッシュされたrefの場合、概要には、refの古い値と新しい値が
git log
の引数として使用するのに適した形式で表示されます(ほとんどの場合は<old>..<new>
で、強制的な非早送り更新の場合は<old>...<new>
です)。失敗した更新については、以下の詳細が示されます:
- rejected
-
Gitはrefをまったく送信しようと試みませんでした。これは通常、それが早送り(fast-forward)では無く、かつ、あなたが更新を強制しなかったためです。
- remote rejected
-
リモートエンドが更新を拒否しました。 通常、リモート側のフックが原因で発生するか、リモートリポジトリで次の安全オプションのいずれかが有効になっていることが原因です:
receive.denyCurrentBranch
(チェックアウトされたブランチへのプッシュ用) またはreceive.denyNonFastForwards
(強制的な非早送り更新用) またはreceive.denyDeletes
またはreceive.denyDeleteCurrent
です。 git-config(1) を参照してください。 - remote failure
-
リモート側は、おそらくリモート側での一時的なエラー、または、ネットワーク接続の切断、または、その他の一時的なエラーのために、refの正常な更新を報告しませんでした。
- from
-
プッシュされるローカルrefの名前から、その
refs/<type>/
プレフィックスを取り除いたもの。 削除の場合、ローカルrefの名前は省略されます。 - to
-
更新されるリモートrefの名前から、
refs/<type>/
プレフィックスを取り除いたもの。 - reason
-
人間が読める説明。 正常にプッシュされたrefの場合、説明は必要ありません。 失敗したrefについては、失敗の理由が説明されています。
NOTE ABOUT FAST-FORWARDS
更新によって、コミットAをポイントしていたブランチ(またはより一般的にはref)が別のコミットBをポイントするように変更された場合、BがAの子孫である場合に限り、早送り(fast-forward)更新と呼ばれます。
AからBへの早送り(fast-forward)更新では、元のコミットA上に構築されたコミットのセットは、新しいコミットB上に構築されたコミットのサブセットです。 したがって、履歴が失われることはありません。
対照的に、非早送り更新は履歴を失います。 たとえば、あなたと他の誰かが同じコミットXで開始し、あなたがコミットBにつながる履歴を作成し、他の人がコミットAにつながる履歴を作成したとします。そうすると履歴は以下のようになります:
B
/
---X---A
さらに、もう一人が既に A につながる変更を元のリポジトリにプッシュしており、そこからあなたたち二人が元のコミット X を取得したとします。
他の人が行ったプッシュにより、コミットXをポイントしていたブランチがコミットAをポイントするように更新されました。これは早送りです。
しかし、あなたがプッシュしようとすると、コミットBでブランチ(現在はAを指している)を更新しようとします。これは早送りにはなりません。 そうすると、コミット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
を使用して、A上のXとBの間のあなたの変更をリベースし、結果をプッシュバックすることもできます。 リベースは、A上のXとBの間の変更を構築する新しいコミットDを作成します。
B D
/ /
---X---A
繰り返しになりますが、このコミットでAを更新すると早送り(fast-forward)され、プッシュが受け入れられます。
プッシュしようとしたときに非早送拒否(non-fast-forward rejection)が発生する可能性がある別の一般的な状況があります。これは、他の誰もプッシュしていないリポジトリにプッシュしている場合でも発生する可能性があります。 自分でコミットAをプッシュした後(このセクションの最初の図)、コミットBを生成するために「git commit --amend」に置き換え、すでにAをプッシュしたことを忘れたため、プッシュしようとします。 このような場合、その間に誰も以前のコミットAをフェッチしなかった(そしてその上にビルドを開始した)ことが確実な場合にのみ、「git push --force」を実行して上書きできます。 言い換えれば、「git push --force」は、履歴を失うことを意味する場合のために予約されているメソッドです。
EXAMPLES
-
git push
-
git push <remote>
のように機能します。ここで、<remote>は現在のブランチのリモート(または、現在のブランチにリモートが構成されていない場合はorigin
)です。 -
git push origin
-
追加の構成がない場合、現在のブランチが、構成されたアップストリームの現在のブランチと同一の名前の場合は、現在のブランチを構成されたアップストリーム(
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
に一致するrefを探し(ほとんどの場合refs/heads/master
を探し)、origin
リポジトリで同一ref(例:refs/heads/master
)を更新します。master
がリモートに存在しなかった場合は作成されます。 -
git push origin HEAD
-
現在のブランチをリモートの同一の名前にプッシュする便利な方法。
-
git push mothership master:satellite/master dev:satellite/dev
-
master
と一致するソースref(例:refs/heads/master
)を使用して、mothership
リポジトリ内のsatellite/master
(おそらくrefs/remotes/satellite/master
)と一致するrefを更新します。dev
とsatellite/dev
についても同様にします。マッチングのセマンティクスの説明については、 上記「<refspec>…」について説明しているセクションを参照してください。
これは、
mothership
で実行されるgit fetch
を、satellite
での作業を統合するために逆方向に実行されるgit push
でエミュレートするもので、一方通行でしか接続できないときによく必要になります(つまり、satellite
はsshでmothership
に入ることができますが、satellite
がファイアウォールの背後にあるか、sshdを実行していないため、mothership
は `satellite`への接続を開始できません)。この
git push
をsatellite
のマシンで実行した後、mothership
に ssh してgit merge
を実行すれば、satellite
で行われた変更をgit pull
でプルするエミュレーションが完成します。 -
git push origin HEAD:master
-
現在のブランチを、
origin
リポジトリ内のmaster
に一致するリモートrefにプッシュします。 この形式は、ローカル名を気にせずに現在のブランチをプッシュするのに便利です。 -
git push origin master:refs/heads/experimental
-
現在の
master
ブランチをコピーして、origin
リポジトリにブランチexperimental
を作成します。 これは、ローカル名とリモート名が異なる場合に、リモートリポジトリに新しいブランチまたはタグを作成する時のみ必要な形式です。 それ以外の場合は、ref名自体で機能します。 -
git push origin :experimental
-
origin
リポジトリでexperimental
に一致するref(たとえばrefs/heads/experimental
)を見つけて削除します。 -
git push origin +dev:master
-
origin リポジトリのmasterブランチをdevブランチで更新し、早送り以外の更新(non-fast-forward updates)を可能にします。「これにより、参照されていないコミットが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
コマンドによって削除されます。
SECURITY
フェッチおよびプッシュプロトコルは、共有することを意図していない一方の側が他方のリポジトリからデータを盗むのを防ぐようには設計されていません。悪意のある者から保護する必要のあるプライベートデータがある場合、最善のオプションはそれを別のリポジトリに保存することです。これは、クライアントとサーバーの両方に適用されます。特に、サーバー上の名前空間は、読み取りアクセス制御には効果的ではありません。リポジトリ全体への読み取りアクセスで信頼できるクライアントにのみ、名前空間への読み取りアクセスを許可する必要があります。
既知の攻撃ベクトル(attack vectors)は以下のとおりです:
-
被害者は、明示的に共有することを意図していないオブジェクトのIDをアドバタイズする "have" 行を送信しますが、他にもIDを持っている者が居る場合は、転送を最適化するために使用できます。攻撃者はオブジェクトID Xを選択して盗み、refをXに送信しますが、被害者はすでにXのコンテンツを持っているため、Xのコンテンツを送信する必要はありません。 これで、被害者は攻撃者がXを持っていると信じ、Xのコンテンツを後で攻撃者に送り返します。 (この攻撃は、クライアントがアクセスできる名前空間にXへのrefを作成してフェッチすることにより、クライアントがサーバー上で実行するのが最も簡単です。サーバーがクライアント上で実行する最も可能性の高い方法は、Xをパブリックブランチにマージし、ユーザーがこのブランチで追加の作業を行い、マージに気付かずにサーバーにプッシュバックすることを期待します。)
-
#1 と同様に、攻撃者は盗むオブジェクトID Xを選択します。被害者は、攻撃者がすでに持っているオブジェクトYを送信し、攻撃者はYではなくXを持っていると誤って主張するため、被害者はYをXに対するデルタとして送信します。デルタは、攻撃者にYに類似したXの領域を明らかにします。
CONFIGURATION
このセクションの以下のすべては、 git-config(1) ドキュメントの抜粋です。 内容は git-config(1) ドキュメント にあるものと同一です:
- push.autoSetupRemote
-
true
に設定すると、現在のブランチの上流追跡(upstream tracking)が存在しない場合、デフォルトのpushで--set-upstream
を想定します。 このオプションは、 push.default オプションのsimple
やupstream
やcurrent
で有効になります。 (push.default=current
の振る舞いのように、)デフォルトで新しいブランチをデフォルトのremoteにプッシュしたい場合に便利で、これは、あなたが上流追跡(upstream tracking)も設定したい場合にも便利です。 このオプションの恩恵を受ける可能性が最も高いワークフローは、すべてのブランチがremoteで同じ名前を持つことが期待される「単純な」中央ワークフローです。 - push.default
-
(コマンドライン、構成、またはその他の場所で、)refspecが指定されていない場合に
git push
が実行するアクションを定義します。 特定の作業フローに適するさまざまな値があります。 たとえば、純粋に中央のワークフロー(つまり、フェッチ元がプッシュ先と等しい)では、upstream
がおそらく必要なものです。 可能な値は以下のとおりです:-
nothing
- refspecが指定されていない限り、何もプッシュ(エラー出力)しないでください。 これは主に、常に明示的にすることで間違いを避けたい人を対象としています。 -
current
- 現在のブランチをプッシュして、受信側で同一の名前のブランチを更新します。 中央作業フローと非中央作業フローの両方で機能します。 -
upstream
- 現在のブランチを、通常その変更が現在のブランチに統合されるブランチにプッシュバックします(これを@{upstream}
と呼びます)。 このモードは、通常プルするのと同じリポジトリ(つまり中央ワークフロー)にプッシュする場合にのみ意味があります。 -
tracking
- これはupstream
の非推奨の同義語です。 -
simple
- リモートで同一の名前の現在のブランチをプッシュします。あなたが一元化された作業フロー(あなたのプル元の同一のリポジトリにプッシュする、通常は
origin
)で作業している場合は、あなたは同一の名前でアップストリームブランチを構成する必要があります。このモードはGit2.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値を指定すると、--signed
linkgit:git-push [1]に渡されたかのように、すべてのプッシュがGPG署名されます。 文字列if-asked
を指定し、サーバーがサポートしている場合は、--signed=if-asked
がgit push
に渡されたかのように、プッシュで署名されます。 誤った値は、優先度の低い構成ファイルの値を上書きする可能性があります。 明示的なコマンドラインオプションは、常にこの設定オプションを上書きします。 - 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
が使用されます(submodule.recurse
が設定されている場合、submodule.recurse
の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 push
のビットマップの使用が無効になり、他の git 操作でのビットマップの使用が妨げられません。 デフォルトはtrue
です。
GIT
Part of the git(1) suite