新しいブランチを明示的にプッシュする必要があるのはなぜですか?


180

私は新しくてgit、練習しています。ローカルブランチを作成しましたが、作成したときにgit push自分のブランチがリポジトリにアップロードされていないことがわかりました。私は実際にやらなければなりませんgit push -u origin --allでした:。
どうしてこれなの?ブランチはデフォルトでプッシュされる新しい変更ではありませんか?2番目のコマンドを実行する必要があるのはなぜですか?


15
これは構成可能であることに注意してください(設定push.default、を参照man git-config)。実行するとgit config --add push.default currentgit push必要に応じてリモートリポジトリにブランチが自動的に作成されます。これがデフォルトではない理由は、回答で説明されています。
sleske 2013年

@sleske同意する。他のポリシー「current」および「upstream」については、以前の回答stackoverflow.com/a/13751847/6309を参照してください。
VonC 2013年

答えを受け入れませんか?
laike9m 2014年

回答:


224

実際の理由は、新しいリポジトリ(git init)にブランチがないブランチがない、ブランチがない、ブランチがないmaster)ことです。

したがって、初めて空の 上流リポジトリ(通常はベアリポジトリ)にプッシュする場合、その上流リポジトリには同じ名前のブランチがありません。

そして:

どちらの場合も、上流の空のリポジトリにはブランチがないため、

  • 一致する名前付きブランチはまだありません
  • 上流ブランチはまったくありません(同じ名前の有無にかかわらず!追跡の有無)

つまり、ローカルの最初のプッシュはまったくわかりません。

  • どこにプッシュするか
  • 何をプッシュするか(リモートトラッキングブランチとして記録されているか、同じ名前を持つ上流ブランチが見つからないため)

したがって、少なくとも次のことを行う必要があります。

git push origin master

しかし、それだけを行うと、次のようになります。

  • 上流に上流masterブランチを作成します(現在は空でないリポジトリ):良いです。
  • ローカルブランチ ' 'をアップストリーム() ' '(アップストリームブランチ)にプッシュする必要があることを記録しません:不正です。masteroriginmaster

そのため、最初のプッシュでは、次のことを行うことが推奨されます。

git push -u origin master

これorigin/masterにより、リモートトラッキングブランチとして記録され、次のプッシュが自動的にプッシュさmasterれるようになりorigin/masterます。

git checkout master
git push

また、プッシュポリシー ' current'または ' upstream'でも機能します。
いずれの場合も、最初のの後、git push -u origin master単純なgit pushでマスターを右の上流ブランチにプッシュし続けることができます。


2
このポイントの後、次git pushはブランチがすでに存在することも期待していますか?
Cratylus 2013年

2
はい。そのブランチの更新を上流のリポジトリにプッシュします。
RyPeck 2013年

@Cratylusはい、新しいデフォルトのプッシュポリシー ' simple'のため:上流のブランチがローカルブランチと同じ名前を持つ場合、記録された上流のブランチにプッシュします。シンプルgit pushで十分です。
VonC 2013年

1
@ButtleButkusありがとうございます。リンクを元に戻しました。
VonC、2015年

3
質問者のより一般的な新しいブランチ 'new_branch'の場合は、git push --set-upstream origin new_branchまたはgit push -u origin new_branchを使用します。-all質問者は、すべての枝を含むことによって、特定の新しいブランチを命名バイパス使用していること。+ Klas Mellbournが彼の回答でカバーしています。
Paul Masri-Stone

106

あなたはしません、以下を見てください

ロケットを月に向けて発射するつもりはないので、この「機能」はかなり迷惑だと思います。いまいましいブランチを押してください。おそらくあなたもそうしないと、あなたはここにいないでしょう!

ここに修正があります:現在のブランチがoriginに存在するかどうかに関係なく暗黙的に現在のブランチをプッシュしたい場合は、このコマンドを1度発行するだけで、どこにも再度実行する必要はありません

git config --global push.default current

したがって、次のようなブランチを作成するとします。

git checkout -b my-new-branch

そしていくつかのコミットをしてから

git push -u

それらを元の場所に(そのブランチ上にある)取得し、存在しない場合は、そのブランチを作成します。

上記のブランチから後でプルする場合、-uビットはそれらが確実にリンクされることに注意してください。後でブランチをプルする予定がない場合(または、別のライナーを使用しても問題ない場合)、-uは必要ありません。


