web-dev-qa-db-ja.com

Gitリポジトリを以前のコミットに戻す方法

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

git logを実行すると、次のような出力が得られます。

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

どうすれば11月3日からのコミット、すなわち0d1d7fcへのコミットを戻すことができますか?

6795
Crazy Serb

これは、「元に戻す」という意味によって大きく異なります。

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

あなたが一時的にそれに戻りたいなら、ばかにして、そしてあなたがいるところに戻ってきなさい、あなたがしなければならないすべてはあなたがしたいコミットをチェックアウトすることです:

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

あるいは、あなたがそこにいる間にコミットしたい場合は、先に行き、そこにいる間に新しいブランチを作ってください。

git checkout -b old-state 0d1d7fc32

あなたがいた場所に戻るには、あなたが再びいたブランチをチェックしてください。 (ブランチを切り替えるときにいつものように変更を加えた場合は、必要に応じてそれらに対処する必要があります。それらを捨てるためにリセットすることができます。分岐が必要な場合は、そこに分岐します。)

未発行のコミットを完全削除

一方で、それ以降に行ったことすべてを本当に取り除きたいのであれば、2つの可能性があります。あなたがこれらのコミットのいずれも発行していないのであれば、単にリセットしてください。

# 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では、revertは非常に特別な意味を持ちます。取り消すためにリバースパッチでコミットを作成します。こうすれば歴史を書き換えない。

# 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:
git revert a867b4af..0766c053 

# 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のマンページ は、実際にはその説明の中でこれの多くをカバーしています。もう一つの役に立つリンクは このgit-scm.comセクションでgit-revertについて議論している です。

結局元に戻すことを望まないと決心した場合は、(ここで説明するように)元に戻すか、元に戻す前に戻すことができます(前のセクションを参照)。

この場合、この回答も参考になります。
HEADを以前の場所に戻すにはどうすればよいですか? (独立した頭)

8690
Cascabel

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

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

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

クレジットは、同様のスタックオーバーフローの質問、GitではSHAハッシュによるコミットに戻りますか?に行きます。

1451
boulder_ruby

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

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

これはHEADからコミットハッシュにすべてを戻します。つまり、ワーキングツリーでそのコミット状態を再作成しますまるでウォークバックされてからのすべてのコミットのように)。そして、それは本質的にあなたが「元に戻す」コミットと同等のまったく新しいコミットを作成します。

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

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

1433
Yarin

私にとってそしておそらく他の人にとっての最良の選択肢はGit resetオプションです:

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

これは私にとって最良の選択でした!それは簡単で、速くそして効果的です!


注: コメントに記載されているように、古いコミットのコピーを持っている他の人とあなたのブランチを共有しているならこれをしないでください

また、コメントから、あなたがもっと 'ぎこちない'メソッドを望むなら、あなたは使うことができる

git clean -i

182
Pogrindis

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

First of all what is HEAD?

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

HEADの内容は.git/HEAD内に格納されており、現在のコミットの40バイトのSHA-1が含まれています。


detached HEAD

もしあなたが最新のコミットをしていなければ - これはHEADが過去のコミットを指していることを意味しますdetached HEAD.

Enter image description here

HEADは現在のブランチの先端を指していないため、コマンドラインではブランチ名の代わりにSHA-1となります。

Enter image description here


切り離された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 reflogHEADを更新した変更を表示し、目的のreflogエントリをチェックアウトするとHEADがこのコミットに戻ります。

HEADが変更されるたびにreflogに新しいエントリがあります

git reflog
git checkout HEAD@{...}

これであなたはあなたの望むコミットに戻るでしょう

Enter image description here


git reset HEAD --hard <commit_id>

頭を目的のコミットに "移動"します。

# 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 2.7以降 )からgit rebase --no-autostashも使用できます。

このスキーマは、どのコマンドが何をするのかを示しています。ご覧のとおり、reset && checkoutHEADを修正しています。

Enter image description here

143
CodeWizard

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

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

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

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

124

私はGitでのローカルな変更を元に戻すために多くの方法を試してみました、そしてあなたが最新のコミット状態に戻したいだけならこれが最もうまくいくようです。

git add . && git checkout master -f

簡単な説明:

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

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

git add . && git reset --hard HEAD

ここでHEADはあなたの現在のブランチにおける最新のコミットを指しています。

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

105
Roman Minenok

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

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

以前のGitコミットを削除します。

変更を保存したい場合は、次のものも使用できます。

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

それからそれはあなたの変更を保存します。

94
kiran boghra

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

元に戻す保持しない変更:

git reset --hard <commit>

元に戻すwith keep変更:

git reset --soft <commit>

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

しかし、違いは、--soft--hardの2つのフラグを使用することであることがわかります。デフォルトではgit reset--softフラグを使用しますが、常にフラグを使用することをお勧めします。


- 柔らかい

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


- ハード

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


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

git reset to a commit

68
Alireza

この正確な組み合わせを除いて、ここでは何もうまくいきませんでした。

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

ここで重要なのはプッシュを強制すること、追加のコミット/コミットメッセージなどはないことです。

59
serdarsenay

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

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

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

#!/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>を持っていないのかは私を超えています。

57

Jefromiのソリューションの代替品

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

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

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

これは、Charles Baileyによる GitのSHAハッシュによるコミットに戻す? :の非常にわずかに修正されたバージョンです。

# 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 rmgit checkout以降に追加されたファイルを削除しないため、最初に<commit>を実行する必要があります。

56
user456814

あなたがmasterとそのそれぞれのブランチについて話していると仮定します(それはこれがあなたが関係しているどんな働くブランチでもあるかもしれません):

# 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 pullしている場合、あなたは彼らに問題を起こすでしょう。あなたは変更履歴を破壊しています。それは人々がそもそもgitを使う重要な理由です。

リセットよりも復帰(他の回答を参照)を使用する方が適切です。あなたが一人の男のチームであれば、それはおそらく問題ではありません。

55
markreyes

これは以前のコミットに戻るための はるかに単純な の方法です(そしてそれを未コミット状態にして、好きなようにそれを行います):

git reset HEAD~1

そのため、コミットIDなどは必要ありません。

51
Paul Walczewski

すべての変更を終えたら、これらのすべてのコマンドをプッシュするときに、次のものを使用する必要があります。

git Push -f ...

git Pushだけではありません。

34
sivi

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

git back

manページ によると、このように使うこともできます。

# Remove the latest three commits
git back 3
33
Shadow Man

あなたは自分自身でこれらすべての初期ステップを完了し、git repoに戻ることができます。

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

  2. 端末から-n 4を指定してgit logコマンドを実行します。 -nの後の数字は、ローカル履歴の最新のコミットから始まるログ内のコミットの数を決定します。

    $ git log -n 4

  3. git reset --hard HEAD~Nを使用してリポジトリの履歴の先頭をリセットします。ここでNは、先頭に戻したいコミットの数です。次の例では、ヘッドはリポジトリ履歴の最後のコミットまで1コミット後退します。

  4. git Push --forceを使用してgit repoへの変更をプッシュし、強制的に変更をプッシュします。

リポジトリを以前のコミットにgitしたい場合

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

最近の commitに戻り、すべてのローカルの変更を無視します。

git reset --hard HEAD

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

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

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

git reset --hard HEAD~1

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

26
tonythomas01

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

git stash
git stash clear

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

シモンズ:それは少し問題があります。また、最近保存したstashの変更をすべて削除します。ほとんどの場合、どちらを選んでも構いません。

20
Point Networks

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

git reset <SHA>

前回のコミットからHEADへの変更が不要な場合は、すべての変更を破棄してください。

git reset --hard <SHA>
20
Vishnu Atrai

偶然の変更からコーダのディレクトリを完全にきれいにするために、我々は使用しました:

git add -A .
git reset --hard HEAD

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

20
Chris Moschini

自分のマスターで行ったコミット済みの変更をロールバックする方法を知りたいと思う人がいるかもしれません。つまり、すべてを捨ててOrigin/masterに戻る場合は、次のようにします。

git reset --hard Origin/master

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

19
nevster

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

git revert <commit1> <commit2> 

サンプル:

git revert 2h3h23233

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

git revert HEAD~1..HEAD

そしてgit Pushを実行します

16

最新のコミットを元に戻す:

git reset --hard HEAD

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

以前のコミットに戻す:古いバージョンを復元する最も早い方法はresetコマンドを使用することです。

# Resets index to former commit
git reset 56e05fced 

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

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

これはあなたのHEADブランチを指定されたバージョンに巻き戻します。このバージョン以降に行われたコミットはすべて事実上元に戻されます。あなたのプロジェクトは、その時点でのものとまったく同じです。

Resetコマンドにはいくつかのオプションがありますが、最も興味深いものの1つは--softフラグです。 --hardの代わりにそれを使用すると、Gitはそれらの「元に戻す」コミットのすべての変更をローカルの変更として保持します。

新しいローカルブランチでリビジョンを復元する

すでに述べたように、HEADブランチでresetコマンドを使用するのは非常に劇的なアクションです。指定したリビジョン以降に発生したコミットを(このブランチで)削除します。これがあなたが望むものであると確信しているのであれば、すべて問題ありません。

