ローカルリポジトリをリモートリポジトリのブランチと同じようにリセットするにはどうすればよいですか。
やった:
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
私がこれらを「修正」した理由を教えてください。私はこれらのファイルに触れていませんか?もしそうなら、それらを削除したい。
リモートブランチと完全に一致するようにブランチを設定するには、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が現在チェックアウトされている非ベアリポジトリのブランチに行われた一般的なケースのようにひどく見えます。あなたは最近あなたの地元のレポにプッシュしましたか?そうでなければ、心配は無用です - 他の何かがこれらのファイルを予期せず変更してしまう原因になったに違いありません。そうでなければ、ベア以外のリポジトリにプッシュすることはお勧めできません(特に、現在チェックアウトされているブランチにはプッシュしないでください)。
私がする必要がありました(受け入れられた答えの解決策):
git fetch Origin
git reset --hard Origin/master
に続く:
git clean -f
どのファイルが削除されるのかを確認するには(実際に削除することなく):
git clean -n -f
最初に、対応する上流ブランチの以前にフェッチしたHEAD
にリセットします。
git reset --hard @{u}
@{u}
またはその冗長形式@{upstream}
を指定することの利点は、リモートリポジトリとブランチの名前を明示的に指定する必要がないことです。
次に、必要に応じて、必要に応じて-x
を使用して、追跡されていないファイルを削除します。
git clean -df
最後に、必要に応じて最新の変更を入手してください。
git pull
git reset --hard HEAD
は実際には最後にコミットされた状態にリセットされるだけです。この場合、HEADはブランチのHEADを参照します。
いくつかコミットがある場合、これはうまくいきません。
あなたがたぶんやりたいことは、Originの先頭またはあなたがリモートリポジトリと呼んでいるものにリセットされます。私はおそらくちょうどのような何かをするだろう
git reset --hard Origin/HEAD
しかし注意してください。ハードリセットは簡単に元に戻すことはできません。 Danが示唆しているようにして、リセットする前にあなたの変更のコピーを分岐することをお勧めします。
上記の提案はすべて正しいですが、多くの場合 本当に プロジェクトをリセットします。.gitignore
にあるファイルでも削除する必要があります。
リモートからプロジェクトディレクトリを消去して再クローン作成と同義の道徳的なものを取得するには:
git fetch
git reset --hard
git clean -x -d -f
Warning:git clean -x -d -f
は 元に戻せない で、ファイルやデータを失う可能性があります(.gitignore
を使用して無視したものなど)。
この質問では2つの問題が混在しています。
git status
がnothing to commit, working directory clean.
を言うように、ステージング領域(そしておそらく作業ディレクトリ)をクリアする方法ワンストップの答えは:
git fetch --Prune
(オプション)リモートリポジトリのローカルスナップショットを更新します。その他のコマンドはローカル専用です。git reset --hard @{upstream}
ローカルブランチポインタをリモートのスナップショットのある場所に置き、インデックスと作業ディレクトリをそのコミットのファイルに設定します。git clean -d --force
Gitが“作業ディレクトリをきれいにする”と言うことを妨げている追跡されていないファイルやディレクトリを削除します。これは私が定期的に直面していることです、そして私はあらゆるブランチで動作するように上で提供されたスクリプト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
これは最も人気のある答えが示唆するものを自動化するスクリプトです...分岐をサポートする改良版については 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
リモートリポジトリが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
内のファイルと一致するように変更します。
やった:
git branch -D master
git checkout master
ブランチを完全にリセットする
必要なブランチを削除できるようにするには、別のブランチにチェックアウトする必要があります。
私と同じ問題を抱えていて、すでにいくつかの変更をコミットしている場合でも、今、何らかの理由でそれを取り除きたい場合は、最も簡単な方法はgit reset
をこのように使用することです。
git reset --hard HEAD~2
私は2つのコミットを必要としていなかったので、2という数になりました。リセットするには、自分のコミット数に変更できます。
それであなたの質問に答えてください - もしあなたがリモートリポジトリHEADよりも5コミット前なら、このコマンドを実行するべきです:
git reset --hard HEAD~5
行った変更は失われるので注意してください。
以前の回答では、リセットされるブランチは現在のブランチ(チェックアウト済み)であると仮定しています。コメントでは、OP hap497はブランチが実際にチェックアウトされていることを明確にしましたが、これは元の質問では明示的に要求されていません。少なくとも1つの "重複した"質問があるので、 ブランチをリポジトリの状態に完全にリセットします これは、ブランチがチェックアウトされていることを前提としていません。
ブランチ "mybranch"が現在チェックアウトされている not である場合、それをリモートブランチ "myremote/mybranch"の先頭にリセットするには、 low-level コマンドを使用します。
git update-ref refs/heads/mybranch myremote/mybranch
このメソッドはチェックアウトされたブランチをそのままにし、作業ツリーはそのまま残します。 2番目の引数として与えられたものは何でも、それは単にmybranchの頭を別のコミットに移動させます。これは、複数のブランチを新しいリモートヘッドに更新する必要がある場合に特に役立ちます。
ただし、これを行うときは注意してください。また、gitk
または同様のツールを使用して、ソースと宛先を二重チェックしてください。誤って現在のブランチでこれを実行すると(そしてgitはあなたを妨げないでしょう)、新しいブランチの内容が作業ツリーと一致しないために変更されないため、混乱する可能性があります。それが前にあったところに)。
作業ディレクトリとインデックスの両方でHEAD
状態に戻りたい場合は、git reset --hard HEAD
ではなくHEAD^
を使用してください。 (これは、--hard
のシングルダッシュとダブルダッシュのように、タイプミスがあった可能性があります。)
これらのファイルがなぜ変更された状態で表示されるのかについてのあなたの特定の質問に関しては、おそらくあなたはハードリセットの代わりにソフトリセットをしたように見えます。これにより、HEAD
コミットで変更されたファイルは、ステージングされているかのように表示されます。これは、おそらくここで見ていることです。
これは私がよく使うものです:
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
に変更します。
ローカルのgitリポジトリにある未追跡のファイルや変更されたファイルに、リセットやクリーニングを行っても何の効果もないようです(上記のすべてのオプションを試してみました)。これに対する私の唯一の解決策はローカルレポジトリをrmにしてリモートからそれを再クローンすることでした。
幸い、私が気にしている他のブランチはありませんでした。
以下のコマンドを試してください。ローカルのgitから追跡されていないファイルもすべて削除されます。
git fetch Origin
git reset --hard Origin/master
git clean -d -f
私が見たすべてのケースでうまくいく唯一の解決策は削除して再クローンすることです。別の方法があるかもしれませんが、明らかにこの方法では古い状態がそこに残される可能性がないので、私はそれを好むのです。あなたが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ファイルが壊れていないと仮定