Gitでリモートでブランチの名前を変更する


407

私がgit://アクセスするだけのリポジトリがある場合(通常はプッシュ+プルするだけです)、ローカルで行うのと同じ方法でそのリポジトリのブランチの名前を変更する方法はありますgit branch -mか?


48
リンクされた「重複」の質問では、ブランチの名前を「ローカルとリモートの両方」に変更するよう求められます。ただし、この質問は、ブランチの名前をリモートで変更する方法を尋ねるだけなので、簡略化できます。これは、チェックアウトしたり、ローカルブランチを作成したりすることなく、サーバー上のブランチの名前を変更するために行うことですgit push origin origin/old_name:refs/heads/new_name && git push origin :old_name
sschuberth 2013年

1
@sschuberth:一度に両方のコマンドを実行できます。そして、これが本当にこの質問に対する答えになるはずです。
Joachim Breitner

2
@JoachimBreitnerそうですね、このスクリプトで既に最適化を行いました。
sschuberth 2013

1
@sschuberth、私は以下の他のコメントよりも気に入っているので、回答としてコメントを投稿してください。
ファットマン、2014年

回答:


480

必要な名前で新しいローカルブランチを作成し、それをリモートにプッシュして、古いリモートブランチを削除するだけです。

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

次に、古いブランチ名を表示するには、リポジトリの各クライアントが次のようにする必要があります。

$ git fetch origin
$ git remote prune origin

注:古いブランチがメインブランチである場合は、メインブランチの設定を変更する必要があります。そうしないと、を実行すると $ git push origin :old-branch-name「現在のブランチの削除が禁止されていますというエラーが発生します。


8
まあ、新旧の名前が同じであれば、ブランチの名前を変更する必要がないことを意味するので、最初にコマンドを実行しても意味がありません;-)
Sylvain Defresne

9
承知しました。これを自動化された方法で(他のスクリプトの関数の一部として)呼び出している場合、それを回避できれば、間違った動作をしないようにすることもできます。
謎のダン

9
ダンの方法:コマンドが常に機能するようにコマンドを並べ替えます。Earth Engineの方法:必ず確認してください。そうしないと、データが失われます。どれを選ぶか知っています。
Doradus

2
ユーザーは:を実行するだけですgit fetch origin --prune(新しいブランチを効果的にフェッチし、リモートから参照を削除するため)。
DolphinDream

2
新しいバージョンのgit で、-dまたは--delete代わりに使用できます:
Zitrax

285

ローカルブランチの名前を同時に変更せずに、リモートでブランチの名前を変更したいだけの場合は、次の1つのコマンドで実行できます。

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

私はこのスクリプト(git-rename-remote-branch)を作成しました。これは、上記を簡単に行うための便利なショートカットを提供します。

bash関数として:

git-rename-remote-branch(){
  if [ $# -ne 3 ]; then
    echo "Rationale : Rename a branch on the server without checking it out."
    echo "Usage     : $(basename $0) <remote> <old name> <new name>"
    echo "Example   : $(basename $0) origin master release"
    exit 1 
  fi

  git push $1 $1/$2:refs/heads/$3 :$2
}

@ksrbのコメントを統合するには:これは基本的に、1つのコマンドで2つのプッシュを実行します。最初git push <remote> <remote>/<old_name>:refs/heads/<new_name>に古いリモートトラッキングブランチに基づいて新しいリモートブランチをプッシュし、次にgit push <remote> :<old_name>古いリモートブランチを削除します。


10
そのコマンドのエイリアスが必要な場合:rename = "!f(){git push origin origin / $ 1:refs / heads / $ 2:$ 1;}; f"これは、> git rename <old_name> <として使用できます。 new_name>
ジョナサンシュミット14

33
このコマンドは、実際には、本質的に2つのプッシュだ何を意味するのかについて興味がそれらのためのgit push <remote>/<old_name>:refs/heads/<new_name>手段は、SRCとして古いリモートを使用して新しいリモートプッシュし、その後 git push [space]:<old_name>の手段は、古いリモートを削除
ksrb

3
なぜ使用する必要があるのrefs/heads/nameですか?name最初のコマンドを作成して直接使用することはできませんgit push <remote> <remote>/<old_name>:<new_name>か?
Drew Noakes

6
いいえ、リモートブランチ<new_name>はまだ存在しないためです。ブランチが存在しない場合、Gitは<new_name>タグ名を参照する可能性があるため、フルネームを使用するように要求します。
sschuberth 16

3
ビルドシステムではこのアプローチを使用しています。私たちが遭遇する唯一の警告は、refs/heads/<new_name> すでに存在する場合です。削除は引き続き成功し、削除<remote>/<old_name>のみが行われます。事前に確認すると、これを簡単に回避できます。
Apeiron

172

名前を変更するブランチへの最初のチェックアウト:

git branch -m old_branch new_branch
git push -u origin new_branch

から古いブランチを削除するにはremote

git push origin :old_branch

12
名前を変更したブランチ(new_branch)をリモート(origin)にプッシュする場合は、その上流を新しい名前(例git push -u origin new_branch:)で追跡するように設定する必要があります。そうしないと、名前を変更したブランチ(new_branch)がorigin / old_branchを追跡し続けます。また、リモートold_branchを削除しても、new_branchは引き続きorigin / old_branchを追跡しますが、ブランチはなくなっています。
DolphinDream

@DolphinDream私はあなたの有用な上流の変更を含めるために答えを編集しました。
mVChr 2016

10

承知しました。ローカルでブランチの名前を変更し、新しいブランチをプッシュし、古いブランチを削除するだけです。

唯一の本当の問題は、リポジトリの他のユーザーがローカルトラッキングブランチの名前を変更できないことです。


1
だからマスターを削除しようとしたとき、私は$ git clone ../src $ cd src $ git branch notmaster $ git checkout notmaster $ git branch -d master $ git push ../src:masterしかし、それは不平を言う:宛先refspecはリモートの既存の参照と一致せず、refs /で始まっていません。また、ソース参照に基づいてプレフィックスを推測することはできません。エラー:一部の参照を '../alpha/'にプッシュできませんでしたリモートには、実際にmasterというブランチがあります
kdt

2

TL; DR

リモートブランチの「名前の変更」は、実際には2ステップのプロセスです(必ずしも順序付けはされていません)。

  • 古いリモートブランチの削除(git push [space]:<old_name>としてksrbについて説明)。
  • 新しいリモートブランチにプッシュします(以下のいくつかの回答コマンドの違い)。

削除しています

私はTortoiseGitを使用していて、最初にコマンドラインからブランチを削除しようとしたときに、次のようになりました。

$ git push origin :in
  • 致命的: 'origin'はgitリポジトリではないようです

  • 致命的:リモートリポジトリから読み取れませんでした。

正しいアクセス権があり、リポジトリが存在することを確認してください。

これは、ページェントプライベートキーがロードされていないことが原因である可能性がありますTortoiseGitページェントに自動的にロードします)。さらに、TortoiseGitコマンドにはorigin参照が含まれていないことに気づきました(例:)git.exe push --progress "my_project" interesting_local:interesting

私はBitbucketも使用しています。他の種類のWebベースのオンラインgitマネージャー(GitHub、GitLab)として、リモートブランチをインターフェース(ブランチページ)から直接削除することができました。

ブランチBitbucketを削除

ただし、TortoiseGitでは、参照の参照を通じてリモートブランチを削除することもできます。

参照の参照メニュー

リモートブランチ(リモートリスト)を右クリックすると、[リモートブランチ削除]オプションが表示されます。

TortoiseGitリモートブランチ削除

押す

古いリモートブランチを削除した後、PushウィンドウのRemote:フィールドに新しい名前を入力するだけでTortoiseGitを介して新しいリモートブランチに直接プッシュしました。このブランチは自動的に作成され、Bitbucketに表示されました。

ただし、それでも手動で実行したい場合、このスレッドでまだ言及されていない点は、-u= --set-upstreamです。

