「git push」を元に戻す


591

これが、安定するはずのブランチで私がしたことです...

% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
  refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
  from cc4b63bebb6e6dd04407f8788938244b78c50285
  to   83c9191dea88d146400853af5eb7555f252001b0
    done
'refs/heads/unstable': up-to-date
Updating remote server info

後で気づいたように、それはすべて間違いでした。このプロセス全体を元に戻し、alpha-0.3.0ブランチを元の状態に戻します。

私は何をすべきか?


このstackoverflowの投稿はおそらく? stackoverflow.com/questions/134882/undoing-a-git-rebase
スティーン

4
これは実際には同じ状況ではありません。リベースを元に戻すのはローカルリポジトリのシナリオです。Gitプッシュを元に戻すにはリモートリポジトリが関係し、アクセス権によってはよりトリッキーになる場合があります。
CBベイリー、

スティーン-そうです-私はおそらく私が推測する必要があります。私はすべてがプルする祝福されたリポジトリは管理タスクの多くであり、ここに属していると考えましたが、一般的なクライアント側のgitはstackoverflowの質問です。
Cyrus

簡単な説明- 部分的なハッシュ値でgit コミットを参照していると思いますが、gitは、その文字列で始まるハッシュのコミットについて話していると想定しますか?
Gershom 2015年

回答:


944

このリポジトリの他のユーザーが誤った変更をフェッチしていないこと、または履歴を巻き戻そうとしているために削除したいコミットの上に構築を試みていないことを確認する必要があります。

次に、古い参照を「強制」プッシュする必要があります。

git push -f origin last_known_good_commit:branch_name

またはあなたの場合

git push -f origin cc4b63bebb6:alpha-0.3.0

receive.denyNonFastForwardsリモートリポジトリを設定している可能性があります。この場合、を含むエラーが発生します[remote rejected]

このシナリオでは、ブランチを削除して再作成する必要があります。

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

これが機能しない場合-おそらくreceive.denyDeletes設定したためか、リポジトリに直接アクセスする必要があります。次に、リモートリポジトリで、次の配管コマンドのようなことを行う必要があります。

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8

16
完璧でよく説明された応答-ありがとうございました。これに遭遇した他の誰にとっても、学術的な理由で私は最初の2つのアプローチの両方を試してみましたが、どちらも機能しました。チャールズを10倍にするとしたら :)
Cyrus

139
簡単に参照できるように、ここの最初の行はgit push -f origin last_known_good_commit:branch_name
philfreo '29

5
git push -f origin cc4b63bebb6:alpha-0.3.0 =>これが役に立ちました。alpha-0.3.0はブランチ名で、cc4b63bebb6は元に戻すコミットIDです。したがって、このコマンドを実行すると、cc4b63bebb6コミットIDになります。
kumar

22
共有リポジトリで作業している場合、このソリューションは非常に危険です。ベストプラクティスとして、共有されているリモートリポジトリにプッシュされたすべてのコミットは「不変」と見なされます。代わりに使う'Gitの元に戻す':kernel.org/pub/software/scm/git/docs/...
Saboosh

1
jww-他のものと比較して、gitは利用可能な最も機能豊富で効率的なソース管理ツールです。チームによって使用方法が異なります。週末を新しいリポジトリで遊んで、一般的なシナリオをすべて試してみる価値はあります。ある程度の時間を費やすと、開発のストレスが大幅に軽減されます。
user1491819

165

あなたもこれを行うことができると思います:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

これは、リモートリポジトリをいじくる必要がないことを除いて、前の方法と非常に似ています。


9
これは私にとってもうまくいきましたが、これはリモコンの履歴を「再書き込み」することは注目に値します。これはあなたが望むことかもしれませんが、そうではないかもしれません!
トム

3
この回答の+1は本当に役に立ちました。また、コミットID( " --hard"パラメータの後にあります)は、ブランチをリセットしたいコミットのIDであることを追加(および明確化)したいと思いました。
Michael Dautermann、2007

1
歴史を上手く書き直しました...変更をプルした可能性のある人なら誰でも、私は彼らがgit reset --hard [commit_id]そうしたことを確認しました。
エイリアンライフフォーム

9
「git push origin + alpha-0.3.0」の+は何ですか?
jpierson 2017年

1
@jpierson +は、同様にプッシュを強制的に実行します-f(ただし、少し異なります:stackoverflow.com/a/25937833/1757149)。それがないとgit push origin alpha-0.3.0、プッシュしようとすると失敗しますUpdates were rejected because the tip of your current branch is behind
A__

