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

2009年10月27日に質問されました。  ·  閲覧回数 3.6M回  ·  ソース

hap497 picture
2009年10月27日

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

やった:

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

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

回答

Dan Moulding picture
2009年10月27日
7253

リモートブランチと完全に一致するようにブランチを設定するには、次の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」という名前のブランチがローカルリポジトリの現在チェックアウトされているブランチと一致することを前提としていることに注意してください。

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

Akavall picture
2014年12月27日
467

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

git fetch origin
git reset --hard origin/master

に続く:

git clean -f

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

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

git clean -n -f
Acumenus picture
2015年02月11日
348

まず、 git resetを使用して、対応するアップストリームブランチの以前にフェッチされたHEADにリセットします。

git reset --hard @{u}

@{u}またはその詳細形式@{upstream}を指定する利点は、リモートリポジトリとブランチの名前を明示的に指定する必要がないことです。 WindowsまたはPowerShellの場合は、 "@{u}"指定します(二重引用符で囲みます)。

次に、必要に応じて、 git cleanを使用して、追跡されていないファイルを削除します。オプションで-xも使用します。

git clean -df

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

git pull
Mikael Ohlson picture
2009年10月27日
118

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

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

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

git reset --hard origin/HEAD

ただし、注意してください。 ハードリセットは簡単に元に戻すことはできません。 ダンが提案するように実行し、リセットする前に変更のコピーを分岐することをお勧めします。

Christopher Smith picture
2015年07月24日
78

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

プロジェクトディレクトリ再クローンを作成するのと道徳的に同等なものを取得するには、次のようにし

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

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

Jamsheer picture
2019年03月22日
50

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

git fetch origin
git reset --hard origin/master
git clean -d -f
Robert Siemer picture
2016年01月31日
41

質問には、ここで2つの問題が混在しています。

  1. リモートが存在するポイントにローカルブランチをリセットする方法
  2. git statusnothing to commit, working directory clean.ように、ステージング領域(および場合によっては作業ディレクトリ)をクリアする方法

ワンストップの答えは次のとおりです。

  1. git fetch --prune (オプション)リモートリポジトリのローカルスナップショットを更新します。
    git reset --hard @{upstream}リモートのスナップショットがある場所へのローカルブランチポインタを配置し、インデックスと作業ディレクトリをそのコミットのファイルに設定します。
  2. git clean -d --force gitが「作業ディレクトリがクリーン」と言うのを妨げる追跡されていないファイルとディレクトリを削除します。
Andrew Tulloch picture
2012年11月09日
25

これは私が定期的に直面していることであり、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
eigenharsha picture
2017年05月08日
23

リモートリポジトリがoriginであり、 branch_name関心がある場合:

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

また、あなたは、リセットのための現在のブランチに行くoriginするHEAD

git fetch origin
git reset --hard origin/HEAD

使い方:

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

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

Wolfgang Fahl picture
2012年10月15日
16

これは最も人気のある答えが示唆することを自動化するスクリプトです...ブランチをサポートする改善されたバージョンについてはhttps://stackoverflow.com/a/13308579/1497139を参照して

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://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"`
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