ローカルリポジトリブランチをリモートリポジトリHEADと同じようにリセットします


3857

ローカルブランチをリモートリポジトリのブランチと同じようにリセットするにはどうすればよいですか?

やった:

git reset --hard HEAD

しかし、私が実行するとgit status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
      modified:   java/com/mycompany/TestContacts.java
      modified:   java/com/mycompany/TestParser.java

これらを「変更」した理由を教えてください。私はこれらのファイルに触れていませんか?削除した場合、それらを削除します。


8
git statusあなたの2番目のコマンドの出力によるとgit reset --hard HEAD失敗しました。ただし、出力は貼り付けていません。→不完全な質問。
Robert Siemer

2
あなたはここに二つの問題を混合している:1)遠隔がある点と、2へのローカルブランチをリセットする方法)ステージング領域(およびおそらく作業ディレクトリをクリアする方法を)ので、それはgit status言いますnothing to commit, working directory clean。- ご指定ください!
Robert Siemer

回答:


6698

リモートブランチと完全に一致するようにブランチを設定するには、次の2つの手順を実行します。

git fetch origin
git reset --hard origin/master

これを行う前に(念のため)現在のブランチの状態を保存したい場合は、次のようにすることができます:

git commit -a -m "Saving my work, just in case"
git branch my-saved-work

これで、作業を戻したい場合(または後で確認するか、更新したブランチと比較したい場合)に備えて、作業がブランチ「my-saved-work」に保存されます。

最初の例では、リモートリポジトリの名前が「origin」であり、リモートリポジトリの「master」という名前のブランチがローカルリポジトリの現在チェックアウトされているブランチと一致することを前提としています。

ところで、あなたがいるこの状況は、非ベアリポジトリの現在チェックアウトされているブランチにプッシュが行われた一般的なケースと非常に似ています。最近、ローカルリポジトリにプッシュしましたか?そうでない場合は、心配する必要はありません。何か他の原因により、これらのファイルが予期せず変更された可能性があります。それ以外の場合は、非ベアリポジトリに(特に、現在チェックアウトされているブランチにではなく)プッシュすることは推奨されないことに注意してください。


4
お返事ありがとうございます。最初の例では、リモートリポジトリの名前が「origin」であり、リモートリポジトリの「master」という名前のブランチがローカルリポジトリのブランチと一致することを前提としていることに注意してください。」「git reset --hard」を実行する前に、リモートリポジトリの名前とブランチ名を確認する方法を教えてください。再度、感謝します。
hap497 2009年

21
リモートに明示的に名前を付けなかった場合、その名前はおそらく「原点」(デフォルト)です。「git remote」を使用して、すべてのリモート名のリストを取得できます。次に、「git remote <name>」を使用して、どのブランチが相互にプッシュ/プルするかを確認できます(たとえば、「master」ブランチが「master」から「origin」という名前のリモートに複製された場合、次の行が表示されますそれは「マスターがリモートマスターとマージする」と言っています)。
ダン成形

6
「特にベアリポジトリ以外のリポジトリにプッシュすることはお勧めしません(特に現在チェックアウトされているブランチにプッシュすることはお勧めしません。)なぜですか?
LeeGee

27
フェッチした直後に、git reset FETCH_HEAD --hard代わりにできると思います。それは同じ意味です。
Jean

6
追加したファイルは削除されませんでした。
Trismegistos

416

私はする必要がありました(受け入れられた答えの解決策):

git fetch origin
git reset --hard origin/master

に続く:

git clean -f

ローカルファイルを削除するには

(実際に削除せずに)削除されるファイルを確認するには:

git clean -n -f

89
また、git clean -d -f追跡されていないディレクトリが存在する場合。
garg

54
またgit clean -fdx
Swapnil Kotwal 2015

14
リモートブランチの正確なコピーが必要な場合は、git clean -ffdxを実行する必要があります。thareは2つのfであることに注意してください。
Trismegistos

6
これgit clean -fは私が必要とした必須の作品でした。ありがとう!
dgo

17
cleanコマンドの使用には注意してください。他のブランチから無視されたファイルを削除できます。
mikoop 2017年

307

最初に、HEAD対応する上流ブランチの以前にフェッチされたものにリセットします。

git reset --hard @{u}

指定@{u}またはその詳細形式の利点は@{upstream}、リモートリポジトリとブランチの名前を明示的に指定する必要がないことです。

