864

masterリモートブランチを追跡するブランチがありますorigin/master

master-oldローカルとリモートの両方で名前を変更したいと思います。これは可能ですか?

追跡した(そして常にローカルブランチをorigin/master更新した)他のユーザーの場合、リモートブランチの名前を変更した後はどうなりますか? 彼らはまだ機能しますか、それとももう見つけることができなかったエラーをスローしますか?mastergit pull
git pullorigin/master

次に、新しいmasterブランチ(ローカルとリモートの両方)を作成します。繰り返しますが、私がこれを行った後、他のユーザーがこれを行うとどうなりますgit pullか?

これはすべて、多くの問題を引き起こすと思います。私が欲しいものを手に入れるためのきれいな方法はありますか?それとも、そのままmasterにして新しいブランチを作成し、master-newそこでさらに作業する必要がありますか?

4

16 に答える 16

640

名前の変更に最も近いのは、リモートで削除してから再作成することです。例えば:

git branch -m master master-old
git push remote :master         # Delete master
git push remote master-old      # Create master-old on remote

git checkout -b master some-ref # Create a new local master
git push remote master          # Create master on remote

ただし、これには多くの注意点があります。まず、既存のチェックアウトは名前変更について知りませ-Gitはブランチの名前変更を追跡しようとしません。新しいmasterものがまだ存在しない場合、gitpullはエラーになります。新しいmasterものが作成されている場合。プルはマージを試みmasterますmaster-old。したがって、以前にリポジトリをチェックアウトしたことのあるすべての人の協力がない限り、一般的には悪い考えです。

注:新しいバージョンのGitでは、デフォルトでマスターブランチをリモートで削除することはできません。これをオーバーライドするには、receive.denyDeleteCurrent構成値をリモートリポジトリwarnまたはリモートignoreリポジトリに設定します。それ以外の場合、新しいマスターをすぐに作成する準備ができている場合は、ステップをスキップして、ステップに進みます。リモートの構成を変更できない場合、マスターブランチを完全に削除することはできないことに注意してください。git push remote :master--forcegit push remote master

この警告は、現在のブランチ(通常はmasterブランチ)にのみ適用されます。その他のブランチは、上記のように削除して再作成できます。

于 2009-10-06T17:35:11.310 に答える
266

あなたが現在いると仮定してmaster

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. まず、ローカルリポジトリのコミットに基づいてmaster-old、リポジトリにブランチを作成します。originmaster
  2. この新しいブランチの新しいローカルブランチを作成しますorigin/master-old(これは、トラッキングブランチとして自動的に適切に設定されます)。
  3. 次に、ローカルmasterをポイントするコミットを指定します。
  4. 最後に、新しいローカルを反映するようmasterにリポジトリを強制的に変更します。originmaster

(他の方法でそれを行う場合は、それがmaster-old追跡するように適切に設定されていることを確認するために、少なくとももう1つのステップが必要origin/master-oldです。この記事の執筆時点で投稿された他のソリューションにはそれが含まれていません。)

于 2010-09-24T20:21:12.997 に答える
175

Git v1.7では、これが少し変わったと思います。ローカルブランチのトラッキング参照を新しいリモートに更新するのは非常に簡単です。

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
于 2013-04-25T17:22:13.200 に答える
38
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

new-branch-name削除する前に手動で切り替える必要がある場合がありますold-branch-name

于 2012-02-10T02:29:52.777 に答える
35

ブランチの名前を変更する方法はたくさんありますが、より大きな問題に焦点を当てます。「クライアントが早送りし、ローカルでブランチをいじる必要がないようにする方法」

最初の簡単な写真: マスターブランチの名前を変更し、クライアントが早送りできるようにする

これは実際には簡単なことです。しかし、それを乱用しないでください。アイデア全体は、マージコミットに依存します。早送りが可能で、ブランチの履歴を別のブランチにリンクできるためです。

ブランチの名前を変更します。

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

新しい「マスター」ブランチの作成:

# create master from new starting point
git branch master <new-master-start-point>

親子履歴を持つマージコミットを作成します。

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

と出来上がり。

git push origin master

これが機能するのは、mergeコミットを作成すると、ブランチを新しいリビジョンに早送りできるためです。

賢明なマージコミットメッセージの使用:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old
于 2014-03-18T00:48:00.943 に答える
12

前の質問と同じ状況についてまだ質問していると思います。つまり、master-newの履歴にはmaster-oldは含まれません。* master-newを「master」と呼ぶと、事実上、履歴が書き換えられます。マスターがマスターの前の位置の子孫ではない状態にどのように入るかは問題ではありません。単にその状態にあるということです。

マスターが存在しないときにプルしようとする他のユーザーは、プルが失敗するだけで(リモートにそのような参照はありません)、新しい場所に再び存在すると、プルはマスターを新しいリモートマスターとマージしようとする必要があります。リポジトリでmaster-oldとmaster-newをマージしたかのように。ここで何をしようとしているのかを考えると、マージには競合が発生します。(それらが解決され、結果がリポジトリにプッシュバックされた場合、さらに悪い状態になります-両方のバージョンの履歴があります。)

