7620

現在の状態から特定のコミットで作成されたスナップショットに戻すにはどうすればよいですか?

git logすると、次の出力が得られます。

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

11月3日からコミットに戻すにはどうすればよいですか?つまりコミットし0d1d7fcますか?

4

41 に答える 41

11269

これは、「元に戻す」の意味に大きく依存します。

一時的に別のコミットに切り替えます

一時的にそこに戻りたい場合は、だましてから現在の場所に戻ってください。必要なのは、目的のコミットを確認することだけです。

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

または、そこにいる間にコミットしたい場合は、先に進んで、そこにいる間に新しいブランチを作成します。

git checkout -b old-state 0d1d7fc32

元の場所に戻るには、もう一度行っていたブランチを確認してください。(ブランチを切り替えるときはいつものように、変更を加えた場合は、必要に応じて対処する必要があります。リセットして破棄することも、スタッシュ、チェックアウト、スタッシュポップして持ち運ぶこともできます。コミットすることもできます。そこにブランチが必要な場合は、そこにブランチします。)

未公開のコミットをハード削除する

一方、それ以降に行ったすべてのことを本当に取り除きたい場合は、2つの可能性があります。1つは、これらのコミットをまだ公開していない場合は、リセットするだけです。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

混乱した場合は、ローカルの変更をすでに破棄していますが、少なくとも再度リセットすることで、以前の状態に戻すことができます。

公開されたコミットを新しいコミットで元に戻す

一方、作品を公開した場合は、履歴を効果的に書き換えるため、ブランチをリセットしたくないでしょう。その場合、実際にコミットを元に戻すことができます。Gitの場合、元に戻すには非常に具体的な意味があります。逆パッチを使用してコミットを作成し、それをキャンセルします。このようにして、履歴を書き換えることはありません。

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash):
git revert 0d1d7fc..a867b4a

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revertマンページは、実際にはその説明でこれの多くをカバーしています。もう1つの便利なリンクは、git-revertについて説明しているこのgit-scm.comセクションです。

結局元に戻したくないと判断した場合は、元に戻すか(ここで説明)、元に戻す前にリセットすることができます(前のセクションを参照)。

この場合、この回答が役立つこともあります
。HEADを前の場所に戻すにはどうすればよいですか。(切り離された頭)&元にコミットコミット

于 2010-11-06T17:04:54.543 に答える
2841

ここには複雑で危険な答えがたくさんありますが、実際には簡単です。

git revert --no-commit 0766c053..HEAD
git commit

これにより、すべてがHEADからコミットハッシュに戻されます。つまり、すべてのコミットがウォークバックされた後のように、作業ツリーにそのコミット状態が再作成0766c053されます。次に、現在のツリーをコミットできます。これにより、「元に戻した」コミットと本質的に同等の新しいコミットが作成されます。

--no-commitフラグを使用すると、gitはすべてのコミットを一度に元に戻すことができます。そうしないと、範囲内のコミットごとにメッセージの入力を求められ、不要な新しいコミットが履歴に散らばってしまいます。)

これは、以前の状態にロールバックするための安全で簡単な方法です。履歴は破棄されないため、すでに公開されているコミットに使用できます。

于 2014-02-12T04:18:01.250 に答える
1813

ローグコーダー?

自分で作業して、それを機能させたいだけですか?以下のこれらの指示に従ってください、彼らは私と他の多くの人のために何年もの間確実に働いてきました。

他の人と一緒に働いていますか?Gitは複雑です。何か発疹を起こす前に、この回答の下にあるコメントを読んでください。

作業コピーを最新のコミットに戻す

変更を無視して、前のコミットに戻すには:

git reset --hard HEAD

ここで、HEADは現在のブランチの最後のコミットです

作業コピーを古いコミットに戻す

最新のコミットよりも古いコミットに戻すには:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

クレジットは同様のStackOverflowの質問に送られます、GitのSHAハッシュによるコミットに戻しますか?

于 2012-08-21T06:19:52.847 に答える
270

