ブランチを指定しない「git push」のデフォルトの動作


1366

次のコマンドを使用して、リモートブランチにプッシュします。

git push origin sandbox

私が言うなら

git push origin

他のブランチにも変更をプッシュしますか、それとも現在のブランチのみを更新しますか?私には3つのブランチmasterproductionありsandboxます。

git push私は良いのためにこれを明確にしたいと思いますので、ドキュメントには、このことについて非常に明確ではありません。

次のgit pushコマンドはどのブランチとリモートを正確に更新しますか?

git push 
git push origin

origin 上記はリモートです。

git push [remote] [branch]そのブランチのみをリモートにプッシュすることを理解しています。


一般的に差分ツールの設定、および新しいスクリプトのgit difftoolについては、私は、この他のSOの質問に新しい答えを追加しました:stackoverflow.com/questions/255202/...
VonC

67
私は、興味深いかもしれないの驚くべき動作についてブログ投稿しましたgit push
Mark Longair

1
@Mark:他の作業では、現在のブランチのみを追跡された上流にプッシュします。いいね。
VonC、2011年


help.github.com/articles/pushing-to-a-remoteこのリンクをここに置いて、私のような初心者にすぐに役立つように
MycrofD

回答:


1591

git設定でpush.defaultを設定することで、デフォルトの動作を制御できます。以下からのgit-config設定(1)ドキュメント

push.default

コマンドラインでrefspecが指定されていない場合、リモートでrefspecが構成されていない場合、およびコマンドラインで指定されたオプションのいずれによってもrefspecが暗黙指定されていない場合に、git pushが実行するアクションを定義します。可能な値は次のとおりです。

  • nothing:何もプッシュしないでください

  • matching:一致するすべてのブランチをプッシュします

    両端に同じ名前を持つすべてのブランチは、一致していると見なされます。

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

  • upstream:現在のブランチを上流のブランチにプッシュします(上流trackingの非推奨の同義語です)

  • current:現在のブランチを同じ名前のブランチにプッシュします

  • simple:(Git 1.7.11の新機能)アップストリームに似ていますが、アップストリームのブランチの名前がローカルのブランチの名前と異なる場合、プッシュを拒否します

    これは最も安全なオプションであり、初心者に適しています。

    このモードは、Git 2.0のデフォルトになりました。

シンプルな現在のモードとアップストリームモードは、他のブランチがまだ押し出される準備ができていない場合でも、作業の終了後に単一のブランチを押し出したい人向けです。

コマンドラインの例:

現在の構成を表示するには:

git config --global push.default

新しい構成を設定するには:

git config --global push.default current

11
これはv1.6.3の新機能であることはおそらく注目に値します:kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
この "push.default"は、複数のリポジトリを操作するためにこれまでで最大のものです。「追跡」に設定すれば、問題ありません。これらをブランチ--set-upstreamと組み合わせると、プッシュとプルの方法がより便利になります。
jpswain 2010

13
"tracking"は "upstream"の非推奨の同義語です:kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
Git 1.7.11以降、新しいsimpleモードが追加されたことは注目に値します。このモードは、将来的にデフォルトになることを目的としています。simpleのようupstreamに動作しますが、のようにcurrentブランチ名が両端で同じである必要があります。
カイ

9
Git 2.0以降、simple動作がデフォルトになっていることに注意してください。
do0g 2015

209

push.defaultを使用して、gitのデフォルトの動作を設定できます

git config push.default current

または、多くのリポジトリがあり、すべてに同じものを使用したい場合

git config --global push.default current

この設定のcurrentは、デフォルトではgit pushを実行したときにのみ現在のブランチをプッシュすることを意味します

その他のオプションは次のとおりです。

  • なし:何もプッシュしません
  • matching:すべての一致するブランチをプッシュします(デフォルト)
  • Tracking:現在のブランチを追跡しているものにプッシュします
  • current:現在のブランチをプッシュします