次に、必要に応じて、追跡されていないファイルを削除します-x

git clean -df

最後に、必要に応じて、最新の変更を取得します。

git pull

54
これは、受け入れられたものよりも良い答えのように思えるので、それを現在の上流分岐に動的にリセットではなく、常に静的なもののようなorigin/master
ジョンzの

上のスポット@Jonz、@{upstream}非常に便利で、別名で使用することができますalias resetthisbranch="git reset --hard @{upstream}"
シッダールタ

1
@GangadharJannu git reset --hardはコミットが必要です。そうしないと、何にリセットするかがわかりません。@{u}特定のコミットを指します-最後にを実行したときからの追跡されたブランチのヘッドgit fetch
Kristoffer Bakkejord

1
@KristofferBakkejord説明ありがとうございます。コミットハッシュがなくてもgit reset --hardリモートブランチにリセットされませんが、実行できます
Gangadhar JANNU

3
ここで新しい質問を始めようとしている他の人は、Powershellからgitする場合は引用符(git reset --hard "@{u}")を使用してください。それを理解するのにしばらくかかりました。
MPStoering

112

git reset --hard HEAD実際には、最後にコミットされた状態にのみリセットされます。この場合、HEADはブランチのHEADを指します。

複数のコミットがある場合、これは機能しません。

おそらくあなたがしたいことは、オリジンのヘッドまたはリモートリポジトリが呼ばれるものにリセットされます。私はおそらく次のようなことをするでしょう

git reset --hard origin/HEAD

注意してください。ハードリセットは簡単には元に戻せません。Danの提案に従い、リセットする前に変更のコピーを分岐することをお勧めします。


2
ダンが先に見つけた私の答えに間違った提案がありました。誰も迷惑をかけたくないので、私はそれを編集しました。origin / masterまたはorigin / HEADについては、実際にフェッチを最初に実行するかどうかによって異なります。originのクローンを作成しただけで、他のブランチがなかった場合、これはよくあることですが、リセットすると問題ありません。しかし、もちろん、ダンは正しいです。
Mikael Ohlson、

73

上記のすべてが正しいことを示していますが、実際にプロジェクトをリセットするには、にあるファイルも削除する必要があります.gitignore

プロジェクトディレクトリ消去し、リモートから再クローンすることの道徳的同等物を取得するには、次のようにします

git fetch
git reset --hard
git clean -x -d -f

警告git clean -x -d -fは元に戻すことができず、ファイルやデータが失われる可能性があります(例:を使用して無視したもの.gitignore)。


12
警告:「git clean -x -d -f」は元に戻すことができず、.gitignoreのファイルやデータが失われる可能性があります
Akarsh Satija

もう少し短い:git clean -xdfそれはに等しいgit clean -x -d -f
Kiryl、

git clean -ffxd-リポジトリにないものをすべて削除します
Trismegistos

44

以下のコマンドを使用します。これらのコマンドは、追跡されていないすべてのファイルをローカルgitからも削除します

git fetch origin
git reset --hard origin/master
git clean -d -f

6
これがないと、git clean -d -fローカルディレクトリに古いブランチの一部が残っているため、これはより完全な応答です。ありがとう。
Flavio

3
これが実際にリモコンのようになることです。清潔は重要です。
デビッドS.

1
すべてを完全に削除するgit clean -ffxd
Trismegistos

1
これはまさに私が必要としたものです。ありがとう
AllJs

38

質問はここで2つの問題を混ぜ合わせます:

  1. リモートが存在するポイントにローカルブランチをリセットする方法
  2. それはので、あなたのステージングエリア(そしておそらく作業ディレクトリ)をクリアする方法をgit status述べていますnothing to commit, working directory clean.

ワンストップ答えは:

  1. git fetch --prune (オプション)リモートリポジトリのローカルスナップショットを更新します。その他のコマンドはローカルのみです。
    git reset --hard @{upstream}ローカルブランチポインターをリモートのスナップショットの場所に置き、インデックスと作業ディレクトリをそのコミットのファイルに設定します。
  2. git clean -d --force gitが「working directory clean」と言うのを妨げている追跡されていないファイルとディレクトリを削除します。

1
@{upstream}構文は、あなたの場合は、デフォルトで起こるセットとなるように、上流必要ですgit checkout <branchname>。–それ以外の場合はと交換しorigin/<branchname>ます。
Robert Siemer 2016年