私とおそらく他の人にとって最良のオプションは、Gitリセットオプションです:

git reset --hard <commidId> && git clean -f

これは私にとって最良の選択肢でした!シンプル、高速、効果的です!


**注:**コメントで述べたように、古いコミットのコピーを持っている他の人とブランチを共有している場合は、これを行わないでください

また、コメントから、より少ない「ballzy」メソッドが必要な場合は、使用できます

git clean -i
于 2013-10-22T11:53:42.647 に答える
252

答える前に、これが何であるかを説明するいくつかの背景を追加しましょうHEAD

まず、HEADとは何ですか?

HEAD単に現在のブランチの現在のコミット(最新)への参照です。常に1つしか存在できませんHEAD(を除くgit worktree)。

のコンテンツHEADは内部.git/HEADに保存され、現在のコミットの40バイトのSHA-1ハッシュが含まれています。


detached HEAD

最新のコミットを行っていない場合、つまりHEAD、履歴内の以前のコミットを指している場合は、と呼ばれdetached HEADます。

デタッチドHEADの概念を示す図

コマンドラインでは、次のようになります-HEADは現在のブランチの先端を指していないため、ブランチ名の代わりにSHA-1ハッシュ:

ターミナルでgitcheckoutHEAD^0を実行する


切り離されたHEADから回復する方法に関するいくつかのオプション:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

これにより、目的のコミットを指す新しいブランチがチェックアウトされます。このコマンドは、特定のコミットにチェックアウトします。

この時点で、ブランチを作成し、この時点から作業を開始できます。

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

いつでも使用できreflogます。git reflog を更新した変更が表示さHEADれ、目的のreflogエントリをチェックアウトすると、HEADこのコミットに戻ります。

HEADが変更されるたびに、reflog

git reflog
git checkout HEAD@{...}

これにより、目的のコミットに戻ることができます。

ターミナルでgitreflogを実行する


git reset HEAD --hard <commit_id>

HEAD目的のコミットに「移動」します。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • 注:( Git2.7以降)も使用できますgit rebase --no-autostash

このスキーマは、どのコマンドが何を実行するかを示しています。ご覧のとおり、をreset && checkout変更しHEADます。

ステージングエリアとHEADのチェックアウトを示す図

于 2015-02-05T21:56:02.153 に答える
188

これは、次の2つのコマンドで実行できます。

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

以前のGitコミットが削除されます。

変更を保持したい場合は、次を使用することもできます。

git reset --soft [previous Commit SHA id here]

次に、変更を保存します。

于 2014-12-12T06:52:36.460 に答える
180

「コミット解除」し、最後のコミットメッセージを消去して、変更したファイルをステージングに戻す場合は、次のコマンドを使用します。

git reset --soft HEAD~1
  • --soft--hardコミットされていないファイルは、それらを破棄するのではなく、作業ファイルとして保持する必要があることを示します。
  • HEAD~1最後のコミットです。3つのコミットをロールバックする場合は、を使用できますHEAD~3。特定のリビジョン番号にロールバックする場合は、SHAハッシュを使用してロールバックすることもできます。

これは、間違ったことをコミットし、最後のコミットを元に戻したい場合に非常に便利なコマンドです。

ソース: http: //nakkaya.com/2009/09/24/git-delete-last-commit/

于 2014-03-04T17:25:52.093 に答える
126

最良の方法は次のとおりです。

git reset --hard <commidId> && git push --force

これにより、ブランチが特定のコミットにリセットされ、ローカルの場合と同じコミットでリモートサーバーがアップロードされます。

--forceフラグを使用すると、選択したコミットの後に後続のすべてのコミットが削除され、それらを回復するオプションがないため、フラグに注意してください。

于 2020-02-25T17:00:01.137 に答える
118

私はGitでローカルの変更を元に戻すために多くの方法を試しましたが、最新のコミット状態に戻すだけの場合は、これが最も効果的であるようです。

git add . && git checkout master -f