あなたの質問に簡単に答えるために:あなたは時々あなたの歴史に間違いがあることを受け入れるべきです。これは大丈夫です。それは誰にでも起こります。git.gitリポジトリに元に戻されたコミットがあります。重要なのは、歴史を公開すれば、誰もが信頼できるものになるということです。

*もしそうなら、これはいくつかの変更をマスターにプッシュしてから、以前の場所に新しいブランチを作成することと同じです。問題ない。

于 2009-10-06T17:12:33.690 に答える
10

試してみたところ、選択した回答は失敗しました。エラーがスローされます:refusing to delete the current branch: refs/heads/master。私は私のために働くものを投稿すると思います:

git checkout master             # If not in master already

git branch placeholder          # Create placeholder branch
git checkout placeholder        # Check out to placeholder
git push remote placeholder     # Push placeholder to remote repository

git branch -d master            # Remove master in local repository
git push remote :master         # Remove master from remote repository.

秘訣は、プレースホルダーをリモートリポジトリにプッシュする直前にチェックアウトすることです。残りは自明です。マスターブランチを削除してリモートリポジトリにプッシュすると、正常に機能するはずです。ここから抜粋。

于 2011-12-25T12:28:27.980 に答える
2

サーバーにログインし、Gitディレクトリに移動して、ベアリポジトリのブランチの名前を変更します。

これには、同じブランチの再アップロードに関連するすべての問題があるわけではありません。実際、「クライアント」は変更された名前を自動的に認識し、リモート参照を変更します。

その後(または前に)、ブランチのローカル名を変更することもできます。

于 2010-12-24T04:50:28.527 に答える
1

どうですか:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name
于 2010-08-17T08:21:10.470 に答える
1

OK 、ローカルリモートの両方でブランチの名前を変更するのはとても簡単です!...

ブランチにいる場合は、簡単に次のことができます。

git branch -m <branch>

または、そうでない場合は、次のことを行う必要があります。

git branch -m <your_old_branch> <your_new_branch>

次に、次のように削除をリモートにプッシュします。

git push origin <your_old_branch>

これで完了です。

プッシュしようとしたときにアップストリームエラーが発生した場合は、次のようにしてください。

git push --set-upstream origin <your_new_branch>

また、実際のコマンドラインで手順を示すために、以下の画像を作成しました。手順に従うだけで、次のようになります。

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

于 2017-07-03T13:24:30.057 に答える
1

これは私が知っている最も単純で最も「読みやすい」方法です。

-mを使用してローカルブランチを「移動」します

git branch -m my_old_branch_name my_new_branch_name

'moved'ブランチをリモートにプッシュし、-uを使用して'upstream'を設定します

git push origin -u my_new_branch_name

「アップストリーム」を設定すると、基本的に「ローカルブランチがリモートに接続されます」。これにより、フェッチ、プル、プッシュなどが機能します。

リモートから古いブランチを削除します

git push origin -D <old_name>

最初のステップでローカルブランチを「移動」したため、ローカルブランチはすでになくなっています。

于 2017-12-08T01:15:25.103 に答える
0

次の操作を行うことができます。

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

ただし、他の人がこのリポジトリを共有している場合は、強制的にプッシュすることはお勧めできません。強制的にプッシュすると、改訂履歴が新しいものと競合します。

于 2017-08-16T14:04:45.877 に答える
0

以下をシェルスクリプトに保存して、ジョブを実行できます。

例えば:

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName # Delete old branch on remote
git push --set-upstream $remote $newBranchName # Add new branch name on remote and track it

ここでは、デフォルトのリモート名「origin」がハードコーディングされていることに注意してください。スクリプトを拡張して構成可能にすることができます。

次に、このスクリプトは、Bashエイリアス、Gitエイリアス、またはたとえばSourcetreeカスタムアクションで使用できます。

于 2018-04-08T17:51:48.123 に答える
0

github.comまたはどこにいても、[ブランチ]をクリックして、名前を変更します。次に、これらをローカルで実行します。

git branch -m <old-branch-name> <new-branch-name>
git fetch origin
git branch -u origin/<new-branch-name> <new-branch-name>
于 2021-04-09T17:44:10.167 に答える
-1

重要なのは、 toとtoの2つの名前変更を実行していることを認識することだと思います。mastermaster-oldmaster-newmaster

他のすべての答えから、私はこれを統合しました:

doublerename master-new master master-old

doublerenameここで、最初にBash関数を定義する必要があります。

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

これは、ブランチの内容がまったく異なるという点で履歴の変更git rebaseに似ていますが、クライアントが。を使用して安全に早送りできるという点で異なりますgit pull master

于 2016-07-28T15:35:05.067 に答える
-5
git update-ref newref oldref
git update-ref -d oldref newref
于 2010-08-10T12:14:27.777 に答える