更新-これを行う新しい方法

Git 1.7.11以降、次の操作を実行します。

git config --global push.default simple

これは、現在と同じように機能する新しい設定であり、噂によるとデフォルトでv 2.0からgitになります。


29
はい、私はあなたが言及している答えを読みましたが、その答えは何をすべきかを示すだけで、どのようにすべきかを示していません。だから私は私の答えを追加したので、それを設定するために必要なすべての情報は同じページにあります。
Christoffer

3
OK; 多くの票を獲得する可能性は低いので、誰もあなたの回答を見ることはできないため、上記の投稿の編集を提案することをお勧めします
CharlesB

現在のブランチにプルするにはどうすればよいですか?git pull origin?
フランソワ

200

git push originでリモートブランチに一致している地元の枝にすべての変更をプッシュしますoriginとしてのためにgit push

のようgit push <remote>に機能します。<remote>は、現在のブランチのリモート(または、現在のブランチにリモートが構成されていない場合は、オリジン)です。

マニュアルページの例のセクションからgit-push


2
はい、それはそれを明確にします。おそらく、manページにこれらの例がない古いバージョンのgit(1.6.1.1 Mac OS X)を実行しています。
PlagueHammer 2009年

おそらく1.6.3.1を実行しています。リンクしたサイトで見つけました。
baudtack 2009年

2
したがって、私の場合、すべてのローカルブランチが同じリモート「オリジン」を持っている場合、「git push」は、リモートに対応するブランチを持つローカルブランチのみをプッシュする「git push origin」とまったく同じになります。
PlagueHammer、2009年

@Debajit正解です!ところで素晴らしい質問です。私はいつもgit pushは現在のブランチをプッシュするだけだと思いました。どうやらそうではない!知ってとても良い。
ボータック2009年

5
この質問は古いですが、新しい人にとっては@docgnomeが正しいです。「git push origin」を実行するだけで、現在のブランチだけでなく、すべてのブランチがプッシュされます。「git push -f -v -n origin development」を使用して、developmentという名前のブランチを強制的にプッシュします。-nフラグを使用してgit push結果をシミュレートし、影響を受けるブランチを事前に確認できます。問題がなければ、「git push -f -v origin development」を実行します。これは便利かもしれませんstackoverflow.com/questions/3741136/git-push-f-vs
ディランValade

54

次のように、コードをブランチにコミットしてgithubにプッシュしました。

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

3
`git commit -am" ... "`へのコミットを圧縮できます
James Harrington

17
この回答は質問と関係がありますか?:?
Asim KT 2016

26

Git Pushに関する非常に便利で役立つ情報は次のとおりです 。GitPush:Just the Tip

git pushの最も一般的な用途は、ローカルの変更をパブリックアップストリームリポジトリにpushすることです。アップストリームが「origin」という名前のリモート(リポジトリがクローンの場合はデフォルトのリモート名)であり、更新されるブランチが「master」(デフォルトのブランチ名)であるとすると、これは次のように行われます。git push origin master

git push origin すべてのローカルブランチから、元のリモートの一致するブランチに変更をプッシュします。

git push origin master ローカルマスターブランチからリモートマスターブランチに変更をプッシュします。

git push origin master:staging 変更が存在する場合、ローカルマスターブランチからリモートステージングブランチに変更をプッシュします。


git push origin branch_name何らかの理由でbranch_nameブランチだけでなく、他のローカルブランチ(gitバージョン1.9.1)もプッシュします。
mrgloom

git push origin master:staging素晴らしい隠された宝石です!
Shakeel 2017年

19

(2012年3月)
注意:デフォルトの " matching"ポリシーはすぐに変更さ
れる可能性があります(git1.7.10以降の場合もあります)

説明してください:何をプッシュするかを言わない場合、「git push」は何をすべきですか?」を参照してください。

