Gitでローカルコミットを破棄する方法は?


263

私は何かに取り組んでいて、それが完全にねじ込まれていると判断した...それのいくつかをコミットした後。だから私は次のシーケンスを試しました:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

その時点で私はメッセージを受け取りました

Your branch is ahead of 'origin/master' by 2 commits.

ローカルディレクトリを消去してすべてを再ダウンロードすることなく、ローカルコミットを破棄したい。どうすればそれを達成できますか?


6
両方行う必要はありませんgit fetchとはgit pull-プルフェッチやマージの組み合わせです。
Ether

12
ユーザーへの注意:この質問の主な問題は、「あなたのブランチはN回のコミットで 'origin / master'の前にあります」というメッセージとは関係ありません。。そのメッセージのため、この質問の重複として他の質問を閉じるのをやめてください。

回答:


581
git reset --hard origin/master

はレポ名で、はブランチの名前origin/masteroriginはないすべてのコミットを削除しますmaster


1
構文 "origin / master"は、スラッシュを付けてローカルリポジトリを参照していると思いましたか?
ダニエルC.ソブラル

9
mipadi:より正確に言うと、現在のブランチをリセットしてorigin / masterと同じコミットを指すようにします。
ChristofferHammarström10年

ブランチを指します。リモートリポジトリのorigin/masterブランチを追跡するmasterブランチですorigin
mipadi

@ DanielC.Sobralいいえ、というリモートorigin/mastermasterブランチへの参照originです。
マシュー

1
@littletiger gitはフォルダーを追跡せず、ファイルとそのパスのみを追跡します。したがって、空のフォルダー(ファイルのないフォルダー、または無視されたファイルのみ)を完全に無視します。中に入るものがないので、どこにも現れません。
Mumbleskates 2016

33

余談ですが、mipadiの回答(ちなみにうまくいくはずです)を除いて、次のことを知っている必要があります。

git branch -D master
git checkout master

また、あなたが望んでいないことも正確に実行しますhaving to redownload everything(引用を言い換えます)。これは、ローカルリポジトリにリモートリポジトリのコピーが含まれているためです(そのコピーはローカルディレクトリと同じではなく、チェックアウトされたブランチと同じではありません)。

ブランチを一掃することは完全に安全であり、そのブランチを再構築することは非常に速く、ネットワークトラフィックを必要としません。覚えておいてください、gitは主にローカルのリポジトリです。リモートブランチでさえ、ローカルにコピーがあります。特定のローカルコピーが実際にはリモートブランチであることをgitに伝えるメタデータはほんの少ししかありません。gitでは、すべてのファイルが常にハードディスクにあります。

マスター以外のブランチがない場合は、次のことを行う必要があります。

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
しかし、それは、ローカルで行われたコミットと、元々行われたコミットとをどのように区別するのでしょうか?実際、それは私にそれを教えてくれますCannot delete the branch 'master' which you are currently on.
ダニエルC.ソブラル

1.基本的に、コミットがローカルで行われたか、それとも元で行われたかに関係なく、すべてのコミットは同じです。重要なのは、履歴が正しく同期されていることです。ローカルコミットは、プッシュした後の起点にのみ存在し、デフォルトでは、起点の履歴が意味のない状態になる可能性がある場合、gitはプッシュを拒否します。
slebetman

2
2.もちろん、現在チェックアウトされているブランチを削除することはできません。マスターを削除するには、最初に別のブランチをチェックアウトします。:他の分岐が存在しない場合は、単に一時的なものを作成するgit checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

リモートリポジトリのローカルコピーが異なることについて私が言ったことにも注意してください。gitでは、リモートブランチのコピー内のファイルを編集したり、表示したりすることはできません。リモートブランチから別のブランチを作成して、それを表示および編集できるようにするだけです。慣例により、このローカルブランチはリモートブランチと同じ名前です。あなたはorigin/masterローカルマシン上にあるという点で部分的に正しいです。これは、リモートブランチのローカル(完全)コピーです。実際のリモートブランチはorigin masterです。
slebetman、2010年

これでうまくいきました。git branch -D master指摘されたようにエラーを生成するため、多分それは必要ではありませんでした。
Alexis Wilke、2014年

15

私がしていることは、HEADにハードリセットしようとすることです。これにより、すべてのローカルコミットが消去されます。

git reset --hard HEAD^

これが最良の答えです。すべてのローカルコミットを破棄し、HEADにリセットしました。^ charの使用はどうですか?
karim

@karim「^」の、おそらく正規表現のもの、マニュアルファイル内のかなり深い私は長い時間前に知っているか、読んでいないことをおそらく何か...ごめん男:)です
ジャングエン

1
遅くなりますが、^は親コミットを表すため、リセットすると、HEAD^コミットされていない変更を破棄し、ブランチを前のコミットに移動し、最新のコミットを事実上「削除」します(コミットはまだ存在していますが、ブランチはそれを指していません)。答えはローカルコミットが1つだけで、残りはコミットされていない変更です。@karim @giang
QuantumQuaver

3

あなたは走る必要があります

git fetch

すべての変更を取得すると、「ブランチが先です」というメッセージが表示されなくなります。


5
フェッチは、ローカルコミットを取り除くことである質問者の主な問題とは何の関係もありません。

1
ローカルでファイルを既にコミットし、上記のコマンドを実行しようとした場合はどうなりますか?同じエラーメッセージが表示されます。git fetchとgit fetch -pも試しました。同じエラーが表示される
Morez

1

リモートが同期しなくなり、更新が必要になる例を見てきました。場合reset --hardbranch -D仕事に失敗し、してみてください

git pull origin
git reset --hard 

これは質問の答えにはなりません。reset --hardこの状況で機能します
CharlesB

1
こんにちはチャールズ、あなたはreset --hardここでうまくいくはずです。ただし、ブランチを正しくリセットできないことがあり、a git pull originがリモートを再同期して、reset --hardが正しく機能することを許可することを指摘します。
Jim Clouse 2013

0

私はしなければなりませんでした:

git checkout -b master

gitが存在しないと言ったのは、

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