3
これを行うとき、直後にgit pullを実行すると、2つのブランチはリンクされません。:(
Alisso

これが私の問題を解決した唯一の答えです。
レイモンドシュノン2017年

2
それらをリンクするには、git push -u
Ben Creasy

ありがとう!この答えは、迅速かつ「汚い」ソリューションとして受け入れられるべきです。OPの意図に最も近いと確信しています。
youngrrrr

3
>月にロケットを打ち上げるつもりはありません。 - はい。
VCavallo

39

git push新しいブランチをプッシュするときの出力

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

単純な例でgit pushは、現在のローカルブランチが追跡しているリモートブランチがすでに存在していると想定しています。そのようなリモートブランチが存在せず、それを作成する場合は、-u(の短縮形の--set-upstream)フラグを使用してそれを指定する必要があります。

これはなぜですか?実装者は、リモートでブランチを作成することは非常に大きなアクションであり、誤って行うのは難しいと感じたと思います。git pushいつもやっていることです

「ブランチはデフォルトでプッシュされる新しい変更ではないですか?」Gitの「変更」はコミットだと私は思います。ブランチはコミットへのポインタです。私にとって、プッシュは他のリポジトリにコミットをプッシュするものと考える方が理にかなっています。どのコミットがプッシュされるかは、現在のブランチと、そのブランチとリモート上のブランチとの追跡関係によって決まります。

ブランチの追跡の詳細については、Pro Gitブックのリモートブランチの章を参照してください


取得できませんでしたfatalが、ブランチですでにコミットを実行していました。
Cratylus 2013年

@Cratylusいいえ、関係ありません。コミットはリポジトリで安全でありgit push -u origin、リモートリポジトリにコピーされます。
Klas Mellbourn 2013年

いいえ、私が答えfatalであなたが言及したようなメッセージを受け取っていないという事実を意味します。この違いは、ブランチに何かをコミットしたという事実に依存しますか?
Cratylus 2013年

@Cratylusなぜfatalメッセージが届かなかったのかわかりません。違いは、使用しているgitの実装によって異なります。私の出力は1.8.1.msysgit.1からのWindows 8上で実行されている
KLAS Mellbourn

私は同じバージョンを持っていますが、Vistaを使用しています
Cratylus

4

元の開発者による根拠はこれほど早く見つかりませんでしたが、Gitの数年の経験に基づいて、知識に基づいた推測を提供できます。

いいえ、すべてのブランチが外部にプッシュしたいものではありません。それは私的な実験を表すかもしれません。

さらに、git pushすべてのブランチをどこに送信する必要がありますか?Gitは複数のリモートで動作するため、それぞれに異なるブランチセットが必要になる場合があります。たとえば、中央プロジェクトのGitHubリポジトリにはリリースブランチがある場合があります。GitHubフォークには、レビュー用のトピックブランチがある場合があります。ローカルGitサーバーには、ローカル構成を含むブランチがある場合があります。git push現在のブランチが追跡するリモートにすべてのブランチをプッシュする場合、この種のスキームは簡単に失敗します。


1)It might represent a private experimentわかりましたが、大したことは何ですか?誰もが作業している「メイン」ブランチ、つまりmaster影響を受けません。ソースコードを隠しておくつもりでない限り2)git push, without a remote, pushes to the current branch's remote私はここであなたを失いました:(
Cratylus

@Cratylus:1)何十人もの開発者がすべてアドリブを担当するプロジェクトでは、非常に面倒なリポジトリを取得することになります。私はそのようなプロジェクトに取り組んでおり、git fetch毎回何百ものハーフワーキングブランチにしたくありません。2)git pushのデフォルトの動作を指します。もしあれば、現在のブランチが追跡していることをリモートにプッシュします。
Fred Foo

3

HEADは現在のブランチの略なので、git push -u origin HEADが機能します。ここで、エイリアスを使用するたびにこの入力を回避します。

git config --global alias.pp 'push -u origin HEAD'

この後、git -bブランチで作成したブランチをプッシュするたびに、次のコマンドを使用してプッシュできます。

git pp

これが誰かの時間を節約することを願っています!


2

まずチェック

ステップ-1:git remote -v
// git初期化が見つかった場合は、ステップ2を削除またはスキップします

ステップ-2:git remote rm origin
//その後、メールアドレスをグローバルに設定しますgit

ステップ-3: git config --global user.email "youremail@example.com"

ステップ-4: git initial

ステップ5:git commit -m "Initial Project"
//すでにプロジェクトリポジトリを追加している場合は、ステップ6をスキップします

ステップ-6: git remote add origin %repo link from bitbucket.org%

ステップ-7: git push -u origin master


1

私はこの問題のさらなる順列を経験しました。

feat/XYZ-1234-some-descriptionJira課題1234で作業していたため、名前が付けられたブランチがありました。作業中に、より小さな作品を追跡するために新しいJira課題を作成しました。に:

git push -u origin feat/XYZ-5678-a-different-description # failed

これにより、このSOスレッドで議論されているエラーが発生しました。しかし、現在のブランチとは異なるブランチ名にプッシュしようとしているため、私の問題はここで説明したものとは異なりました。プッシュする前に、ローカルブランチの名前を変更することになりました。

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

もう少し読んだ後、私はにを現在のブランチ名または適切な場合にだけ設定できることに気づきsrcました :git pushHEAD

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

新しいブランチから新しい変更を初めてプッシュできるようにする場合。そしてエラーを下回る:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

現在のブランチをプッシュし、リモートをアップストリームとして設定するには、次を使用します

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.