ローカルブランチをリモートブランチで上書きする


153

私は地元の支部を完全に無効にしました。最初からやり直したいと思います。サーバー上のバージョンは正しいです。

やり直したくありません。ローカルの履歴を使用して、私の大きなねじれを修正したいと思います。(必要に応じてできます。)

git fetch branchname、動作しgit pull branchnameません。表示されるメッセージは「最新」ですが、ローカルバージョンがサーバーのバージョンと一致しません。

git pull origin/branchname見つかりません」というエラーが表示されます。


回答:


248

まず、現在の位置に新しいブランチを作成します(古い「ねじ上げ」履歴が必要な場合に備えます):

git branch fubar-pin

リモートブランチのリストを更新し、新しいコミットを同期します:

git fetch --all

次に、ブランチをorigin / branchが指すポイントにリセットします。

git reset --hard origin/branch

注意してください。これにより、作業ツリーから変更が削除されます。


2
+1しますがgit fetch origin、リセット前にリマインダーを追加したい場合があります
Mark Longair

私はこれを1つのわずかな変更で行いましたが、機能しませんでした:git fetch --all、git reset --hard SHA1OFANOLDCOMMIT、(他のいくつかのもの)、git reset --hard origin / branch。その結果、私はまだ古いコミットをしていました。したがって、このアプローチはいくつかのケースで機能するかもしれませんが、それはすべてでは機能しないと思います。
12

@greggles:エラーはありますか?最後のコマンドの後、HEADはorigin / branchを指す必要があります。
knittl 2012年

1
@Gavin:いいえ、これはいかなる状況でも以外のブランチに影響を与えませんorigin/branch。決して。
knittl 2013年

1
@greggles私はこれが非常に遅いことを知っていますが、なぜそれが起こるのか疑問に思っている他の人々にとって、このアプローチはブランチをチェックアウトしている場合にのみ機能します。それはあなたがしていたので、あなたのために動作しませんでしたデタッチHEAD状態 HEADはブランチを指している場合(でHEADポイントがないブランチ、コミット)、およびこれらのコマンドだけの仕事。git resetHEADがブランチを指しているときに行うと、そのブランチが後に続きます。
Michael Dorst、

60

ローカルブランチをめちゃくちゃにしたときに行うことは、壊れたブランチの名前を変更し、上流のブランチをもう一度チェックアウト/ブランチすることです。

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

次に、古いブランチから何も必要ないことが確かな場合は、それを削除します。

git branch -D branch-old

しかし、通常、何かがあった場合に備えて、古いブランチをローカルに残します。


4
これが最良の答えのようです。万が一に備えてバックアップコピーを作成するのに役立ち、ローカルブランチがリモートブランチの正確なコピーになる可能性が非常に高いようです。
12

すばらしい回答です。ワンQ:公式gitのチェックアウトドキュメントはあなたの第三コマンドがなければならないことを言っているようだgit checkout -b <branch> --track <remote>/<branch>んのあなたはせずに、同じようにうまくいきますか--track
スターマン

1
config var branch.autoSetupMerge(デフォルトではtrueになっていると思います)が--track暗黙的なものになると思います。そして、はい、すべてのgitセットアップで、を行う--trackときに明示的に指定する必要はありませんがcheckout -b、YMMVです。
Casey Marshall

5

ローカルブランチには、破棄したい変更が含まれている可能性があります。これを行うには、を使用git resetして、ブランチヘッドを上流のレポのブランチから分岐した最後のスポットにリセットする必要があります。を使用git branch -vして上流ブランチのsha1 idを見つけ、を使用してブランチをリセットしますgit reset SHA1ID。次にgit checkout、ディレクトリに残した変更を破棄することができるはずです。

注:これは常にバックアップされたリポジトリで実行してください。そうすることで、自分が自分自身で正しく機能していることを保証できます。または、そうでない場合は、元に戻すためのバックアップがあります。


これはおそらくうまくいくと思われますが、「どこかで作業のコピーを作成し、リモートブランチの新しいコピーを作成する」というアプローチの単純さと信頼性を考えると、これがどのように優れているかはわかりません。
12

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.