新しいローカルブランチをリモートGitリポジトリにプッシュして追跡する方法を教えてください。


4307

次のことができるようになりたいです。

  1. いくつかの他の(リモートまたはローカル)の枝に基づいて、ローカルブランチを作成します(経由git branchまたはgit checkout -b

  2. ローカルブランチをリモートリポジトリにプッシュ(公開)しますが、追跡可能にするgit pullgit pushすぐに機能します。

それ、どうやったら出来るの?

--set-upstreamはGit 1.7で知っていますが、それは作成後のアクションです。ブランチをリモートリポジトリにプッシュするときに同様の変更を行う方法を見つけたいと思います。



72
指摘するだけです--set-upstream is -u
Huang

@BaiyanHuang指摘してくれてありがとう。当初、私は-uが私には意味のない追跡されていないことを意味すると思っていました
Dmitry

回答:


6613

Git 1.7.0以降では、新しいブランチをチェックアウトできます。

git checkout -b <branch>

ファイルを編集し、追加してコミットします。次に(省略形オプションでプッシュし-u--set-upstreamます。

git push -u origin <branch>

Gitはプッシュ中に追跡情報をセットアップします。


81
それはあなたがすでにブランチに設定されている既存の追跡ブランチを持っている場合はプッシュしている、とすることも注目に値しますpush.defaultに設定されているupstream、これはあなたがそれを行うだろうと思い何を行うことはありません。既存の追跡ブランチをプッシュしようとします。使用:git push -u origin mynewfeature:mynewfeatureまたはgit branch --unset-upstream最初に行います。
void.pointer 2014年

13
Visual StudioからGitを使用しているユーザーの場合:これは、実際にはVisual Studioの「ブランチの公開」が行うことです。-uパラメーターを指定してgit pushを実行した後、VS UIで公開されたブランチを最終的に確認できます。
プテルドボラート2015

3
git push -u origin <branch>はgit push -u origin HEADと同じですか(プッシュするブランチがチェックアウトされていると想定していますか?)
gymbrall

13
-uブランチをリモートにプッシュするたびにオプションが必要ですか、それとも初めてのみ必要ですか?
ステファン

17
@Stephane -u追跡を開始するために必要なのは1回だけです。その後はただ使用するgit push
Todd

491

リポジトリを他の人と共有していない場合、これはすべてのブランチをリモートにプッシュ--set-upstream正しく追跡するのに役立ちます。

git push --all -u

(正確にはOPが求めていたものではありませんが、このワンライナーはかなり人気があります)

リポジトリを他の人と共有している場合、危険な実験用ブランチがすべてレポに詰まるので、これは本当に良い形式ではありません。


14
そしてgit pull --allそれは他の場所ですべて引き戻しますか?kewl
commonpike

1
このコマンドは、何もプッシュする必要なく、正しいブランチへの追跡を設定します。ありがとうございました。
amey91 2015年

45
Gitはブランチをコミットすることを許可し、非常に正当な理由でブランチをプッシュしません。git push --allのみを使用することは、gitアーキテクチャの一部を削除するようなものです。それがあなたのために働くなら、それは完全に大丈夫です、素晴らしいです、それを永遠にしてください。ただし、gitをすばやく実行できるという理由だけでgitの学習を避けることを他の人に勧めないでください。
フェデリコラッツォーリ2016

4
これは実際には正しい答えではなく、それが何をして何が意味するのかについての実際の説明なしに推奨するのに適したツールではありません。この回答の削除を検討してください。
akronymn 2017年

3
@Federico @akronymn行うことの危険性はどこにありgit push --all -uますか?
user1823664 2017

155

が導入される前はgit push -ugit push必要なものを入手するオプションはありませんでした。新しい構成ステートメントを追加する必要がありました。

次を使用して新しいブランチを作成する場合:

$ git checkout -b branchB
$ git push origin branchB:branchB

このgit configコマンドを使用すると、.git/configファイルを直接編集する必要がなくなります。

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

または、.git/configファイルを手動で編集して、このブランチへの追跡情報を含めることもできます。

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB

4
時々これが必要git push origin -u local_branch:remote_branch
ブルース・リー

127

簡単に言うと、新しいローカルブランチを作成するには、次のようにします。

git branch <branch-name>

それをリモートリポジトリにプッシュするには、次のようにします。

git push -u origin <branch-name>

17
git branch <branch-name>そしてgit checkout -b <branch-name>両方の新しいブランチへの分岐が、チェックアウトスイッチを作成
ロバート・

1
ブラケットは、作成してプッシュしたいブランチ名に置き換える必要があることだけを述べています。
piyushmandovra

それはリモートに存在しないブランチであり、拒否しますsrc branch-name does not match any
Adi Prasetyo

96

すでにここで示したソリューションのわずかなバリエーション:

  1. 他の(リモートまたはローカル)ブランチに基づいてローカルブランチを作成します。

    git checkout -b branchname
    
  2. ローカルブランチをリモートリポジトリにプッシュ(公開)しますが、追跡可能にするgit pullgit pushすぐに機能します

    git push -u origin HEAD
    

    を使用するHEADと、「現在のブランチをリモートの同じ名前にプッシュする便利な方法」になります。ソース:https : //git-scm.com/docs/git-push Git用語では、HEAD(大文字)は現在のブランチ(ツリー)のトップへの参照です。

    -uオプションは、のためにわずかです--set-upstream。これにより、現在のブランチの上流追跡参照が追加されます。これを確認するには、.git / configファイルを調べます。

    ここに画像の説明を入力してください


2
ありがとうございます:) git push -u origin <branch-name>私にとってはうまくいきませんでしたが、完璧に機能HEADするので<branch-name>はなく使用しました:)
Daniel Tonon 2016年