ただし、現在のHEADブランチをそのまま残しておきたい場合は、 より安全な の方法もあります。 "ブランチ"はGitではとても安くて簡単なので、その古いリビジョンから始まる新しいブランチを簡単に作成できます。

git checkout -b old-project-state 0ad5a7a6

通常、checkoutコマンドは単に分岐を切り替えるために使用されます。ただし、-bパラメータを指定すると、新しいブランチ(この例では old-project-state という名前)を作成することもできます。現在のHEADリビジョンから開始したくない場合は、コミットハッシュ(元のプロジェクトリビジョン)も指定する必要があります。

old-project-state という名前の新しいブランチが、プロジェクトの古いバージョンを反映しています。他のコミットやブランチに触れたり、削除することもありません。

16
Lyes CHIOUKH

状況が緊急事態であり、質問者が迅速かつ汚れた質問をしたい場合方法、プロジェクトがディレクトリ「my project」の下にあると仮定します。

  1. ディレクトリ全体をコピーして、「my project-copy」などの別の名前を付けます。

  2. 行う:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

その後、システムに2つのバージョンがあります...対象のファイル、または以前のコミットからのものを調べたり、コピーしたり、変更したりできます。新しい作業がどこにも行かないと判断した場合、「私のプロジェクト-コピー」の下のファイルを完全に破棄できます...

この取得されたコミットのために実際に作業を破棄せずにプロジェクトの状態を継続したい場合、ディレクトリの名前を再度変更することは明らかです:取得したコミットを含むプロジェクトを削除(または一時的な名前を付けます)私のプロジェクト-コピー」ディレクトリを「私のプロジェクト」に戻します。その後、おそらくもうすぐ別のコミットを行うでしょう。

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

ストレスを大幅に軽減するには、Gitの本を読む必要があります- "Gitでのバージョン管理" そして、私が「しなければならない」と言ったときにあなたが私(またはむしろ私の傷跡)を信頼できるなら、あなたもそれをするかもしれないということになるNOW。 Gitの複雑さの多くは、分岐してから再結合することです。しかし、あなたの質問から、人々が科学であなたを盲目にする理由はありません

たとえば、これが絶望的な状況であり、Gitを初めて使用する場合は特にそうです!

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

この「クラウドへのバックアップ」をテーマにした次のステップは、GitHubまたは(私の見解では)GitLabで(もちろん)アカウントを開設することです。その後、定期的にgit Pushコマンドを実行して、クラウドリポジトリを「適切に」バックアップできます。しかし、繰り返しますが、これについて話すのは早すぎるかもしれません。

15
mike rodent

希望のコミットにリセットしてみてください -

git reset <COMMIT_ID>

(COMMIT_IDを確認するにはgit logを使用します)

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

これで、追加されていないファイルをすべてcheckoutすることができます。

git checkout .

変更を確認するにはgit logを確認してください。

_アップデート_

リポジトリに one and only commitがある場合は、試してください。

git update-ref -d HEAD

13
optimistanoop

あぶない! ユーザーが誤って誤ったコミットをした場合、このコマンドによってコミット履歴が失われる可能性があります。あなたが少し安全であるよりあなたが間違いを犯すならば念のために他のどこかにあなたのgitのいくつかの余分なバックアップを常に持っている。 :)

私は同様の問題を抱えており、以前のコミットに戻ることを望みました。私の場合、私はより新しいコミットを続けるつもりはなかったので、私はHardを使いました。

これが私のやり方です。

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

これはローカルリポジトリに戻ります。ここでgit Push -fを使用するとリモートリポジトリが更新されます。

git Push -f

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

まずOriginからDevelopを削除する必要があります。

git Push Origin :develop (note the colon)

それからあなたはあなたが望む状況に発展する必要があります、私がコミットハッシュがEFGHIJKであると仮定させましょう:

git reset --hard EFGHIJK

最後に、Pushが再び開発します。

git Push Origin develop
11
George Ninan

GitKrakenではこれを行うことができます。

  1. リセットしたいコミットを右クリックして、以下を選択します。このコミットにリセット/ Hard

enter image description here

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

enter image description here

  1. Force Push:をクリックしてください。

enter image description here

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

10
Ângelo Polotto

最後のコミットで何らかのエラーを修正したい場合は、 git commit --amend コマンドを使用することをお勧めします。最後のコミットがどの参照によっても指されていない場合は、最後のコミットと同じ親を持つコミットを作成するため、これがうまくいきます。最後のコミットへの参照がない場合、それは単に破棄され、このコミットが最後のコミットになります。これは、コミットを元に戻すことなくコミットを修正するための良い方法です。しかしそれにはそれ自身の限界があります。