106

git revert ここで提案されているいくつかのアプローチよりも危険性が低いです:

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
 4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>

35f6af6f77f116ef922e3d75bc80a4a466f92650を独自のコミットに置き換えます。


2
35f6af6f77f116ef922e3d75bc80a4a466f92650 IDを思いつくにはどうすればよいですか?あなたがそれを説明できれば、この答えはより良いでしょう。
Volomike 2013年

2
@Volomike(および将来のグーグル開発者)、この質問はそれを取得する多くの方法を説明します:SOのバージョン管理とハッシュの質問
Jaime

これは正しい答えです。「git reset」を使用すると、プッシュできないはずです(現在のブランチの先端がリモートの相手の後ろにあるため更新が拒否されました)、または実際にはクリーンではないプルを強制する必要があります。
Thomas Decaux、2014

これは私のために働いていました。ただし、revertはローカルファイルのすべての変更を元に戻すので注意してください。
user1941537

私はこのアプローチを複数回選択しましたが、ここでもgit rebase -i <id-before-last-good-commit>を使用してインタラクティブなリベースを実行し、履歴をクリーンアップします。ここでは、stackoverflow.com / questions / 5189560 /…です。
Ernesto Allely

35

共有リポジトリで作業している場合、(@ charlesベイリーから)承認されたソリューションは非常に危険です。

ベストプラクティスとして、共有されているリモートリポジトリにプッシュされたすべてのコミットは「不変」と見なす必要があります。代わりに「git revert」を使用してください:http : //www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things


正確には、処方している指示は何ですか?古いリンクしかないようです。
jww 2016年

32

必要な変更を失うことなくそれを行う方法:

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

次に、プッシュするファイルを選択できます


19

これを行う別の方法:

  1. 別のブランチを作成する
  2. 「git checkout」を使用して、そのブランチの以前のコミットをチェックアウトします
  3. 新しいブランチをプッシュします。
  4. 古いブランチを削除して削除をプッシュします(を使用git push origin --delete <branch_name>
  5. 新しいブランチの名前を古いブランチに変更します
  6. もう一度押します。

2
これは、リポジトリに間違ったコミットが既にある場合の実際の解決策のように見えます
Illarion Kovalchuk '24 / 10/24


11

複数のコミットを取り消すgit reset --hard 0ad5a7a6(コミットSHA1ハッシュを提供するだけです)

最後のコミットを元に戻す

git reset --hard HEAD〜1(最後のコミットへの変更は削除されます)git reset --soft HEAD〜1(最後のコミットへの変更は、コミットされていないローカル変更として利用可能になります)


9

シナリオ1:最後のコミットを元に戻したい場合は、8123b7e04b3と言います。以下がコマンドです(これは私にとってはうまくいきました):

git push origin +8123b7e04b3^:<branch_name>

出力は次のようになります。

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

追加情報: シナリオ2:状況によっては、前のコマンドで元に戻した内容(基本的には元に戻す)を元に戻し、以下のコマンドを使用したい場合があります。

git reset --hard 8123b7e04b3

出力:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

詳細はこちら:https : //github.com/blog/2019-how-to-undo-almost-anything-with-git


質問はどのコミットを削除するかを指定していなかったので、シナリオ1は回答を受け入れるべきです。受け入れられた回答は、最後のコミットのみを削除します。この答えコミットを削除します
Dominic Cerisano

0

既存の回答は適切で正しいですが、元に戻す必要がある場合はどうなりますかpush

  1. ローカルでコミットを保持したい、またはコミットされていない変更を保持したい
  2. プッシュしたコミットの数がわかりません

このコマンドを使用して、変更を参照に戻します。

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

-2

リモートブランチにプッシュした最後のコミットを無視したい場合:これはコミットを削除せず、gitポインターを先にコミットに移動して無視するだけで、HEAD ^またはHEAD ^ 1で参照されます。

git push origin +HEAD^:branch

しかし、このコミットをすでにプッシュしていて、他の人がブランチをプルしている場合。この場合、ブランチの履歴を書き換えることは望ましくないため、代わりにこのコミットを元に戻す必要があります。

git revert <SHA-1>
git push origin branch

1
はい!これはgithubで作業するときの魅力のように機能しました。ありがとう。
cukabeka 2017年

問題は「プッシュ」についてであり、それはリモートブランチに関係します。いいえ、1つのコミットについてHEADを移動します。つまり、最後にプッシュされたコミットを無視することを意味します:git push origin + HEAD ^:your_branch
mkebri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.