57

私は単にします

git push -u origin localBranch:remoteBranchToBeCreated

既にクローンされたプロジェクトの上。

Gitは、でremoteBranchToBeCreated行ったコミットの下に名前が付けられた新しいブランチを作成しlocalBranchます。

編集:これにより、現在のローカルブランチ(名前が付けられている可能性がありますlocalBranch)の上流がに変更されますorigin/remoteBranchToBeCreated。これを修正するには、次のように入力します。

git branch --set-upstream-to=origin/localBranch

そのため、現在のローカルブランチは追跡しorigin/localBranchます。


1
これがまさに私が積極的に探していたものです
eli

error: src refspec <new branch> does not match any.これを試すとgitがスローされます。
codeforester

1
これが一番の答えになるはずです。
Aditya Abhas

30

私はあなたがすでに次のようなプロジェクトをクローンしていると思います:

git clone http://github.com/myproject.git
  1. 次に、ローカルコピーに新しいブランチを作成してチェックアウトします。

    git checkout -b <newbranch>
    
  2. サーバーで「git bare --init」を作成し、myapp.gitを作成したとすると、次のことを行う必要があります。

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. その後、ユーザーは

    git clone http://example.com/var/git/myapp.git
    

注:サーバーが稼働していることを前提としています。そうでない場合、機能しません。良いハウツーはここにあります

追加された

リモートブランチを追加します。

git push origin master:new_feature_name

すべてが正常かどうかを確認します(起点を取得し、リモートブランチをリストします)。

git fetch origin
git branch -r

ローカルブランチを作成し、リモートブランチを追跡します。

git checkout -tb new_feature_name origin/new_feature_name

すべてを更新します。

git pull

1
私がリンクしたウィリアムのスクリプトは、リモートブランチといくつかのセーフガードを削除する追加オプションでほぼ同じです
Tobias Kienzler

1
>ローカルブランチをリモートリポジトリ(公開)にプッシュしますが、それを追跡可能にして、git pullとgit pushがすぐに機能するようにします。コードをリポジトリにプッシュしたときにgithubが自動的に行うこと:-)
VP。

1
これは質問には応答しません。元のリポジトリの<newbranch>は追跡できません(<master>は手順3でクローンを作成した新しいリポジトリであるため、名前が変更されます)。
Lohrun

1
やり過ぎのようです。ないgit remote add originローカルブランチの追跡可能を作りますか?これが重要なコマンドですか?
Roni Yaniv

3
@Roni Yaniv:git remote add origin新しいリモートリポジトリを登録するだけではありません。これは、ブランチをそのリモートリポジトリにプッシュする前に必要なステップです(毎回完全なアドレスを入力したくない場合)
Lohrun

23

古いものを編集し、使用するだけgit push -u origin $BRANCHNAME


ウィリアムの雑多なGitツール儀礼的なレポクローンgit publish-branchからの使用。

OK、Rubyはありません-安全策を無視してください!-スクリプトの最後の3行を取得して、bashスクリプトを作成しますgit-publish-branch

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

次に、を実行しますgit-publish-branch REMOTENAME BRANCHNAME。REMOTENAMEは通常originです(スクリプトを変更してoriginをデフォルトにするなどもできます)。


1
これは、rubyがインストールされていることを前提としています。そのような運はありません。他のアイデアは?
Roni Yaniv

2
Rubyスクリプトの呼び出しgit pushgit configコマンド。スクリプトのコードを使用して自分の回答を編集しました。この情報を使用して、簡単な処理を行う小さなシェルスクリプトを作成することができます。
Lohrun

1
ウィリアムの雑多なgitツールは移動しているようです(そのリンクは現在無効です)。有効な
マイクD

1
「ウィリアム」のリンクが再び壊れました。新しいリンクはgit-wt-commit.rubyforge.orgの
ScottJ

22

既存のブランチから分岐して新しいブランチを作成するには

git checkout -b <new_branch>

次に、この新しいブランチを使用してリポジトリにプッシュします

git push -u origin <new_branch>

これにより、すべてのローカルコミットが作成され、新しく作成されたリモートブランチにプッシュされます。 origin/<new_branch>


12

1.7より前のGitLabバージョンの場合は、次を使用します。

git checkout -b name_branch

(name_branch、例:master

それをリモートリポジトリにプッシュするには、次のようにします。

git push -u origin name_new_branch

(name_new_branch、例えば:feature


9

新しいブランチを作成するたびに、それに応じてリモートブランチをプッシュおよび追跡するように、エイリアスを作成しました。次のチャンクを.bash_profileファイルに入れました:

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

使用法gcb thuy/do-sth-koolwith thuy/do-sth-koolと入力するだけで新しいブランチ名になります。


4

ここでの回答に少し基づいて、このプロセスを単純なBashスクリプトとしてまとめました。もちろん、Gitエイリアスとしても使用できます。

私にとって重要な追加機能は、コミットする前に単体テストを実行するように促し、デフォルトで現在のブランチ名を渡すことです。

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH

2

あなたは2スティープでそれを行うことができます:

1.を使用しcheckoutてローカルブランチを作成します。

git checkout -b yourBranchName

必要に応じてブランチを操作します。

2.pushコマンドを使用してブランチを自動作成し、コードをリモートリポジトリに送信します。

git push -u origin yourBanchName

これには複数の方法がありますが、この方法は本当に簡単だと思います。


0

最大の柔軟性を得るには、カスタムGitコマンドを使用できます。たとえば、次のPythonスクリプトを$PATH名前のどこかに作成し、git-publish実行可能にします。

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

次に、git publish -h使用情報を表示します。

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.