git pushドキュメント-uのちょうどエイリアスである--set-upstreamのでの回答のコマンドのSylvain( -set-upstream new-branchShashankは(-u origin new_branchリモートREFのため、等価なデフォルトorigin他の参考文献は、以前に定義されていない場合。

  • git push origin -u new_branch= ドキュメントの説明git push -u new_branch から:

    構成が欠落している場合、デフォルトでになりoriginます。

結局、ここで他の回答によって提案されたコマンドを手動で入力したり使用したりしなかったので、おそらくこれは同じような状況の他の人にとって役立つかもしれません。


問題は、リモコンが呼び出されないことoriginです。コマンドを実行して得られるように、リモコンに名前を付ける必要がありますgit remote。Git sshは、公開鍵と秘密鍵を使用していることを意味するものと連携します。私がいることを前提とAutoload Putty keysTortoiseGitのは自分のリモート参照を使用して、すべてで何かをするあなたのために必要なキーを自動ロードされます。最後にgit push -u、これはリモートブランチにプッシュするためのエイリアスではなく、ローカルに作成されたリモートブランチにプッシュするためのエイリアスであり、そのリモート参照にはまだこのブランチがありません
juanecabellob 2018年

1
@juancabはの-uエイリアスで--set-upstreamあり、「設定が欠落している場合originデフォルトで "になります。SylvainShashankはこれを使用して、新しく作成されたリモートブランチにプッシュします。キー問題はする予定だったかもしれページェント私が試したときに、それがロードされて持っていないgit push origin :inシェル上で。だから私はあなたの反対票を理解していません、私は他の回答で私のものと扱われていない詳細を指摘し、それらを説明して解決しました。
CPHPython 2018年

あなたは間違ったことを述べています、そしてこの答えの多くは質問自体とは無関係です。何が効果的であるかを指摘している場合は、それが何が効果的であるかということに答えを限定することをお勧めします。本当に説明したい場合は、よりよく自己紹介してください。Btw:はの-uエイリアスです--set-upstreamが、あなたが言ったようにリモートブランチにプッシュするためのエイリアスではありません。一意に必要なリモートブランチにプッシュするには、git push <remote>それがまだリモートにない場合は、を追加しgit push -u <remote>ます。したがって、-uリモートでブランチの参照を作成するために使用されます。
juanecabellob

1
@juancabおそらくあなたが間違っていると思ったのは、ほとんどがエイリアスの言い回しや単語の選択でした。リモートブランチの名前変更するために見つけたソリューションの完全な説明を提供するために、回答を再構成し、言い換えました。
CPHPython

私はそれをさらに言い換えます。今ではもっと理にかなっていますが、それでもまだ長すぎます。私はこの問題をより具体的に説明します。つまり、TortoiseGitユーザーの場合、提案されたソリューションは機能しないと述べます。あなたはストーリーを語っていますが、それは混乱を招き、ユーザーが読むのを避けます。あなたの答えを命題で編集します。
juanecabellob

1

理由はわかりませんが、@ Sylvain Defresneの回答ではうまくいきません。

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

アップストリームの設定を解除する必要があるので、ストリームを再度設定できます。以下は私がそれをした方法です。

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

0

これが正しいか間違っているかはわかりませんが、ブランチの「古い名前」をブランチの「新しい名前」にプッシュし、次の2行で古いブランチを完全に削除しました。

git push origin old_branch:new_branch
git push origin :old_branch

私の知る限り、これはまさに他のすべての答えがすることです。あなたの答えはもっと簡潔です。
2018年

-1

古い名前のブランチに基づいて新しいブランチを作成できます。このようにして、古いブランチを削除してください!!!ここに画像の説明を入力してください


それはGitではなくGitHubです。;)
Bouncner

-4

すでに与えられた答えに加えて、これは最初に新しいブランチがすでに存在するかどうかをチェックするバージョンです(そのため、スクリプトで安全に使用できます)。

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(チェックはこの答えからです)


git show-ref --quiet --verify -- refs/heads/$new_name代わりに使用したでしょうls-remote | cut | sed | grep
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.