最新に戻す - github コミット 取り消し ブラウザ




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

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

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コミットし0d1d7fcか?


あぶない!このコマンドは、ユーザーが間違ったコミットを誤って実行した場合、コミット履歴を失う可能性があります。間違いを犯した場合に備えて、ちょっと安全であるよりも、ちょうどあなたのgitの余分なバックアップをいつも持ってください。 :)

私は似たような問題を抱えており、以前のコミットに戻ろうとしていました。私の場合、私は新しいコミットを維持するためにintetesseredではなかったので、私は使用しましたHard

これが私のやり方です:

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

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

git push -f

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 [email protected]{1}

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

これは、基本的に、ソフトリセットによって前のコミットの状態がインデックス/ステージング領域にステージングされ、コミットできることを利用して動作します。

別の方法2:現在のツリーを削除して新しいツリーに置き換える

このソリューションは、svickのソリューションであるCheckoutの古いコミットから得られ、新しいコミットになります:

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

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


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

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

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 [email protected]{1}

git commit -m "Revert to 56e05fced"

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

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


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

git revert <commit1> <commit2> 

サンプル:

git revert 2h3h23233

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

git revert HEAD~1..HEAD

git push実行git push


~/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>持っていないのですか? git revert --to <hash>は私を超えています。


直近のコミットに戻し、すべてのローカル変更を無視する:

git reset --hard HEAD

あなたはマスターについて話していると仮定し、そのそれぞれの支店で(つまり、これはあなたが懸念している作業ブランチかもしれない):

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

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

私はブログ投稿からの答えを見つけたリモートGitリポジトリを特定のコミットに削除する


この正確な組み合わせとは別に、ここでは何も私のために働いたことはありません

git reset --hard <commit_hash>
git push origin <branch_name> --force

ここでのキーは、強制的にプッシュを強制し、余分なコミット/コミットメッセージなどがないことです。


これらのすべての初期ステップを自分で完了し、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

これを行うには、次の2つのコマンドを使用します。

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

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

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

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

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


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

git back

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

# Remove the latest three commits
git back 3

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

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

上記の2つのステップを試してみてください。これが見つかったら、git pushをしてください。

間違ったことが見つかった場合は、

git revert --abort


以前のコミットに戻って(そしてコミットされていない状態で、あなたが好きなことをするために)、 もっと簡単な方法があります:

git reset HEAD~1

だから、コミットidsなどの必要はありません:)


希望のコミットにリセットする -

git reset <COMMIT_ID>

(COMMIT_IDの使用をチェックするgit log

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

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

git checkout .

git log変更を確認するためにチェックします。

更新

レポに1つしかコミットしていない場合は、

git update-ref -d HEAD


状況が緊急の場合、あなたのプロジェクトがディレクトリ "私のプロジェクト"の下にあると仮定して、質問者が尋ねたことを迅速かつ汚れた方法でやりたいだけです。

  1. ディレクトリ全体をコピーして "my project - copy"

  2. 行う:

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

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

取得したコミットが含まれているプロジェクトを削除する(または一時的な名前をつける)と、名前を変更して、プロジェクトの状態を継続して保存したい場合は、私のプロジェクト - コピー "ディレクトリを"私のプロジェクト "に戻します。 おそらくもうすぐ別のコミットを行うでしょう。

Gitはすばらしい創造ですが、あなたは単にそれを拾うことはできません:それをあまりにも頻繁に説明しようとする人は、他のVCS [バージョン管理システム]の事前知識を前提としていて、初心者を混乱させるように計算されることがありますが、「チェックアウト」のための交換可能な用語の使用など、他の犯罪を犯します。

多くのストレスを節約するためには、Gitの本を読んでいなければなりません。「Version Control with Git」をお勧めします。私が「持っていなければならない」と言ったときに、あなたが私(またはむしろ私の傷跡)を信じることができれば、それはあなたがもそうするかもしれないことになります。Gitの複雑さの大部分は、分岐してから再作成することから来ています。しかし、あなたの質問から、人々があなたを科学で盲目にするべき理由はありません

特に、例えばこれが絶望的な状況で、あなたがGitの初心者であるならば!

PS:もう1つの考え:Gitリポジトリ( "repo")を作業ファイル以外のディレクトリに置くのは、実際にはとても簡単です。これは、上記のすばやい解決策を使用してGitリポジトリ全体をコピーする必要がないことを意味します。here --separate-git-dirを使ってFryerの答えを見てください。注意して、しかし、:あなたはコピーしない「別のディレクトリ」のリポジトリを持っている、とあなたはハードリセットを行う場合は、リセット以降のすべてのバージョンは、あなたが持っていない限り、あなたが絶対に必要として、永遠に失われてしまいますコミット定期的にリポジトリを他の場所のクラウド(Googleドライブなど)にバックアップすることをお勧めします。


私と他の人にとっては、Gitリセットオプションが最適です:

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

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

注記: コメントに記載されているように、古いコミットのコピーを持っている他の人とブランチを共有している場合、これは行いません

コメントからも、あまり「bally」メソッドを使用したい場合は、

git clean -i


私は、いくつかの人々が、彼らがマスターで作ったコミットされた変更をロールバックする方法を知りたいと思っているこの質問に来るかもしれないと信じています - つまり、すべてを投げ捨て、起点/マスターに戻ることです。

git reset --hard origin/master

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


答えを出す前に、背景を追加して、このHEADが何であるかを説明してください。

First of all what is HEAD?

HEADは、単に現在のブランチ上の現在のコミット(最新)への参照です。 任意の時点で単一のHEADしか存在できません( git worktreeを除く)。

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

detached HEAD

あなたが最新のコミットをしていない場合、つまり、 HEADが歴史上の前回のコミットを指していることを意味するのは、 detached HEADと呼ばdetached HEADます。

コマンドラインでは、 HEADが現在のブランチの先端を指していないので、ブランチ名ではなくSHA-1のようになります。

切り離された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に、 reflog新しいエントリがreflog

git reflog
git checkout [email protected]{...}

これは、あなたの希望をコミットに戻します

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修正する。


誤った変更からコーダのディレクトリを完全に消去するために、

git add -A .
git reset --hard HEAD

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


コミットがリモートにプッシュされると、それらを削除する必要があります。あなたの支店が発展しており、それが起源を超えて押し出されたと仮定しよう。

まず原産地から開発を取り除く必要があります:

git push origin :develop (note the colon)

次に、あなたが望むステータスに発展する必要があります。コミットハッシュがEFGHIJKであると仮定しましょう:

git reset --hard EFGHIJK

最後に、プッシュ開発をやり直してください。

git push origin develop




git-revert