現在の設定(つまりpush.default=matching)では、git push引数を指定しないと、ローカルおよびリモートに存在する同じ名前のすべてのブランチがプッシュされます
これは通常、開発者が自分のパブリックリポジトリにプッシュする場合に適していますが、共有リポジトリを使用する場合、危険ではない場合でも混乱する可能性があります。

提案は、デフォルトを ' upstream'変更することです。つまり、現在のブランチのみをプッシュし、それをgit pullがプルするブランチにプッシュします。
別の候補は ' current'です。これにより、現在のブランチのみが同じ名前のリモートブランチにプッシュされます。

これまでに議論されたことはこのスレッドで見ることができます:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

以前の関連する議論は次のとおりです。

ディスカッションに参加するには、git @ vger.kernel.orgにメッセージを送信してください。


18

私はこれを自分の.gitconfigエイリアスセクションに入れて、それがどのように機能するかを気に入っています:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

現在のブランチをで起点に、git pubまたはで別のリポジトリをプッシュしgit pub repo-nameます。おいしい。


4
これはすばらしいことですが、残念ながら、他のリポジトリでブランチが同じ名前であると想定しています。git push -u --repo="origin" $1;代わりに試してください。別のリポジトリにプッシュする場合を除いて、ブランチ名は、プッシュ元のリポジトリではなく、他のリポジトリで使用される名前になります
Casebash

やあ、ありがとう!プッシュする前に追跡ステータスをチェックする、より完全なバージョンを実行したい。しかし、リポジトリ間でブランチ名が異なることはめったにないので、私は今のところ私に固執します。
Mat Schaffer


8

git pushはすべてのローカルブランチをリモートサーバーにプッシュしようとしますが、これはおそらく望ましくないことです。これに対処するための便利な設定がいくつかあります。

エイリアス「gpull」と「gpush」を適切に:

私の〜/ .bash_profile

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

したがって、「gpush」または「gpull」を実行すると、「現在オン」のブランチのみがプッシュされます。


3
常にgpushの動作が必要な場合は、git-pushのmanページの例のセクションで説明したように、remote.origin.push = HEAD(たとえば、「git config remote.origin.push HEAD」)を設定することもできます。
Trevor Robinson

5
上記の "Brian L"の投稿を見れば、これは必要ありません。
jpswain 2010

1
同等のものがないので、です。プルpull.default
SamGoody

8

のデフォルトの動作は、.gitconfigたとえば次のように変更できます。

[push]
  default = current

現在の設定を確認するには、次を実行:

git config --global --get push.default

3

エイリアスを使用するよりも、git-XXXスクリプトを作成してソースをより簡単に制御できるようにします(私たちの開発者は全員、この種のもののパスに特定のソース制御されたディレクトリを持っています)。

このスクリプト(と呼ばれるgit-setpush)は、valueの構成remote.origin.push値を、現在のブランチのみをプッシュするものに設定します。

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

ここでは、を使用Gerritrefs/for/XXXているため、レビューブランチにプッシュするようにターゲットを設定しています。また、originがリモート名であると想定しています。

ブランチをチェックアウトしてから呼び出します

git checkout your-branch
git setpush

チェックアウトもできるように改造することはできますが、私はスクリプトが1つのことを実行し、それをうまく実行するの好きです


gerritを使用するためにremote.origin.pushを設定する素晴らしいアイデア。私のローカル機能ブランチfeature/fix_fubarはすべて、masterまたはのようなより一般的な上流のブランチを指しているdevelopため、これは間違った上流を指します。ジャーリット制御のリポジトリのローカルフローはどのように見えますか?
spazm

gerritに「ターゲット」ブランチが1つしかない場合は、単純に試してくださいgit config remote.origin.push HEAD:refs/for/master
fracz 2015

2

これらのタスクを自動化するために、.bashrcファイルに次の関数を追加しました。git push / git pull +現在のブランチの名前を実行します。

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.