に追加-xgit cleanて、コミットにないものすべてを削除します(つまり、.gitignoreメカニズムで無視されたファイルも)。
Robert Siemer 2016年

22

これは私が定期的に直面していることであり、私は任意のブランチで動作するように上記で提供されたWolfgangスクリプトを一般化しました

「よろしいですか」というプロンプトとフィードバック出力も追加しました

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] || 
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
  git branch "auto-save-$branchname-at-$timestamp" 
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname

3
「git remote」を使用してリモートの名前を取得することもできます。場合によっては、「発生元」にならないこともあります
Yurik

17

リモートリポジトリがoriginであり、興味がある場合branch_name

git fetch origin
git reset --hard origin/<branch_name>

また、origintoの現在のブランチをリセットしHEADます。

git fetch origin
git reset --hard origin/HEAD

使い方:

git fetch origin 何もマージまたはリベースしようとせずに、リモートから最新をダウンロードします。

次に、git reset<branch_name>ブランチをリセットして、フェッチしたものに戻します。この--hardオプションは、作業ツリー内のすべてのファイルをのファイルと一致するように変更しますorigin/branch_name


14

やった:

git branch -D master
git checkout master

ブランチを完全にリセットする


必要なブランチを削除できるようにするには、別のブランチにチェックアウトする必要があることに注意してください


5
もう一度質問を読んでください、リモートに影響を与えることには何もありませんが、リモートと同じに設定するので、リモートで何もするべきではありません。
user2846569

それをリモートと同じに設定したい場合は、少なくともある時点でフェッチを行う必要がありますね。
Tim

2
あなたは少なくともこれを試すか、ドキュメントを読むべきです:kernel.org/pub/software/scm/git/docs/git-checkout.html
user2846569

途中で、ブランチに破損した.pckファイルがあり、残りのオプションは機能しませんでした。ありがとうございます。
LuckyBrain

14

以下は、最も一般的な回答が示唆することを自動化するスクリプトです... ブランチをサポートする改善されたバージョンについては、https://stackoverflow.com/a/13308579/1497139を参照してください

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see /programming/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
  git branch "auto-save-at-$timestamp" 
fi
git fetch origin
git reset --hard origin/master

10

私のように問題があり、すでにいくつかの変更をコミットしているが、何らかの理由でそれを取り除きたい場合は、次のように使用するのが最も簡単な方法ですgit reset

git reset --hard HEAD~2

私には2つの不要なコミットがあったため、2になりました。これを独自のコミット数に変更してリセットできます。

だからあなたの質問に答えてください-もしあなたがリモートリポジトリHEADより5コミット先なら、あなたはこのコマンドを実行するべきです:

git reset --hard HEAD~5

行った変更は失われるので注意してください。


7

以前の回答では、リセットするブランチが現在のブランチ(チェックアウト済み)であると想定しています。コメントでは、OP hap497はブランチが実際にチェックアウトされていることを明確にしましたが、これは元の質問では明示的に要求されていません。少なくとも1つの「重複する」質問があるので、ブランチが完全にリポジトリ状態にリセットされます

ブランチ「mybranch」が現在チェックアウトされていない場合、リモートブランチ「myremote / mybranch」のヘッドにリセットするには、次の低レベルコマンドを使用できます。

git update-ref refs/heads/mybranch myremote/mybranch

このメソッドは、チェックアウトされたブランチをそのまま残し、作業ツリーには手を付けません。2番目の引数として与えられたものは何でも、単にmybranchの頭を別のコミットに移動します。これは、複数のブランチを新しいリモートヘッドに更新する必要がある場合に特に役立ちます。

ただし、これを行う場合は注意が必要であり、gitkまたは同様のツールを使用してソースと宛先を再確認してください。現在のブランチで誤ってこれを行った場合(そしてgitがこれを妨げない)、新しいブランチのコンテンツが変更されていない作業ツリーと一致しないため、混乱する可能性があります(修正するには、ブランチを再度更新し、それが以前あった場所に)。


7

これは私がよく使うものです:

git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;

あなたのローカルマスタへの変更は、/枝を開発しないこととしたことは良い習慣ですが、代わりにチェックアウト変更のための別のブランチに、変更の種類によって先頭に付加ブランチ名を持つ、例えばという注意feat/chore/fix/、などしたがって、あなただけに必要マスターから変更をプッシュするのではなく、変更をプルします。他のブランチが貢献している他のブランチについても同じことが言えます。したがって、上記の方法は、他の人がコミットしたブランチへの変更をたまたまコミットし、リセットする必要がある場合にのみ使用してください。それ以外の場合は、将来、他の人がプッシュするブランチにプッシュするのを避け、代わりにチェックアウトして、チェックアウトされたブランチを介してそのブランチにプッシュします。

