GitリセットとGit復帰の究極のガイド

git resetおよびgit revertコマンドの究極のガイドへようこそ。このチュートリアルでは、Gitの使用中によくある間違いを修正し、不正なコミットを元に戻すために知っておく必要のあるすべてのことを学びます。

Gitプロジェクトの3つのセクションを理解する

Gitプロジェクトには、次の3つの主要なセクションがあります。

  1. Gitディレクトリ
  2. 作業ディレクトリ(または作業ツリー)
  3. ステージングエリア

Gitのディレクトリ(にありますがYOUR-PROJECT-PATH/.git/Gitはそれが正確にプロジェクトを追跡するために必要なすべてを保存する場所)です。これには、メタデータと、プロジェクトファイルの圧縮バージョンを含むオブジェクトデータベースが含まれます。

作業ディレクトリは、ユーザがプロジェクトにローカルな変更を行う場所です。作業ディレクトリは、プロジェクトのファイルをGitディレクトリのオブジェクトデータベースから取得し、ユーザーのローカルマシンに配置します。

注:ディレクトリは、リポジトリまたは短縮形リポジトリとも呼ばれます。ユーザーのローカルマシン上のリポジトリは「ローカルリポジトリ」と呼ばれ、gitサーバー上のリポジトリは「リモートリポジトリ」と呼ばれます。

ステージング領域は、あなたになりますかについての情報が格納され、次のコミットというファイル(とも呼ばれる「インデックス」、「ステージ」、または「キャッシュ」)です。コミットとは、これらの段階的な変更を保存するようにGitに指示することです。Gitはファイルのスナップショットをそのまま取得し、そのスナップショットをGitディレクトリに永続的に保存します。

3つのセクションがあり、ファイルがいつでも存在できる3つの主要な状態があります。変更、コミット、またはステージングです。あなたは、修正ファイルにあなたがあなたの作業ディレクトリで、それに変更を加える任意の時間を。次に、それはだ上演あなたがステージングエリアに移動するとき。最後に、それはだコミットコミット後。

Gitリセット

このgit resetコマンドを使用すると、現在のヘッドを指定した状態にリセットできます。特定のファイルとブランチ全体の状態をリセットできます。これは、コミットをGitHubまたは別のリモートリポジトリにまだプッシュしていない場合に役立ちます。

ファイルまたはファイルのセットをリセットする

次のコマンドを使用すると、コンテンツのチャンクを選択して選択し、元に戻すか、ステージングを解除できます。

git reset (--patch | -p) [tree-ish] [--] [paths]

ファイルのステージングを解除する

を使用してファイルをステージング領域に移動したgit addが、それをコミットの一部にしたくない場合は、次を使用git resetしてそのファイルのステージングを解除できます。

git reset HEAD FILE-TO-UNSTAGE

行った変更はファイルに残ります。このコマンドは、ステージング領域からそのファイルを削除するだけです。

ブランチを前のコミットにリセットする

次のコマンドは、現在のブランチのHEADを指定されたものにリセットCOMMITし、インデックスを更新します。基本的にはブランチの状態を巻き戻し、その後に行うすべてのコミットは、リセットポイントの後に来たものをすべて上書きします。を省略するとMODE、デフォルトで--mixed:になります。

git reset MODE COMMIT

のオプションは次のMODEとおりです。

  • --soft:インデックスファイルまたは作業ツリーをリセットしませんが、HEADをにリセットしcommitます。すべてのファイルを「コミットする変更」に変更します
  • --mixed:インデックスをリセットしますが、作業ツリーはリセットせず、更新されていないものを報告します
  • --hard:インデックスと作業ツリーをリセットします。commit破棄されてからの作業ツリー内の追跡ファイルへの変更
  • --merge:インデックスをリセットし、commitとHEADの間で異なる作業ツリー内のファイルを更新しますが、インデックスと作業ツリーの間で異なるファイルは保持します。
  • --keep:インデックスエントリをリセットし、commitとHEADの間で異なる作業ツリー内のファイルを更新します。commitとHEADの間で異なるファイルにローカルの変更がある場合、リセットは中止されます

ハードリセットに関する重要な注意事項

この--hardオプションを使用するとgit reset、コミット、ステージング領域、および作業ディレクトリがリセットされるため、十分に注意してください。このオプションを適切に使用しないと、記述されたコードが失われる可能性があります。

Git Revert

Both the git revert and git reset commands undo previous commits. But if you've already pushed your commit to a remote repository, it is recommended that you do not use git reset since it rewrites the history of commits. This can make working on a repository with other developers and maintaining a consistent history of commits very difficult.

Instead, it is better to use git revert, which undoes the changes made by a previous commit by creating an entirely new commit, all without altering the history of commits.

Revert a commit or set of commits

The following command lets you revert changes from a previous commit or commits and create a new commit.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort

Common options:

 -e --edit
  • This is the default option and doesn't need to be explicitly set. It opens your system's default text editor and lets you edit the new commit message before commit the revert.
  • This option does the opposite of -e, and git revert will not open the text editor.
  • This option prevents git revert from undoing a previous commit and creating a new one. Rather than creating a new commit, -n will undo the changes from the previous commit and add them to the Staging Index and Working Directory.
 --no-edit
-n -no-commit

Example.

Let's imagine the following situation: 1.) You are working on a file and you add and commit your changes. 2.) You then work on a few other things, and make some more commits. 3.) Now you realize, three or four commits ago, you did something that you would like to undo - how can you do this?

You might be thinking, just use git reset, but this will remove all of the commits after the one you would like to change - git revert to the rescue! Let's walk through this example:

mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

And with that you're one step closer to getting your black belt in Git.