web-dev-qa-db-ja.com

ブランチを指定しない場合の "git Push"のデフォルトの振る舞い

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

git Push Origin sandbox

私が言うなら

git Push Origin

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

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

git Pushのコマンドが正確に更新されますどの枝やリモコン?

git Push 
git Push Origin

上記のOriginはリモートです。

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

1294
PlagueHammer

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の新機能)upstreamと似ていますが、上流のブランチの名前がローカルのものと異なる場合はPushを拒否します

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

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

シンプルモード、現在モード、アップストリームモードは、他のブランチがまだプッシュアウトする準備ができていない場合でも、作業終了後に1つのブランチをプッシュアウトしたい人のためのものです。

コマンドラインの例:

現在の設定を表示するには

git config --global Push.default

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

git config --global Push.default current
1514
Brian L

Push.defaultを使ってgitのデフォルトの振る舞いを設定できます。

git config Push.default current

あるいは、たくさんのリポジトリがあり、そのすべてを同じものにしたい場合

git config --global Push.default current

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

他のオプションは以下のとおりです。

  • nothing:何も押さないでください
  • matching:すべての一致するブランチをプッシュする(デフォルト)
  • tracking:現在のブランチを追跡しているものにプッシュします
  • current:現在のブランチを押す

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

Git 1.7.11以降では、次のようにします。

git config --global Push.default simple

これはcurrentと同じように動作する新しい設定で、v 2.0からgitにデフォルト設定されます。

197
Christoffer

git Push Originは一致するリモートブランチを持つローカルブランチへのすべての変更をOriginにプッシュしますgit Push

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

git-PushのmanページのExamplesセクションから

197
baudtack

私は自分のコードをブランチにコミットして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
54
neoneye

以下は、Git Pushに関する非常に便利で役立つ情報です: Git Push:Just the Tip

Git Pushの最も一般的な使用法は、ローカルの変更をパブリックなアップストリームリポジトリにプッシュすることです。アップストリームが「Origin」という名前のリモート(リポジトリがクローンの場合のデフォルトのリモート名)であり、更新されるブランチの名前が「master」(デフォルトのブランチ名)であると仮定すると、git Push Origin master

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

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

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

24

(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

これまでに関連した議論は次のとおりです。

ディスカッションに参加するには、メッセージを[email protected]に送ってください。

19
VonC

私はちょうどこれを私の.gitconfig aliasesセクションに入れて、それがどのように機能するかが好きです:

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

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

17
Mat Schaffer

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"を実行すると、 "現在オン"のブランチだけがプッシュされます。

8
Cody Caughlan

現在のブランチをコマンドでプッシュできます

git Push Origin HEAD

ここ から取った)

8
Andriy F.

.gitconfig でデフォルトの動作を変更することができます。例えば:

[Push]
  default = current

現在の設定を確認するには、次のコマンドを実行してください。

git config --global --get Push.default
7
kenorb

エイリアスを使用するよりも、私はgit-XXXスクリプトを作成して、それらをより簡単にソース管理できるようにすることを好みます(私たちの開発者は皆、この種のもののために特定のソース管理ディレクトリを持っています)。

このスクリプト(git-setpushと呼ばれる)は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

Gerrit を使っているので、レビューブランチにプッシュするためにターゲットをrefs/for/XXXに設定します。また、Originがあなたのリモートネームであると仮定します。

でブランチをチェックアウトした後にそれを呼び出す

git checkout your-branch
git setpush

それは明らかにチェックアウトもするために適応させることができます、しかし私はスクリプトを好きです 1つのことをして、それをうまくやる

3
Mark Fisher

これらの作業を自動化するために、.bashrcファイルに次の関数を追加しました。現在のブランチのgit Push/git pull + nameを行います。

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
}
2
MichaelMoser