ローカルブランチをアップストリームブランチの最新のコミットにリセットしたい場合、これまでのところ私にとってはうまくいきます:

リモートを確認し、アップストリームとオリジンが期待どおりであることを確認します。期待どおりでない場合はgit remote add upstream <insert URL>、たとえば、元のGitHubリポジトリからフォークしたものを使用しますgit remote add origin <insert URL of the forked GitHub repo>

git remote --verbose

git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force

GitHubでは、ローカルのブランチと同じ名前のブランチをチェックアウトして作業をそこに保存することもできます。ただし、オリジンの開発にローカルの保存された作業のブランチと同じ変更がある場合は必要ありません。ここでは例として開発ブランチを使用していますが、既存のブランチ名でもかまいません。

git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop

次に、競合がある場所でこれらの変更を別のブランチとマージする必要がある場合、開発で変更を保持するには、以下を使用します。

git merge -s recursive -X theirs develop

使用中

git merge -s recursive -X ours develop

branch_nameの競合する変更を保持します。それ以外の場合は、mergetoolを使用しgit mergetoolます。

すべての変更をまとめて:

git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;

アップストリーム/開発の代わりに、コミットハッシュや他のブランチ名などを使用できることに注意してください。OhMy ZshなどのCLIツールを使用して、ブランチが緑色で、コミットするものがなく、作業ディレクトリがクリーンであることを確認します(によって確認または検証可能ですgit status)。これは実際にはそう、その場合には、コミットによって自動的に例えばUMLダイアグラム、ライセンスヘッダなど、追加何があるかどうか開発上流へと比べコミットを追加することがありますが、あなたはその後に変更を引っ張る可能性origin developupstream develop必要であれば、。


6

答え

git clean -d -f

過小評価されました(ディレクトリを削除するには-d)。ありがとう!


そして、余分なファイルのない完全な100%クリーンなrepoフォルダーの場合は、を実行しgit clean -xdfます。これにより、gitが認識していないすべてのファイルが削除され、フォルダーがgitのオブジェクトリストの内容と完全に一致します。追加-n(例git clean -nxdf:)して「what-if」を実行すると、実際には何もせずに何を削除するかがわかります。(git clean
qJake

5

HEAD作業ディレクトリとインデックスの両方の状態に戻したい場合はgit reset --hard HEAD、ではなくを実行する必要がありHEAD^ます。(これは、のシングルダッシュとダブルダッシュのようにタイプミスだった可能性があります--hard。)

これらのファイルが変更された状態で表示される理由に関する特定の質問については、ハードリセットではなくソフトリセットを行ったようです。これにより、HEADコミットで変更されたファイルがステージングされているように見えます。これは、ここに表示されているものと思われます。


4

ローカルのgitリポジトリ内の追跡されていないファイルや変更されたファイルには、リセットやクリーニングの影響はないようです(上のオプションをすべて試しました)。これに対する私の唯一の解決策は、ローカルリポジトリをrmし、それをリモートから再クローンすることでした。

幸いなことに、他に気にするブランチはありませんでした。

xkcd:Git


1

私が見たすべてのケースで機能する唯一の解決策は、削除して再クローンすることです。たぶん別の方法があるかもしれませんが、明らかにこの方法は古い状態がそこに残される可能性を残さないので、私はそれを好みます。頻繁にgitでめちゃくちゃになっている場合は、マクロとして設定できるワンライナーをbashします。

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* .gitファイルが破損していないことを前提としています


4
確実にしたい場合は、オペレーティングシステムを再インストールすることもできます。
セバスチャンショール

1

機能ブランチを作成するのを忘れて、誤ってマスターに直接コミットしましたか?

ここで機能ブランチを作成し、ワークツリー(ローカルファイルシステム)に影響を与えずにマスターを元に戻し、ビルド、テスト、およびファイルロックの問題のトリガーを回避できます。

git checkout -b feature-branch
git branch -f master origin/master


-3

ローカルの変更を保存しても構わないが、それでもorigin / HEADに一致するようにリポジトリを更新したい場合は、ローカルの変更を隠してからプルするだけです。

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