簡単な説明:

  • コミットは作成されgit revertません。
  • それはあなたの頭を切り離すことはありませんgit checkout <commithashcode>
  • これにより、すべてのローカル変更が上書きされ、ブランチでの最後のコミット以降に追加されたすべてのファイルが削除されます。
  • ブランチ名でのみ機能するため、この方法でブランチの最新のコミットにのみ戻すことができます。

上記の結果を達成するためのはるかに便利で簡単な方法を見つけました。

git add . && git reset --hard HEAD

ここで、HEADは現在のブランチでの最新のコミットを指します。

これはboulder_rubyが提案したものと同じコードコードですが、最後のコミット以降に作成されたすべての新しいファイルを消去するためgit add .に前 に追加しました。これは、ほとんどの人が最新のコミットに戻るときに信じていることだからです。git reset --hard HEAD

于 2012-07-29T11:01:03.643 に答える
102

OK、 Gitで前のコミットに戻るのはとても簡単です...

変更を保持せずに元に戻します。

git reset --hard <commit>

変更を保持したまま元に戻します。

git reset --soft <commit>

説明:を使用git resetすると、特定の状態にリセットできます。上記のように、コミットハッシュで使用するのが一般的です。

ただし、違いは2つのフラグを使用すること--soft--hard、デフォルトではフラグをgit reset使用することです--softが、常にフラグを使用することをお勧めします。各フラグについて説明します。


- 柔らかい

説明されているデフォルトのフラグは、提供する必要はなく、作業ツリーを変更しませんが、コミットの準備ができているすべての変更されたファイルを追加するため、ファイルへの変更がステージングされないコミットステータスに戻ります。


- 難しい

このフラグに注意してください。作業ツリーと追跡ファイルへのすべての変更がリセットされ、すべてがなくなります。


また、Gitを使用した実際の生活で発生する可能性のある以下の画像を作成しました。

Gitをコミットにリセット

于 2017-07-20T15:55:53.507 に答える
80

マスターとそのそれぞれのブランチについて話していると仮定します(つまり、これはあなたが関わっている任意の作業ブランチである可能性があります):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

ブログ投稿で答えを見つけました(現在は存在しません)

これはリモートへの変更のリセットと強制であることに注意してください。これにより、チームの他のメンバーがすでにgitをプルしている場合、問題が発生します。あなたは変更履歴を破壊しています。これは、人々がそもそもgitを使用する重要な理由です。

リセットするよりも、元に戻す(他の回答を参照)を使用することをお勧めします。あなたが一人のチームなら、それはおそらく問題ではありません。

于 2016-05-10T17:21:43.087 に答える
66

Jefromiのソリューションの追加の代替案

Jefromiのソリューションは間違いなく最高のものであり、間違いなくそれらを使用する必要があります。ただし、完全を期すために、コミットを元に戻すためにも使用できるこれらの他の代替ソリューションも示したいと思いました(以前のコミットの変更を元に戻す新しいコミットを作成するgit revertという意味で)。

明確にするために、これらの代替手段はコミットを元に戻すための最良の方法ではありません。Jefromiのソリューションはですが、これらの他の方法を使用してと同じことを達成することもできることを指摘したいと思いますgit revert

代替案1:ハードリセットとソフトリセット

これは、 GitのSHAハッシュによるコミットに戻すためのCharles Baileyのソリューションのごくわずかに変更されたバージョンですか?:

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

これは基本的に、ソフトリセットがインデックス/ステージング領域でステージングされた前のコミットの状態を残し、それをコミットできるという事実を使用して機能します。

代替案2:現在のツリーを削除し、新しいツリーに置き換えます

このソリューションは、古いコミットをチェックアウトして新しいコミットにするsvickのソリューションから来ています。

git rm -r .
git checkout <commit> .
git commit

代替案#1と同様に、これ<commit>は現在の作業コピーの状態を再現します。以降に追加されたファイルは削除されないgit rmため、最初に行う必要があります。git checkout<commit>