10
Upul Doluweera

まず、いつかコミットを特定する文字列を取得します。

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

コミット識別子を表示し、文字列(例えばXXXX)を取り、次のようにします。

git checkout XXXX
9
Luca C.

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

  1. git revert --no-commit "削除コードのコミット" HEAD(例:git revert --no-commit d57a39d HEAD)
  2. git commit
  3. gitプッシュ

上記の2つのステップを試してみてください。もしこれがあなたが望むものであれば、Pushを押してください。

何か問題があると感じたら

git revert --abort

9
Jagraj Singh

SourceTree を使えばもっと簡単にできます。探しているコミットを右クリックして、メニューから[チェックアウト]を選択します。

enter image description here

8
Marcin Szymczak

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

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

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

  1. 私が欲しいブランチをチェックアウトし、それをコピーしました。
  2. 最新のブランチをチェックしてください。
  3. 私が欲しいブランチの内容を最新のブランチのディレクトリにコピーして、変更を上書きしてコミットします。
7
Demodave
git reflog

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

git reset HEAD@{12} --hard
7
Sérgio

あなたが私が見つけた歴史を変えることができない特定のコミットにブランチを戻す最も簡単な方法は以下の通りです。

  1. 元に戻したいコミットまたはブランチをチェックアウトします。
  2. .git/HEADを編集して、参照先を分岐先の分岐に変更します。

といった:

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

もしあなたがgitのステータスをやれば、あなたは現在のブランチと元に戻したいブランチの間のすべての変更を見るはずです。

すべてがよさそうなら、コミットすることができます。同じことを確認するためにgit diff revert..exampleを使用することもできます。

6
jgmjgm

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

  • 誰かが、ビルドを壊したり、作業中の機能を壊したりするコードをコミットしました

Git logを使って最後の作業コミットを検索してから実行することができます。

git rebase --onto <commitId>

リモートブランチが再び機能しているときは、

git pull --rebase

あなたはデタッチ状態ではないので、この方法は一時的な変更のためのgit checkoutよりも優れています。

5
joseph

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

git resetコマンドを使用すると、HEAD(作業ツリーが指す最新のコミット)をリポジトリに対して変更できます。ステージング領域またはステージング領域と作業ツリーを変更します。 Gitが望む通りにコミットを作成できるということは、git addで行った変更に対する変更を元に戻す必要があることを意味しています。 git reset HEAD <file to change>を呼び出すことによってそれを行うことができます。変更を完全に取り除くには2つの方法があります。 git checkout HEAD <file(s) or path(s)>はステージングエリアと作業ツリーへの変更を元に戻す簡単な方法です。ただし、このコマンドは作業ツリーに対するすべての変更を削除するため、このコマンドには注意してください。 Gitはこれらの変更をコミットしたことがないので知らない。このコマンドを実行した後でこれらの変更を元に戻す方法はありません。あなたが自由に使えるもう一つのコマンドはgit reset --hardです。それはあなたの作業ツリーにとっても同様に有害です - コミットされていない変更や段階的な変更はそれを実行した後に失われます。 git reset -hard HEADを実行することはgit checkout HEADと同じことをします。作業にファイルやパスを必要としません。git resetと共に--softを使用できます。指定したコミットにリポジトリをリセットし、それらの変更をすべて段階的に実行します。既にステージングした変更は影響を受けず、また作業ツリーの変更も影響を受けません。最後に、--mixedを使用して変更をステージングせずに作業ツリーをリセットできます。これにより、ステージングされた変更も解除されます。

コミットを元に戻す

時々私達は間違いをする。共有することを想定していなかったコミットは、公開リポジトリにプッシュされます。コミットには修正できないバグがあり、元に戻す必要があります。あるいは、そのコードが不要になった場合もあります。 git revertを要求しますgit revertコマンドは、あなたが期待する通りのことをします。履歴にリバースコミットを適用することで単一のコミットを元に戻します。変更を完全に元に戻すには、いくつかのコミットを元に戻す必要があります。 -no-commitを使用するか、-nを使用してGitに復帰を実行するように指示しますが、変更をコミットするまでに停止することができます。これにより、すべての元に戻すコミットを1つのコミットにまとめることができます。これは、複数のコミットにわたる機能を元に戻す必要がある場合に便利です。必ずコミットを逆の順序で戻すようにしてください - 最新のコミットを最初にします。そうでなければ、まだ存在しないコードを元に戻すことを試みることによってGitを混乱させる可能性があります。

2
SAIguru011