現在の状態から特定のコミットで作成されたスナップショットに戻すにはどうすればよいですか?
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
へのコミットを戻すことができますか?
これは、「元に戻す」という意味によって大きく異なります。
あなたが一時的にそれに戻りたいなら、ばかにして、そしてあなたがいるところに戻ってきなさい、あなたがしなければならないすべてはあなたがしたいコミットをチェックアウトすることです:
# 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を以前の場所に戻すにはどうすればよいですか? (独立した頭)
変更を無視して前のコミットに戻るには
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ハッシュによるコミットに戻りますか?に行きます。
ここにはたくさんの複雑で危険な答えがありますが、実際は簡単です。
git revert --no-commit 0766c053..HEAD
git commit
これはHEADからコミットハッシュにすべてを戻します。つまり、ワーキングツリーでそのコミット状態を再作成しますまるでウォークバックされてからのすべてのコミットのように)。そして、それは本質的にあなたが「元に戻す」コミットと同等のまったく新しいコミットを作成します。
(--no-commit
フラグを使用すると、gitはすべてのコミットを一度に元に戻すことができます。そうしないと、範囲内のコミットごとにメッセージが表示され、不要な新しいコミットで履歴がいっぱいになります。)
これは前の状態にロールバックするための安全で簡単な方法です。履歴は破壊されないため、すでに公開されているコミットに使用できます。
私にとってそしておそらく他の人にとっての最良の選択肢はGit resetオプションです:
git reset --hard <commidId> && git clean -f
これは私にとって最良の選択でした!それは簡単で、速くそして効果的です!
注: コメントに記載されているように、古いコミットのコピーを持っている他の人とあなたのブランチを共有しているならこれをしないでください
また、コメントから、あなたがもっと 'ぎこちない'メソッドを望むなら、あなたは使うことができる
git clean -i
答える前に、このHEAD
が何であるかを説明しながら、背景をいくつか加えましょう。
First of all what is HEAD?
HEAD
は単に現在のブランチの現在のコミット(最新)への参照です。常にHEAD
は1つしか存在できません(git worktree
を除く)。
HEAD
の内容は.git/HEAD
内に格納されており、現在のコミットの40バイトのSHA-1が含まれています。
detached HEAD
もしあなたが最新のコミットをしていなければ - これはHEAD
が過去のコミットを指していることを意味しますdetached HEAD
.
HEAD
は現在のブランチの先端を指していないため、コマンドラインではブランチ名の代わりにSHA-1となります。
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@{...}
これであなたはあなたの望むコミットに戻るでしょう
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 rebase --no-autostash
も使用できます。このスキーマは、どのコマンドが何をするのかを示しています。ご覧のとおり、reset && checkout
はHEAD
を修正しています。
「コミット解除」し、最後のコミットメッセージを消去し、変更したファイルをステージングに戻す場合は、次のコマンドを使用します。
git reset --soft HEAD~1
--soft
は、コミットされていないファイルは、それらを破棄する--hard
とは反対に作業ファイルとして保持されるべきであることを示します。HEAD~1
が最後のコミットです。 3コミットをロールバックしたい場合はHEAD~3
を使用できます。特定のリビジョン番号にロールバックしたい場合は、そのSHAハッシュを使用してそれを行うこともできます。これは、あなたが間違ったことをコミットし、その最後のコミットを元に戻したい場合に非常に便利なコマンドです。
ソース: http://nakkaya.com/2009/09/24/git-delete-last-commit/ /
私は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
の前に追加しました。
次の2つのコマンドでこれを実行できます。
git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f
以前のGitコミットを削除します。
変更を保存したい場合は、次のものも使用できます。
git reset --soft [previous Commit SHA id here]
それからそれはあなたの変更を保存します。
OK、 gitで前のコミットに戻るのはとても簡単です...
元に戻す保持しない変更:
git reset --hard <commit>
元に戻すwith keep変更:
git reset --soft <commit>
説明: git resetを使用すると、特定の状態にリセットできます。上記のように、コミットハッシュで使用するのが一般的です。
しかし、違いは、--soft
と--hard
の2つのフラグを使用することであることがわかります。デフォルトではgit reset
は--soft
フラグを使用しますが、常にフラグを使用することをお勧めします。
説明されているデフォルトのフラグは、提供する必要はなく、作業ツリーを変更せず、コミットする準備ができているすべての変更ファイルを追加するため、ファイルへの変更がステージングされないコミット状態に戻ります。
このフラグには注意してください。作業中のツリーをリセットし、追跡ファイルへのすべての変更をリセットすると、すべてが失われます!
また、実際のgitでの作業で発生する可能性のある以下の画像を作成しました。
この正確な組み合わせを除いて、ここでは何もうまくいきませんでした。
git reset --hard <commit_hash>
git Push Origin <branch_name> --force
ここで重要なのはプッシュを強制すること、追加のコミット/コミットメッセージなどはないことです。
~/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>
を持っていないのかは私を超えています。
Jefromiのソリューション は間違いなく最高のものであり、間違いなくそれらを使用する必要があります。ただし、完全を期すために、コミットを元に戻すために使用できるこれらの他の代替ソリューションも示したいと思っていました(つまり、前の変更を元に戻す新しいコミットを作成するという意味でcommit、git revert
と同じように)。
明確にするために、これらの代替はコミットを元に戻す最良の方法ではありません、 Jefromiのソリューションは ですが、私はあなたがgit revert
と同じことを達成するためにこれらの他の方法を使用することもできることを指摘したいだけです。
これは、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>"
これは基本的に、ソフトリセットがインデックス/ステージング領域にステージングされた前のコミットの状態を残すという事実を使用することで機能し、その後コミットできます。
この解決策は、svickの 古いコミットをチェックアウトし、新しいコミットにする :
git rm -r .
git checkout <commit> .
git commit
代替#1と同様に、これは現在の作業コピーで<commit>
の状態を再現します。 git rm
はgit checkout
以降に追加されたファイルを削除しないため、最初に<commit>
を実行する必要があります。
あなたが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を使う重要な理由です。
リセットよりも復帰(他の回答を参照)を使用する方が適切です。あなたが一人の男のチームであれば、それはおそらく問題ではありません。
これは以前のコミットに戻るための はるかに単純な の方法です(そしてそれを未コミット状態にして、好きなようにそれを行います):
git reset HEAD~1
そのため、コミットIDなどは必要ありません。
すべての変更を終えたら、これらのすべてのコマンドをプッシュするときに、次のものを使用する必要があります。
git Push -f ...
git Push
だけではありません。
古いコミットを元に戻してステージングするためのコマンド(コアGitの一部ではありませんが、 git-extras パッケージにあります)があります。
git back
manページ によると、このように使うこともできます。
# Remove the latest three commits
git back 3
あなたは自分自身でこれらすべての初期ステップを完了し、git repoに戻ることができます。
git pull --all
コマンドを使用して、最新バージョンのリポジトリをBitbucketから取得します。
端末から-n 4を指定してgit logコマンドを実行します。 -nの後の数字は、ローカル履歴の最新のコミットから始まるログ内のコミットの数を決定します。
$ git log -n 4
git reset --hard HEAD~N
を使用してリポジトリの履歴の先頭をリセットします。ここでNは、先頭に戻したいコミットの数です。次の例では、ヘッドはリポジトリ履歴の最後のコミットまで1コミット後退します。
git Push --force
を使用してgit repoへの変更をプッシュし、強制的に変更をプッシュします。
リポジトリを以前のコミットにgitしたい場合
git pull --all
git reset --hard HEAD~1
git Push --force
最近の 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
または何でも。
git stash
git stash clear
前回のコミット以降に行ったすべての変更を直接クリアします。
シモンズ:それは少し問題があります。また、最近保存したstashの変更をすべて削除します。ほとんどの場合、どちらを選んでも構いません。
前のコミットからHEADへの変更を保持して前のコミットに移動するには、次のようにします。
git reset <SHA>
前回のコミットからHEADへの変更が不要な場合は、すべての変更を破棄してください。
git reset --hard <SHA>
偶然の変更からコーダのディレクトリを完全にきれいにするために、我々は使用しました:
git add -A .
git reset --hard HEAD
git reset --hard HEAD
だけで修正が取り除かれますが、「新しい」ファイルは削除されません。彼らの場合、彼らは誤ってどこかにランダムに重要なフォルダをドラッグしていたし、それらのファイルはすべてGitによって新しいものとして扱われていたので、reset --hard
はそれを修正しませんでした。事前にgit add -A .
を実行することで、リセットによって一掃されるように、gitでそれらすべてを明示的に追跡しました。
自分のマスターで行ったコミット済みの変更をロールバックする方法を知りたいと思う人がいるかもしれません。つまり、すべてを捨ててOrigin/masterに戻る場合は、次のようにします。
git reset --hard Origin/master
https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master
コミットをロールバックするコマンドです。
git revert <commit1> <commit2>
サンプル:
git revert 2h3h23233
以下のようにHEADから範囲を取ることができます。ここで1は「最後のコミットを元に戻す」と言います。
git revert HEAD~1..HEAD
そしてgit Push
を実行します
最新のコミットを元に戻す:
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 という名前の新しいブランチが、プロジェクトの古いバージョンを反映しています。他のコミットやブランチに触れたり、削除することもありません。
状況が緊急事態であり、質問者が迅速かつ汚れた質問をしたい場合方法、プロジェクトがディレクトリ「my project」の下にあると仮定します。
ディレクトリ全体をコピーして、「my project-copy」などの別の名前を付けます。
行う:
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
コマンドを実行して、クラウドリポジトリを「適切に」バックアップできます。しかし、繰り返しますが、これについて話すのは早すぎるかもしれません。
希望のコミットにリセットしてみてください -
git reset <COMMIT_ID>
(COMMIT_IDを確認するにはgit log
を使用します)
これにより、変更されたすべてのファイルが追加されていない状態にリセットされます。
これで、追加されていないファイルをすべてcheckout
することができます。
git checkout .
変更を確認するにはgit log
を確認してください。
_アップデート_
リポジトリに one and only commitがある場合は、試してください。
git update-ref -d HEAD
あぶない! ユーザーが誤って誤ったコミットをした場合、このコマンドによってコミット履歴が失われる可能性があります。あなたが少し安全であるよりあなたが間違いを犯すならば念のために他のどこかにあなたの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
最後のコミットで何らかのエラーを修正したい場合は、 git commit --amend コマンドを使用することをお勧めします。最後のコミットがどの参照によっても指されていない場合は、最後のコミットと同じ親を持つコミットを作成するため、これがうまくいきます。最後のコミットへの参照がない場合、それは単に破棄され、このコミットが最後のコミットになります。これは、コミットを元に戻すことなくコミットを修正するための良い方法です。しかしそれにはそれ自身の限界があります。
まず、いつかコミットを特定する文字列を取得します。
git rev-list -n 1 --before="2009-07-27 13:37" Origin/master
コミット識別子を表示し、文字列(例えばXXXX)を取り、次のようにします。
git checkout XXXX
ロールバックの場合(または元に戻す場合):
- git revert --no-commit "削除コードのコミット" HEAD(例:git revert --no-commit d57a39d HEAD)
- git commit
- gitプッシュ
上記の2つのステップを試してみてください。もしこれがあなたが望むものであれば、Pushを押してください。
何か問題があると感じたら
git revert --abort
SourceTree を使えばもっと簡単にできます。探しているコミットを右クリックして、メニューから[チェックアウト]を選択します。
さらに別の最も簡単な解決策。これを行うにはブランチを変更する必要がありますが、その後は単に実行することができます。
git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
私は何らかの理由で手動で私のものを元に戻すことができなかったので、ここで私はそれをやってしまった方法です。
git reflog
Git reflogのHEADの番号を選択して、元に戻して実行します(この例では12を選択します)。
git reset HEAD@{12} --hard
あなたが私が見つけた歴史を変えることができない特定のコミットにブランチを戻す最も簡単な方法は以下の通りです。
といった:
echo 'ref: refs/heads/example' > .git/HEAD
もしあなたがgitのステータスをやれば、あなたは現在のブランチと元に戻したいブランチの間のすべての変更を見るはずです。
すべてがよさそうなら、コミットすることができます。同じことを確認するためにgit diff revert..exampleを使用することもできます。
一時的に変更を元に戻したい場合
Git logを使って最後の作業コミットを検索してから実行することができます。
git rebase --onto <commitId>
リモートブランチが再び機能しているときは、
git pull --rebase
あなたはデタッチ状態ではないので、この方法は一時的な変更のためのgit checkoutよりも優れています。
段階的な変更とコミットのリセット
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を混乱させる可能性があります。