于 2014-06-29T17:51:16.937 に答える
65

~/commits-to-revert.txt(私git log --pretty=onelineはそれらを取得するために使用した)という名前のテキストファイルに次のコミットがあるとします

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Bashシェルスクリプトを作成して、それぞれを元に戻します。

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

これにより、ファイルとディレクトリの作成、削除など、すべてが以前の状態に戻り、ブランチにコミットされ、履歴が保持されますが、同じファイル構造に戻されます。Gitにがない理由git revert --to <hash>は私を超えています。

于 2011-10-13T21:51:36.150 に答える
61

これは、前のコミットに戻る(そして、コミットされていない状態にして、好きなように処理する)ためのはるかに簡単な方法です。

git reset HEAD~1

したがって、コミットIDなどは必要ありません:)

于 2016-02-29T08:40:30.403 に答える
53

これらの最初の手順をすべて自分で完了して、Gitリポジトリにプッシュバックできます。

  1. コマンドを使用して、Bitbucketからリポジトリの最新バージョンをプルしますgit pull --all

  2. ターミナルからでGitlogコマンドを実行し-n 4ます。後の-n数は、ローカル履歴の最新のコミットから始まるログ内のコミットの数を決定します。

    $ git log -n 4
    
  3. git reset --hard HEAD~Nここで、Nはヘッドを取り戻したいコミットの数であり、リポジトリの履歴のヘッドをリセットします。次の例では、ヘッドは1つのコミットを、リポジトリ履歴の最後のコミットに戻します。

  4. を使用して変更をGitリポジトリにプッシュし、変更git push --forceを強制的にプッシュします。

Gitリポジトリを前のコミットにしたい場合:-

git pull --all
git reset --hard HEAD~1
git push --force
于 2017-04-06T12:20:25.253 に答える
51

注意!ユーザーが誤って間違ったコミットを行った場合、このコマンドによってコミット履歴が失われる可能性があります。少し安全であるよりも、間違いを犯した場合に備えて、他の場所にgitの追加のバックアップを常に用意してください。:)

同様の問題が発生し、以前のコミットに戻したいと思いました。私の場合、新しいコミットを維持することに興味がなかったので、を使用しHardました。

これは私がそれをした方法です:

git reset --hard CommitId && git clean -f

これはローカルリポジトリに戻り、使用後git push -fにリモートリポジトリを更新します。

git push -f

たとえばenforce non-group manage policies、次の画像の名前のコミットを完全に無視したい場合

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

あなたが実行します

git reset --hard dd52eb9 && git clean -f

に続く

git push -f

enforce non-group manage policiesその後、そのコミット( )は表示されません

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

于 2018-01-08T14:15:56.717 に答える
41

すべての変更後、これらすべてのコマンドをプッシュするときは、次を使用する必要がある場合があります。

git push -f ...

そしてだけではありませんgit push

于 2013-09-05T14:03:19.297 に答える
39

特に古いコミットを元に戻してステージングするためのコマンド(コアGitの一部ではありませんが、git-extrasパッケージに含まれています)があります。

git back

マニュアルページによると、次のように使用することもできます。

# Remove the latest three commits
git back 3
于 2013-08-08T18:30:12.267 に答える
32

目的のコミットにリセットしてみてください。

git reset <COMMIT_ID>

使用を確認するにCOMMIT_IDは:

git log

これにより、変更されたすべてのファイルが未追加の状態にリセットされます。

これcheckoutで、追加されていないすべてのファイルを

git checkout .

変更を確認するには、次を使用します。

git log

アップデート

リポジトリに1つだけコミットしている場合は、試してください

git update-ref -d HEAD
于 2017-05-06T23:03:03.577 に答える
31

必要なコミットを選択し、それを確認してください

git show HEAD
git show HEAD~1
git show HEAD~2 

必要なコミットを取得するまで。HEADがそれを指すようにするには、

git reset --hard HEAD~1

またはgit reset --hard HEAD~2または何でも。

