戻す - git 特定のコミット 取り消し




Gitの最新のコミットを元に戻すには? (20)

私は間違ってGitに間違ったファイルをコミットしましたが、まだコミットをサーバにプッシュしていません。

これらのコミットをローカルリポジトリから元に戻すにはどうすればよいですか?


以前のローカルコミットを修正する方法

git- git commit --amendを実行するには、git-gui(または同様のもの)を使用します。 GUIから、コミットから個々のファイルを追加または削除することができます。 コミットメッセージを変更することもできます。

以前のローカルコミットを元に戻す方法

以前の場所にブランチをリセットするだけです(例えばgitkgit rebaseを使って)。 保存したコピーから変更を再適用します。 あなたのローカルリポジトリのガベージコレクションの後、望まないコミットが起こったことはないでしょう。 1つのコマンドですべてを行うには、 git reset HEAD~1使用します。

警告の言葉git reset不用意に使用すると、作業コピーを混乱状態にすることができます。 可能ならばGitの初心者がこれを避けることをお勧めします。

公開コミットを元に戻す方法

変更を取り消すには、 逆チェリーピック ( git-revert )を実行します。

まだブランチに他の変更を加えていない場合は、単に行うことができます...

git revert --no-edit HEAD

次に、更新されたブランチを共有リポジトリにプッシュします。

コミット履歴には、両方のコミットが別々に表示されます。

上級者:公共リポジトリの私設支店の修正

これは危険です。再発行するブランチのローカルコピーがあることを確認してください。

注:他の人がブランチで作業している場合は、この処理を実行したくありません。

git push --delete (branch_name) ## remove public version of branch

あなたのブランチをローカルでクリーンアップし、再起動してください...

git push origin (branch_name)

通常の場合、おそらくプライベートブランチのコミット履歴が初期状態であることを心配する必要はありません。 フォローアップコミット(上記の「公開コミットを元に戻す方法」を参照)を押してから、後でsquash-mergeを行って履歴を非表示にします。


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

git reset --soft HEAD^またはgit reset --soft HEAD~

最後のコミットを元に戻します。

ここで--softはステージングにリセットされます。

HEAD~またはHEAD^は、HEADの前にコミットすることを意味します。

最後のコミットを新しいコミットに置き換えます。

git commit --amend -m "message"

最後のコミットを新しいコミットに置き換えます。


コミットとやり直しを元に戻す

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. これは元に戻すものです
  2. これにより、作業ツリー(ディスク上のファイルの状態)は変更されませんが、コミットが取り消され、コミットされなかった変更が残されます( git statusでは「コミットのためにステージングされた変更はありません」と表示されます。コミットする前にもう一度追加してください)。 以前のコミットに変更を加えたい場合やコミットメッセージ1を変更したい場合はgit reset --soft HEAD~代わりに使うことができます。これはgit reset --soft HEAD~と同じです( git reset --soft HEAD~と同じです)、既存の変更をステージングしたままにします。
  3. 作業ツリーファイルを修正します。
  4. git addは新しいコミットに含めるものをgit addします。
  5. 変更をコミットし、古いコミットメッセージを再利用します。 古いヘッドを.git/ORIG_HEADコピーし.git/ORIG_HEAD-c ORIG_HEAD commit使ってcommitとエディタが開きます。エディタは最初は古いコミットのログメッセージを含み、編集することができます。 メッセージを編集する必要がない場合は、 -Cオプションを使用できます。

ただし、新しい変更をインデックスに追加したcommit --amendは、 commit --amendを使用commit --amendと、以前のコミットに追加されます。

コードがすでにサーバーにプッシュされていて、履歴(上書き)を上書きする権限がある場合は、次のようにします。

git push origin master --force

この回答を見ることもできます:

HEADを元の場所に戻す方法は? (分離ヘッド)

上記の答えは、あなたが元に戻したいSHA-1が何であるかを知るために使用されるgit reflogを表示します。 上で説明したようにコマンドのシーケンスを使用するために元に戻したい点を見つけたら

ただし、 コミットメッセージを間違えた場合は、前のコミットにリセットする必要はありません。 より簡単なオプションは、 git reset (あなたが行ったすべての変更を舞台舞台にgit reset )です。そして、 git commit --amendは、最後のコミットメッセージであらかじめ設定されたデフォルトのコミットメッセージエディタを開きます。


"作業ツリーを最後のコミットにリセットする"

git reset --hard HEAD^ 

「作業ツリーから未知のファイルをクリーンアップする」

git clean    

参照 - Gitクイックリファレンス

注:このコマンドは前回のコミットを削除するので、注意して使用してください! git reset --hard - git reset --hard安全です -


Git Extrasをインストールしている場合は、 git undoを実行して最新のコミットを取り消すことができます。 git undo 3は最後の3つのコミットを元に戻します。


SourceTree (GUI for GitHub)では、コミットを右クリックして、「リバースコミット」を行うことができます。 これにより、変更が元に戻されます。

ターミナルで:

あるいは、

git revert

または:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

git logと入力して最後のコミットハッシュコードを見つけて、次のように入力します。

git reset <the previous co>

git revert commit-id使用する

コミットIDを取得するには、単にgit log


最後のGitコミットを元に戻す方法は?

すべてのものを最後のコミットの前の状態に戻すには、HEADの前にコミットにリセットする必要があります。

  1. あなたが行った変更を維持したくない場合:

    git reset --hard HEAD^
    
  2. 変更を保存したい場合:

    git reset --soft HEAD^
    

