web-dev-qa-db-ja.com

'git push'を元に戻す

これが私の 安定しているはずの branchで行ったことです。

% 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ブランチを元の状態に戻します。

私は何をすべきか?

514
Cyrus

このリポジトリの他のユーザが不正確な変更を取得したり、履歴を巻き戻しようとしているために削除したいコミットの上に構築しようとしていないことを確認する必要があります。

それからあなたは '強制'古い参照をプッシュする必要があります。

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が設定されているために、リポジトリに直接アクセスする必要があります。リモートリポジトリでは、次のplumbingコマンドのようにしなければなりません。

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

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

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git Push Origin +alpha-0.3.0

これは最後の方法と非常によく似ていますが、リモートレポジトリをいじる必要はありません。

139
Benny Wong

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を自分のコミットで置き換えてください。

86
neoneye

あなたが共有リポジトリで作業している場合、(@ charles baileyからの)受け入れられた解決策は非常に危険です。

ベストプラクティスとして、共有されているリモートレポジトリにプッシュされたすべてのコミットは「不変」と見なされるべきです。代わりに '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

32
Saboosh

あなたが望んだ変更を失うことなくそれをする方法:

git reset cc4b63b 
git stash
git Push -f Origin alpha-0.3.0
git stash pop

それからあなたはあなたがプッシュしようとしているファイルを選択することができます

28
curmil

これを行う別の方法:

  1. 別のブランチを作る
  2. "git checkout"を使ってそのブランチの前のコミットをチェックアウトする
  3. 新しい枝を押します。
  4. 古いブランチを削除して削除をプッシュします(git Push Origin --delete <branch_name>を使用)
  5. 新しいブランチの名前を古いブランチに変更します
  6. もう一度押してください。
17
Rushabh Mehta
git Push Origin +7f6d03:master

これはあなたのレポを前述のコミット番号に戻します。

11

複数のコミットを元に戻すgit reset --hard 0ad5a7a6(コミットSHA1ハッシュを提供するだけ)

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

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

9
Jaymin

シナリオ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

6
Barani r