于 2014-02-26T12:52:41.107 に答える
31

Revertは、コミットをロールバックするコマンドです。

git revert <commit1> <commit2> 

サンプル:

git revert 2h3h23233

以下のようにHEADからレンジをとることができます。ここで1は「最後のコミットを元に戻す」と言います。

git revert HEAD~1..HEAD

そして、次のことを行います。

git push
于 2015-08-20T14:45:11.710 に答える
30

状況が緊急であり、プロジェクトがたとえば「myproject」というディレクトリの下にあると仮定して、質問者が尋ねたことをすばやく汚い方法で実行したい場合は、次のようにします。


クイックアンドダーティ:状況によっては、クイックアンドダーティは実際には非常に良い場合があります。ここでの私の解決策は、作業ディレクトリにあるファイルを、非常に巧妙で悪魔のように強力なgitコマンドを使用して.git/ディレクトリの下に潜んでいるgitリポジトリの深さから引き上げられた/抽出されたファイルに不可逆的に置き換えることではありません。たくさんの。悲惨な状況に見えるかもしれないものを回復するためにそのような深海ダイビングをする必要はありません、そして十分な専門知識なしでそうしようとすると致命的であるとわかるかもしれません


  1. ディレクトリ全体をコピーして、「myproject--copy」のように別の名前を付けます。gitリポジトリ(「repo」)ファイルが「myproject」ディレクトリ(デフォルトの場所、「。git」というディレクトリの下)にあるとすると、作業ファイルとリポジトリファイルの両方がコピーされます。

  2. ディレクトリ「myproject」でこれを行います。

     .../my project $ git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

これにより、「myproject」の下のリポジトリの状態がコミットしたときの状態に戻ります(「commit」は作業ファイルのスナップショットを意味します)。reset「 ted」コミット以降のすべてのコミットは「 myproject」で永久に失われますが、リポジトリ内のファイルを含むすべてのファイルをコピーしたため、「myproject--copy」の下のリポジトリに引き続き存在します。 、.../。git/の下。

次に、システムに2つのバージョンがあります...前のコミットから、関心のあるファイルなどを調べたり、コピーしたり、変更したりできます。復元されたコミットがどこにも行かなかったために新しい作業を決定した場合は、「myproject--copy」の下のファイルを完全に破棄できます...

この取得されたコミットが実際に作業を破棄せずにプロジェクトの状態を継続したい場合は、ディレクトリの名前を再度変更することです。取得されたコミットを含むプロジェクトを削除し(または一時的な名前を付け)、「 myproject-「コピー」ディレクトリを「myproject」に戻します。次に、ここで他の回答のいくつかを理解してみてください。おそらく、かなり早く別のコミットを実行してください。

Gitは素晴らしい作品ですが、「その場で拾う」ことは絶対にできません。また、Gitを説明しようとする人は、他のVCS [バージョン管理システム]の予備知識を前提として、深く掘り下げすぎています早すぎて、「チェックアウト」に互換性のある用語を使用するなど、他のひどい犯罪を犯します。これは、初心者を混乱させるように計算されているように見えることもあります。

ストレスを解消するために、私の傷跡から学びましょう。Gitに関する本を読む必要があります-THEBOOK、Pro Git 2nd edition : gitcentralから無料でダウンロードできるなどを読むことをお勧めします。2014年に公開されましたが、2022年初頭の時点で、依然として最高です。後でではなく早く実行する:Gitはこれからあなたの人生の一部になる運命にあります。そうした場合、 Gitの複雑さの多くは、分岐してから再マージすることに起因することに注意してください。ProGitの本は、実際にはこの中心的な側面を非常に穏やかに紹介していますが、最初に読んだ本では、これらの部分をスキップできます。あなたの質問から、人々があなたを科学で盲目にするべき理由はありません

特に、たとえば、これが絶望的な状況であり、Gitの初心者である場合は特にそうです。

