web-dev-qa-db-ja.com

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

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

やった:

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

私がこれらを「修正」した理由を教えてください。私はこれらのファイルに触れていませんか?もしそうなら、それらを削除したい。

3077
hap497

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

ところで、あなたがいるこの状況は、Pushが現在チェックアウトされている非ベアリポジトリのブランチに行われた一般的なケースのようにひどく見えます。あなたは最近あなたの地元のレポにプッシュしましたか?そうでなければ、心配は無用です - 他の何かがこれらのファイルを予期せず変更してしまう原因になったに違いありません。そうでなければ、ベア以外のリポジトリにプッシュすることはお勧めできません(特に、現在チェックアウトされているブランチにはプッシュしないでください)。

5386
Dan Moulding

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

git fetch Origin
git reset --hard Origin/master

に続く:

git clean -f

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

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

git clean -n -f
319
Akavall

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

git reset --hard @{u}

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

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

git clean -df

最後に、必要に応じて最新の変更を入手してください。

git pull
184
A-B-B

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

いくつかコミットがある場合、これはうまくいきません。

あなたがたぶんやりたいことは、Originの先頭またはあなたがリモートリポジトリと呼んでいるものにリセットされます。私はおそらくちょうどのような何かをするだろう

git reset --hard Origin/HEAD

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

98
Mikael Ohlson

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

リモートからプロジェクトディレクトリを消去して再クローン作成と同義の道徳的なものを取得するには:

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

Warninggit clean -x -d -f 元に戻せない で、ファイルやデータを失う可能性があります(.gitignoreを使用して無視したものなど)。

66

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

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

ワンストップの答えは:

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

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

また、 "Are you sure"プロンプトと、いくつかのフィードバック出力を追加しました。

#!/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
21
Andrew Tulloch

これは最も人気のある答えが示唆するものを自動化するスクリプトです...分岐をサポートする改良版については 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
13
Wolfgang Fahl

リモートリポジトリが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内のファイルと一致するように変更します。

12
eigenharsha

やった:

git branch -D master
git checkout master

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


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

11
user2846569

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

git reset --hard HEAD~2

私は2つのコミットを必要としていなかったので、2という数になりました。リセットするには、自分のコミット数に変更できます。

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

git reset --hard HEAD~5

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

8
Karol

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

ブランチ "mybranch"が現在チェックアウトされている not である場合、それをリモートブランチ "myremote/mybranch"の先頭にリセットするには、 low-level コマンドを使用します。

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

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

ただし、これを行うときは注意してください。また、gitkまたは同様のツールを使用して、ソースと宛先を二重チェックしてください。誤って現在のブランチでこれを実行すると(そしてgitはあなたを妨げないでしょう)、新しいブランチの内容が作業ツリーと一致しないために変更されないため、混乱する可能性があります。それが前にあったところに)。

5
Rainer Blome

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

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

5
Emil Sit

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

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

ローカルマスタに変更を加えるのではなく、代わりに別のブランチにチェックアウトしてブランチ名に変更の種類を付加することをお勧めします。 feat/chore/fix/など。したがって、マスターから変更をプッシュするのではなく、変更をプルするだけで済みます。他の支店についても、他の人が貢献しているのと同じことが言えます。そのため、他の人がコミットしたブランチに変更をコミットし、リセットする必要がある場合にのみ、上記を使用してください。そうでなければ、将来的に他の人がプッシュするブランチにプッシュすることを避け、代わりにチェックアウトし、チェックアウトされたブランチを介してそのブランチにプッシュする。

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

あなたのリモートをチェックし、あなたのアップストリームとOriginがあなたが期待しているものであることを確認してください、そうでなければ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では、ローカルのものと同じ名前でブランチをチェックアウトすることもできます。ただし、Origin Developがローカルの保存済みワークブランチと同じ変更を行っている場合は必要ありません。私は開発ブランチを例として使用していますが、それは既存のブランチ名のどれでも構いません。

git add .
git commit -m "Reset to upstream/develop"
git Push --force Origin develop

衝突があるときにこれらの変更を他のブランチとマージする必要がある場合は、developmentで変更を保存して、以下を使用してください。

git merge -s recursive -X theirs develop

使いながら

git merge -s recursive -X ours develop

branch_nameの競合する変更を保存します。そうでなければgit mergetoolと一緒に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に変更します。

4
James Ray

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

幸い、私が気にしている他のブランチはありませんでした。

xkcd:Git

3
Martin

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

git fetch Origin
git reset --hard Origin/master
git clean -d -f
2
Jamsheer

私が見たすべてのケースでうまくいく唯一の解決策は削除して再クローンすることです。別の方法があるかもしれませんが、明らかにこの方法では古い状態がそこに残される可能性がないので、私はそれを好むのです。あなたが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ファイルが壊れていないと仮定

0
sudo