web-dev-qa-db-ja.com

どうすれば1コミットをロールバックできますか?

私がプッシュしなかったコミットは2つあります。

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

最初のもの(最も古いもの)をロールバックし、2番目のものを保持するにはどうすればよいですか。

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

ここから:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

私はただする必要がありますか:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

あれは?

125
n179911

最も安全でおそらく最もクリーンな方法は対話的にリベースすることです。

git rebase -i HEAD^^

または、

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

そこから、コミットを潰して、1つ以上のコミットを前のコミットにまとめることができます。履歴からコミットを完全に削除するには、リストからその行を削除します。

git revertを使用してコミットを元に戻すことはできますが、コミットメッセージを履歴に追加することになるため、望ましくない場合があります。 -nパラメータを使用して、Gitに復帰をすぐにコミットしないように指示します。あなたは対話的にリベースし、物事をきれいに保つためにそれらを前のコミットまで潰すことができます。

ここで作業している2つのコミットが同じファイルに影響する場合は、マージの競合が発生する可能性があります。

git reset --hardを使用してリポジトリをリセットすると、元に戻すことはできないため、慎重に行う必要があります。

歴史の書き換えは慎重に行われるべきです。

94
jtimberman

これは http://nakkaya.com/2009/09/24/git-delete-last-commit/ からであれば私のために働きました

最後のコミットをGit削除

私がコーヒーを使い果たしたときに夜遅くなって、私は私が持ってはいけないものをコミットします。それから、私が最後に行ったコミットを削除する方法を次の10 - 15分のグーグルで過ごします。 3回目以降は、後で参照できるように記録したいと思いました。

がらくたをコミットしたがプッシュされていない場合

git reset --hard HEAD~1

HEAD〜1は、先頭へのコミットの省略形です。あるいは、リセットしたいハッシュのSHA-1を参照することができます。 --hardを使用すると、コミット前のコミット以降に作業ツリー内の追跡対象ファイルに加えられた変更は失われます。

行った作業を一掃したくない場合は、コミットを削除する--softオプションを使用することができますが、git statusが示すように、変更されたファイルはすべて「コミットされる変更」のままになります。

今、あなたがすでにプッシュしていて、誰かが引っ張ってきたのであれば、通常私の場合は、git resetを使うことはできません。しかし、あなたはgit revertをすることができます、

git revert HEAD

これは偶発的なコミットによって導入されたすべてを元に戻す新しいコミットを作成します。

51
iStryker

いや。 git-reset --hardはあなたを歴史の中に連れ戻します。あなたが探しているのはgit revertです。

8
Peltier

私はちょうどこれをやった:

git rebase -i HEAD^^

私はそれを台無しにした

git rebase --abort

それからまたやりました。それから私はこのようにプッシュする必要がありました:

git Push Origin master -f

そしてそれは私がロールバックしたコミットよりも新しいコミットを破壊しました。うまくいった。

5
hamstar

git reset --hardを元に戻すことができないというjtimbermanのコメントを参照すると、それは完全に真実ではありません。こちらを参照してください。 https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
mattd

いいえ、git reset --hard baf8d5e3368e1cコミットを削除し、その後HEADはbaf8d5eになります。

3368e1cコミットを維持してbad8d5eコミットを削除したい場合、最も簡単な解決策は "git rebase -i HEAD~2"を実行することです(つまり、最後の2つのコミットを対話式にリベースする)。このコマンドはコミットメッセージエディタを起動し、最後の2つのコミットそれぞれに対して1行表示されます。 bad8d5e commit行を削除して保存するだけです。そしてgitはあなたの履歴を書き換え、2回目のコミットは消えます。

squasheditなど、コミットメッセージエディタで使用できる便利なコマンドは他にもあります。対話式リベースは非常に強力です。

誰かがすでにこれらのコミットを見ているのであれば、これをしないでください(リポジトリからプッシュまたはプル)。

4
knweiss
git reset --hard {ref}

リポジトリに他のコミットが1つしかない場合にコミットを取り消すには、これが唯一の方法です(例:初期コミットとあと1つ)。残りの方法(元に戻す、リベース)は、少なくともgit 1.7.5.1以降では機能しません。

git resetの後にgit gcを付けると、gitは実際にはリポジトリから古いコミットデータを完全に削除します。

1
squeegee
git checkout <treeish> -- /path/to/dir

/ path /から/ dirに与えられた“ treeish”からディレクトリを戻します。

1
lokeshpahal

リポジトリフォルダ内のHEADファイルから最後のコミットのハッシュコードを手動で編集することでこれを機能させることができました。

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

それ以前は、ローカルで行ったUNMERGE操作をOriginにプッシュすることはできませんでした。それは「いくつかの参照をプッシュするのに失敗した」とセントラルリポジトリに言い続けました。

0
Leandro M