PS :(少し注意してください)もう1つの考え:Gitリポジトリを作業ファイルがあるディレクトリ以外のディレクトリに保持することは(今では)実際には非常に簡単です。これは、上記の迅速で汚いソリューションを使用してGitリポジトリ全体をコピーしないことを意味します。--separate-git-dir ここを使用してフライヤーによる回答を参照してください。このことを念頭に置いて、注意してください。コピーしない「separate-directory」リポジトリがあり、ハードリセットを実行すると、リセットコミット後のすべてのバージョンは、持っていない限り、永久に永久に失われます。絶対に必要なことですが、定期的にリポジトリをバックアップします。できれば、他の場所の中でも特にクラウド( Googleドライブなど)にバックアップします。

「クラウドへのバックアップ」というこのテーマについて、次のステップは、GitHubまたは(私の見解では)GitLabで(もちろん無料で)アカウントを開くことです。その後、定期的にgit pushコマンドを実行して、クラウドリポジトリを「適切に」最新の状態にすることができます。しかし、繰り返しになりますが、これについて話すのは時期尚早かもしれません。git push構成する必要があり、完全に不可解な技術的理由で機能しない可能性があり、リモートリポジトリ(「オリジン」など)について学習する必要があります。そのため、知識が身に付くまでは、迅速で汚いクラウドベースのバックアップアプローチが望ましい場合があります。繰り返しになりますが、Pro Gitの本では、リモートリポジトリがどのように機能し、ローカルリポジトリに関連しているかを非常に穏やかかつ合理的に紹介しています。

于 2015-03-19T17:33:31.133 に答える
30

最新のコミットに戻り、すべてのローカル変更を無視します。

git reset --hard HEAD
于 2016-07-26T13:13:55.780 に答える
23

これは、最近のコミットに直接リセットするもう1つの方法です。

git stash
git stash clear

最後のコミット以降に行ったすべての変更を直接クリアします。

PS:少し問題があります。また、最近保存したスタッシュの変更をすべて削除します。ほとんどの場合、これは問題ではないと思います。

于 2016-05-05T11:43:08.367 に答える
22

偶発的な変更からコーダーのディレクトリを完全にクリーンアップするために、次を使用しました。

git add -A .
git reset --hard HEAD

変更を削除するだけgit reset --hard HEADですが、「新しい」ファイルは削除されません。彼らの場合、彼らは誤って重要なフォルダをランダムな場所にドラッグし、それらのファイルはすべてGitによって新しいものとして扱われていたため、reset --hard修正されませんでした。事前に実行することgit add -A .で、それらすべてをgitで明示的に追跡し、リセットによって消去されます。

于 2015-10-11T00:10:36.880 に答える
21

マスターで行ったコミット済みの変更をロールバックする方法を知りたいと思う人もいると思います。つまり、すべてを破棄して元の/マスターに戻る場合は、次のようにします。

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

于 2015-02-05T01:28:42.440 に答える
21

前のコミットからHEADへの変更を保持し、前のコミットに移動するには、次のようにします。

git reset <SHA>

HEADへの前回のコミットからの変更が不要で、すべての変更を破棄する場合は、次のようにします。

git reset --hard <SHA>
于 2015-07-28T08:35:40.137 に答える
21

アイデア:基本的に、現在の作業ツリーの状態を前のコミットの状態に置き換えてから、それからコミットを作成する必要があります。無視されたファイルは変更しないのが最善です。方法は次のとおりです。

  1. 作業ツリーを空にします*。

     git rm -r --cached . && git clean -f -d
    
  2. 作業ツリーを希望の状態にします**。

     git checkout 0d1d7fc3 .
    
  3. 復帰コミットを作成します。

     git add --all && git commit -m "revert to 0d1d7fc3"
    

最初はYarinsの答えが最適だと思いましたが、マージコミットでは機能しません。このソリューションはそうです。

さらに、履歴から何も(プッシュまたはプッシュされて)削除されません。これは、元に戻したい状態を表す1つのクリーンなコミットを生成します。


