4855

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

やった:

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

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

4

22 に答える 22

8427

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

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

于 2009-10-27T01:44:30.760 に答える
156

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

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

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

git reset --hard origin/HEAD

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

于 2009-10-27T01:08:57.283 に答える
46

この質問には、次の 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 が「作業ディレクトリをクリーン」と言うのを妨げる、追跡されていないファイルとディレクトリを削除します。
于 2016-01-31T01:29:30.827 に答える
27

これは私が定期的に直面していることであり、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
于 2012-11-09T13:01:40.317 に答える
19

やった:

git branch -D master
git checkout master

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


注、必要なブランチを削除できるようにするには、別のブランチにチェックアウトする必要があります

于 2014-05-14T07:48:28.430 に答える
18

これは、最も一般的な回答が示唆することを自動化するスクリプトです...ブランチをサポートする改善されたバージョンについては、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
于 2012-10-15T08:50:39.113 に答える
13

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

git reset --hard HEAD~2

必要のないコミットが 2 つあったため、2 になりました。リセットするコミットの数に変更できます。

あなたの質問に答えると、リモート リポジトリ HEAD よりも 5 コミット進んでいる場合は、次のコマンドを実行する必要があります。

git reset --hard HEAD~5

行った変更が失われることに注意してください。

于 2014-06-16T03:35:57.737 に答える
12

以前の回答では、リセットするブランチが現在のブランチ (チェックアウト済み) であると想定しています。コメントでは、OP hap497はブランチが実際にチェックアウトされていることを明確にしましたが、これは元の質問では明示的に要求されていません。少なくとも 1 つの「重複する」質問があるため、ブランチがチェックアウトされていることを前提としない、 Reset branch fully to repository stateという別の方法があります。

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

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

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

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

于 2016-06-25T17:13:54.360 に答える
10

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

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

ローカルの master/develop ブランチを変更するのではなく、代わりに別のブランチにチェックアウトして、変更の種類 (例: 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;

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

于 2018-04-26T01:30:27.773 に答える
7

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

これらのファイルが変更済みとしてステータスに表示される理由に関する具体的な質問については、おそらくハード リセットではなくソフト リセットを行ったようです。これにより、コミットで変更されたファイルHEADがステージングされたかのように表示されます。これは、おそらくここに表示されているものです。

于 2009-10-27T02:10:21.753 に答える
6

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

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

xkcd: ギット

于 2016-12-01T10:25:43.337 に答える