gitログを確認してください。 最後のコミットが削除されたことが示されます。


あなたがジャンクをコミットしたがプッシュしていない場合は、

git reset --soft HEAD~1

HEAD〜1は頭の前にコミットするための省略形です。 または、リセットする場合は、ハッシュのSHA-1を参照することもできます。 --softオプションを指定するとコミットが削除されますが、変更されたすべてのファイルは "変更がコミットされました"という状態になります。

作業中のツリーで追跡されたファイルの変更を取り除きたいのであれば、頭の前にコミットが " --hard "を代わりに使うからです。

または

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

git revert HEAD

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


これは私を理解するためにしばらくかかったので、多分これは誰かを助ける...

すでにコミットを公開したかどうか(リモートリポジトリにプッシュしたかどうか)によって、最後のコミットを元に戻す方法は2つあります。

ローカルコミットを元に戻す方法

私がローカルでコミットしたとしましょうが、今はそのコミットを削除したいとします。

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

すべてのものを最後のコミットの前の状態にresetには、 HEAD前にコミットにresetする必要があります。

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

git logは最後のコミットが削除されたことを示しgit log

公開コミットを元に戻す方法

すでにコミットを公開している場合は、新しいコミットを作成して、前回のコミット(現行のHEAD)で行った変更を「元に戻す」ことができます。

git revert HEAD

あなたの変更は元に戻され、コミットする準備ができました:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

詳細はGit Basics - Undoing Thingsを参照してください。


それを行うには多くの方法があります:

最後のコミット/前のコミットを元に戻すGitコマンド:

警告:あなたが何をしているのかわからない場合は--hardを使用しないでください。 - あまりにも危険でファイルを削除する可能性があります。

Gitでコミットを元に戻すための基本的なコマンドは次のとおりです。

$ git reset --hard <COMMIT -ID>

または

$ git reset --hard HEAD~<n>

COMMIT-ID :コミットのID

n:元に戻す最後のコミット数

次のように、コミットIDを取得できます。

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

ここでd81d3f1be20eb8はコミットIDです。

さあ、いくつかのケースを見てみましょう:

最後のコミット 'd81d3f1'を元に戻したいとします。 ここには2つのオプションがあります:

$ git reset --hard d81d3f1

または

$ git reset --hard HEAD~1

コミット 'be20eb8'を元に戻したいとします。

$ git reset --hard be20eb8

より詳細な情報については、ヘッドを特定の状態にリセットするための他のコマンドも参照して試すことができます:

$ git reset --help

ファイルを追加/削除して必要なものを得る:

git rm classdir
git add sourcedir

コミットを修正する:

git commit --amend

以前の誤ったコミットは、新しいインデックス状態を反映するように編集されます。つまり、最初に間違いを犯したことはないでしょう。

まだプッシュしていない場合にのみこれを行うべきであることに注意してください。 プッシュした場合、通常は修正をコミットする必要があります。


ファーストラン:

git reflog

コミット、マージ、プルなど、リポジトリで実行したすべてのアクションを表示します。

それから:

git reset --hard ActionIdFromRefLog

主なシナリオは2つあります

あなたはまだコミットをプッシュしていません

問題があなたがコミットした余分なファイルであった場合(そしてそれらをリポジトリに残したくない場合)、 git rmを使用してそれらを削除し、-- --amend使って--amendすることができます

git rm <pathToFile>

-rを使用してディレクトリ全体を削除することも、他のBashコマンドと組み合わせることもできます

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

ファイルを削除した後、-- amendオプションでコミットすることができます

git commit --amend -C HEAD # the -C option is to use the same commit message

これにより、最近のローカルコミットが書き換えられ、余分なファイルが削除されるので、これらのファイルは決してプッシュで送信されず、GCによってローカルの.gitリポジトリからも削除されます。

あなたは既にコミットをプッシュしました

他のシナリオと同じ解決策を適用し、 -fオプションを指定してgit pushを実行することもできますが、リモート履歴を変更して上書きする(リポジトリを混乱させる可能性がある) ため、お勧めしません

代わりに、あなたは--amendなしでコミットする必要があり--amend (これは--amend`を覚えています:このオプションは最後のコミットの履歴を書き換えます)。


共有リポジトリで最後の5つのコミットを取り消したかったのです。 私はロールバックしたいリビジョンIDを調べました。 それから、私は次のようにタイプしました。

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

単一のコマンド:

git reset --soft 'HEAD^' 

最後のローカルコミットを元に戻すのに効果的です!


恒久的に元に戻したい場合、リポジトリをクローンした

コミットIDは

git log 

それから、あなたはできます -

git reset --hard <commit_id>

git push origin <branch_name> -f

私の場合、私は偶然、私が欲しくないファイルをいくつかコミットしました。 だから私は次のことをして、それは働いた:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

gitkまたはgit logで結果を確認する--stat


私はこの仕事のためにgit rebase -iを使うのが好きです。良いリストがポップアップしてどこから取り除かれるかを選ぶことができるからです。 他の答えと同じくらい直接的なものではないかもしれませんが、ちょうど良いと感じます

リストするコミットの数を選択し、次にこのように呼び出します(最後の3つを登録します)

git rebase -i HEAD~3

サンプルリスト

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

次に、削除した行のコミットが削除されます。





git-revert