*追跡されていないが無視されていないファイル(.gitignoreで指定されているファイル)を作業ツリーから削除する。保持したい無視されたファイルを除いて、作業ツリーは空です(の特定-xのオプションでない場合clean

**パスが指定されている場合(ここで.は:)、チェックアウトはHEADをそのままにします。

于 2019-11-10T10:10:02.463 に答える
14

コミットはリモートでプッシュされるため、削除する必要があります。あなたのブランチが開発されており、それがオリジンにプッシュされていると仮定しましょう。

最初に、開発元の場所から削除する必要があります。

git push origin :develop (note the colon)

次に、必要なステータスに開発する必要があります。コミットハッシュがEFGHIJKであると仮定します。

git reset --hard EFGHIJK

最後に、開発を再度プッシュします。

git push origin develop
于 2017-03-20T07:33:12.510 に答える
13

ロールバック(または元に戻す)の場合:

1. git revert --no-commit "commit-code-to-remove" HEAD
(e.g. git revert --no-commit d57a39d HEAD)
2. git commit
3. git push

上記の2つの手順を試してみてください。これが目的であることがわかった場合は、git push

何か問題を見つけた場合は、次のようにしてください。

git revert --abort
于 2016-11-01T14:29:37.773 に答える
12

最後のコミットでエラーを修正したい場合は、gitcommit--amendコマンドを使用することをお勧めします。最後のコミットが参照によって示されていない場合、最後のコミットと同じ親でコミットを作成するため、これでうまくいきます。最後のコミットへの参照がない場合、それは単に破棄され、このコミットが最後のコミットになります。これは、コミットを元に戻さずにコミットを修正するための良い方法です。ただし、独自の制限があります。

于 2015-07-01T11:35:54.610 に答える
12

GitKrakenでは、次のことができます。

  1. リセットするコミットを右クリックして、次を選択します。このコミットにリセット/ハード

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

  2. コミットをもう一度右クリックして、次を選択します。現在のブランチ名/プッシュ

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

  3. フォースプッシュをクリックします。

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

Obs。:ハードリセット後のコミット履歴はすべて失われ、このアクションは元に戻せないため、注意が必要です。あなたは自分が何をしているのかを確認する必要があります。

于 2018-05-02T18:41:36.523 に答える
11

まず、ある日付のコミットを識別する文字列を取得します。

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

コミット識別子を出力し、文字列(たとえば、XXXX)を取得して、次のことを行います。

git checkout XXXX
于 2017-05-05T14:39:47.420 に答える
9

さらに別の最も簡単な解決策。これを行うにはブランチを変更する必要がありますが、その後は次のコマンドを実行できます。

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
于 2015-12-04T15:27:52.573 に答える
9

Sourcetreeを使用すると、はるかに簡単に実行できます。探しているコミットを右クリックして、メニューから[チェックアウト]を選択します。

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

于 2017-05-26T11:18:48.720 に答える
8

なんらかの理由で手動で元に戻すことができなかったので、これが私がそれをやった方法です。

  1. 欲しいブランチをチェックしてコピーしました。
  2. 最新のブランチをチェックしました。
  3. 必要なブランチのコンテンツを最新のブランチのディレクトリにコピーして、変更を上書きしてコミットしました。
于 2015-02-23T17:20:33.807 に答える
8
git reflog

git reflogのHEADの数を選択します。ここで、元に戻して実行します(この例では、12を選択します)。

git reset HEAD@{12} --hard
于 2016-09-28T02:53:26.287 に答える
7

一時的に変更を元に戻したい場合

  • 誰かがビルドを壊している、またはあなたが取り組んでいる機能を壊しているコードをコミットしました

を使用して最後に機能するコミットを検索してgit logから、以下を実行できます。

git rebase --onto <commitId>

リモートブランチが再び機能しているときは、次のことができます

git pull --rebase

この方法はgit checkout、切り離された状態ではないため、一時的な変更よりも優れています。

于 2017-11-10T20:07:36.730 に答える
7

履歴を変更できない特定のコミットにブランチを戻すために私が見つけた最も簡単な方法は、次のとおりです。

  1. コミットを確認するか、元に戻したいブランチを分岐します。
  2. .git / HEADを編集し、参照を元に戻すブランチに変更します。

そのような:

echo 'ref: refs/heads/example' > .git/HEAD

その後git status、実行すると、現在のブランチと元に戻したいブランチの間のすべての変更が表示されます。

すべてが良さそうな場合は、コミットできます。git diff revert..exampleを使用して、同じであることを確認することもできます。

于 2017-12-07T16:01:40.300 に答える
6

段階的な変更とコミットのリセット

このgit resetコマンドを使用すると、リポジトリのHEAD(作業ツリーが指す最新のコミット)を変更できます。ステージング領域またはステージング領域と作業ツリーのいずれかを変更します。

希望どおりにコミットを作成するGitの機能は、ステージングした変更への変更を元に戻す必要がある場合があることを意味しますgit add。を呼び出すことでそれを行うことができますgit reset HEAD <file to change>

変更を完全に取り除くには、2つのオプションがあります。git checkout HEAD <file(s) or path(s)>ステージング領域と作業ツリーへの変更を元に戻す簡単な方法です。ただし、このコマンドは作業ツリーへのすべての変更を削除するため、注意してください。

これらの変更はコミットされたことがないため、Gitはそれらの変更について知りません。このコマンドを実行すると、これらの変更を元に戻す方法はありません。

自由に使えるもう1つのコマンドはですgit reset --hard。作業ツリーも同様に破壊的です。コミットされていない変更や段階的な変更は、実行後に失われます。HEADを実行git reset -hardすると、と同じことが行われgit checkout HEADます。動作するのにファイルやパスは必要ありません。

--softで使用できますgit reset。指定したコミットにリポジトリをリセットし、それらすべての変更をステージングします。すでにステージングした変更は影響を受けません。また、作業ツリーの変更も影響を受けません。

最後に、を使用--mixed して、変更をステージングせずに作業ツリーをリセットできます。これにより、ステージングされた変更もステージング解除されます。

コミットを元に戻す

時々私たちは間違いを犯します。共有されるはずのないコミットがパブリックリポジトリにプッシュされるか、コミットに修正できないバグがあり、元に戻す必要があるか、あるいはそのコードが不要になった可能性があります。

これらの場合はすべて。を必要としgit revertます。このgit revertコマンドは、期待どおりの動作をします。履歴に逆コミットを適用することにより、単一のコミットを元に戻します。

変更を完全に元に戻すには、いくつかのコミットを元に戻す必要がある場合があります。を使用する-no-commitか、を使用-nしてGitに復帰を実行するように指示できますが、変更をコミットする前に停止します。

これにより、すべての元に戻すコミットを1つのコミットにまとめることができます。これは、複数のコミットにまたがる機能を元に戻す必要がある場合に便利です。コミットを逆の順序で元に戻すようにしてください。最新のコミットが最初になります。

そうしないと、まだ存在していないコードを元に戻そうとしてGitを混乱させる可能性があります。

于 2019-01-29T10:01:16.380 に答える
1

最後のコミットを削除することを提供する多くの答えがあります。ただし、ここでは特定のコミットを削除する方法を尋ねられます。この場合、最後の3つのコミットを削除して、11月3日にコミットに戻ります。

これはリベースで行うことができます。単に行う:

git rebase -i HEAD~4

これにより、最後の4つのコミットが一覧表示されます。

これで、コミットを削除するオプションがあります。あなたはdropテキストでそれをします。

  • iキーボードを押すだけで、コミットの横dropにデフォルトではなく書き込みを削除しますpick

  • キーボードで、を押しexit:wq

コミットが確実に削除されるようにするには、次のように記述します。

git log

ドロップとして保存したコミットが削除されていることがわかります。

これらの変更をリモートブランチにプッシュするには、次のように記述します。

git push --force
于 2020-01-07T00:35:03.403 に答える