Git、オリジン/マスターをコミットにリセットする方法は?


245

次のコマンドでローカルマスターをコミットにリセットします。

git reset --hard e3f1e37

$ git statusコマンドを入力すると、ターミナルは次のように言います:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

origin / headerもリセットしたいので、origin / masterにチェックアウトします。

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

次のコマンドでヘッダーをリセットします。

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

次に、成功しなかったorigin / headerにコミットを追加しようとしました。

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

最後に、ローカルマスターにチェックアウトします。

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

オリジン/マスターのヘッドをリセットしたので、ローカルとオリジンは同じ方向にあるはずですが、gitはローカル/マスターが7回のコミットでオリジン/マスターより遅れていると言っています。

この問題を解決するにはどうすればよいですか?私が探しているのは、同じコミットを指すローカル/マスターおよびオリジン/マスターのヘッドです。次の画像は私がしたことを示しています。ありがとう。

ここに画像の説明を入力してください


まず、プロジェクトの保護されたブランチにコードを強制的にプッシュすることを許可されていることを確認してください。そうしないと、できません...
DarmVillegas

回答:


563

origin/xxxブランチは常にリモートへのポインタです。ローカルリポジトリへのポインターではないため、チェックアウトできません(コミットをチェックアウトするだけです。そのため、コマンドラインインターフェイスのブランチマーカーに書き込まれた名前は表示されず、コミットハッシュのみが表示されます)。

リモートを更新するには、ローカルの変更をマスターに強制的にプッシュする必要があります。

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
これは要求された操作を行いますが、すでにマスターからコミットをプルした人​​々を不幸にすることに留意してください。
mnagel 2013

この手順を実行すると、ロールバックしました。しかし、オリジン/ HEADは現在、マスター以外のブランチを指しています。これを修正するにはどうすればよいですか?
Daniil Shevelev 2013

1
origin / HEADを気にする必要はありません。良い参照をorigin / refにプッシュするだけです
Simon Boudrias

同意して、誤って間違ったブランチをマージして元に戻した後、今日これを行わなければなりませんでした。問題なく動作しますが、影響を受けるブランチを他の人が元からチェックアウトしている場合は、非常に混乱を招く可能性があります。注意して使用してください。
ニックW.

1
動作しません。remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

ここで見つかっソリューションは、すでにプッシュされた以前のコミットにマスターを更新するのに役立ちまし

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

受け入れられた回答との主な違いは、プッシュコマンドでのマスターの前のコミットハッシュ "e3f1e37:"です。


1
機能しません:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0 '16年

@ m0skit0はメッセージとして言うyou should pull first:)
intuitivepixel

これに対する答えはであるstackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseしかし、実際に私は私が持っている私の地元のgitリポジトリに手動で設定/opt/git私はここにアイデアをプレイするために作成されています。bitbucket、githubなどでこれをどのように行うことができるかわかりません...そして、ハードリセットで達成しようとしていたことを逆にするので、@ intuitivepixelは無意味です。
HankCa、2015

こんにちは@ jkovacs、masterの新しい変更を削除したくありません。そのコミットハッシュ "e3f1e37"をオリジンマスターにプッシュしたいだけです。2番目のコマンドgit reset --hard "e3f1e37"をスキップすることで可能ですか?
KarenAnne 2015

こんにちは@jkovacs、私は2番目のステップをスキップできることを確認しました。:)
KarenAnne

2

ブランチがmasterこことリモートの両方で呼び出され、リモートが呼び出されると仮定すると、origin次のことができます。

git reset --hard <commit-hash>
git push -f origin master

ただし、他の誰かがリモートリポジトリで作業していて、変更をプルした場合は、これを行わないでください。その場合は、不要なコミットを元に戻し、通常どおりにプッシュすることをお勧めします。


1

私も同じような状況にあったので、自分の状況とこれらの回答がどのように役立つかを共有したいと思いました(みんなに感謝します)。

そこで、メインブランチでの進捗状況を保存するたびに最後のコミットを修正してローカルで作業することにしました(私は分岐して、コミットし、プッシュし続け、後でマスターにマージする必要があるはずです)。

ある深夜、ハードウェアの障害またはエーテルの何かへの私の進行を失うという恐怖の恐怖の中で、私はマスターを元に戻すことにしました。その後、ローカルマスターブランチを修正し続け、もう一度プッシュするときが来たとき、さまざまなマスターブランチに直面し、ローカル開発ブランチのようにorigin / upstream(当たり前)を修正できないことがわかりました。

ですから、私は既にコミットした後でマスターをローカルでチェックアウトしませんでした。マスターは変わらなかった。私はリセットする必要さえありませんでした-私の現在のコミットは大丈夫でした。

この場合はHEADの位置にあるため、マスターに強制したいコミットを指定することなく、単にプッシュをオリジンに強制しました。git diff master..origin/master違いがないか確認したのでそれだけです。すべて修正されました。ありがとう!(私はgitの初心者です、ご容赦ください!)

したがって、ローカルのマスターブランチですでに問題がない場合は、次のようにします。

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