Git-間違いを修正

誤りを犯すのは人間です。したがって、すべてのVCSには、特定の時点まで間違いを修正する機能があります。Gitは、ローカルリポジトリに加えられた変更を元に戻すために使用できる機能を提供します。

ユーザーが誤ってローカルリポジトリに変更を加えた後、これらの変更を元に戻したいとします。そのような場合、revert 操作は重要な役割を果たします。

コミットされていない変更を元に戻す

ジェリーが誤ってローカルリポジトリのファイルを変更したとしましょう。しかし、彼は自分の変更を元に戻したいと思っています。この状況に対処するために、git checkoutコマンド。このコマンドを使用して、ファイルの内容を元に戻すことができます。

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git status -s
M string_operations.c

[jerry@CentOS src]$ git checkout string_operations.c

[jerry@CentOS src]$ git status –s

さらに、 git checkoutローカルリポジトリから削除されたファイルを取得するコマンド。トムがローカルリポジトリからファイルを削除し、このファイルを元に戻したいとしましょう。同じコマンドを使用してこれを実現できます。

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ rm string_operations.c

[tom@CentOS src]$ ls -1
Makefile

[tom@CentOS src]$ git status -s
D string_operations.c

Gitは手紙を見せています Dファイル名の前。これは、ファイルがローカルリポジトリから削除されたことを示します。

[tom@CentOS src]$ git checkout string_operations.c

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ git status -s

Note −コミットする前にこれらすべての操作を実行できます。

ステージング領域から変更を削除する

追加操作を実行すると、ファイルがローカルリポジトリから表示領域に移動することを確認しました。ユーザーが誤ってファイルを変更してステージング領域に追加した場合、ユーザーはを使用して変更を元に戻すことができます。git checkout コマンド。

Gitには、常に最新のコミットを指すHEADポインターが1つあります。ステージングされた領域からの変更を元に戻したい場合は、git checkoutコマンドを使用できますが、checkoutコマンドでは、追加のパラメーター、つまりHEADポインターを指定する必要があります。追加のコミットポインターパラメーターは、git checkoutコマンドに、作業ツリーをリセットし、段階的な変更を削除するように指示します。

トムがローカルリポジトリからファイルを変更するとします。このファイルのステータスを表示すると、ファイルが変更されたが、ステージング領域に追加されていないことが示されます。

tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[tom@CentOS src]$ git status -s

# Modify file and view it’s status.
[tom@CentOS src]$ git status -s
M string_operations.c

[tom@CentOS src]$ git add string_operations.c

Gitステータスは、ファイルがステージング領域に存在することを示します。ここで、git checkoutコマンドを使用してファイルを元に戻し、元に戻されたファイルのステータスを表示します。

[tom@CentOS src]$ git checkout HEAD -- string_operations.c

[tom@CentOS src]$ git status -s

GitリセットでHEADポインターを移動する

いくつかの変更を行った後、これらの変更を削除することを決定できます。Git resetコマンドは、変更をリセットまたは元に戻すために使用されます。3種類のリセット操作が可能です。

次の図は、Gitリセットコマンドの図解を示しています。

柔らかい

各ブランチには、最新のコミットを指すHEADポインターがあります。--softオプションの後にコミットIDを指定してGitresetコマンドを使用すると、何も破壊せずにHEADポインターのみがリセットされます。

.git/refs/heads/masterファイルには、HEADポインタのコミットIDが格納されます。を使用して確認できますgit log -1 コマンド。

[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

次に、上記のコミットIDと一致する最新のコミットIDを表示します。

[jerry@CentOS project]$ git log -2

上記のコマンドは次の結果を生成します。

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

HEADポインタをリセットしましょう。

[jerry@CentOS project]$ git reset --soft HEAD~

ここで、HEADポインタを1つ戻します。内容を確認しましょう.git/refs/heads/master file

[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

ファイルからのコミットIDが変更されたので、コミットメッセージを表示して確認します。

jerry@CentOS project]$ git log -2

上記のコマンドは次の結果を生成します。

commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

混合

--mixedオプションを使用したGitリセットは、まだコミットされていないステージング領域からの変更を元に戻します。ステージング領域からの変更のみを元に戻します。ファイルの作業コピーに加えられた実際の変更は影響を受けません。デフォルトのGitリセットは、gitreset--mixedと同等です。

ハード

Git resetコマンドで--hardオプションを使用すると、ステージング領域がクリアされます。HEADポインタを特定のコミットIDの最新のコミットにリセットし、ローカルファイルの変更も削除します。

コミットIDを確認しましょう。

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git log -1

上記のコマンドは次の結果を生成します。

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Jerryは、ファイルの先頭に1行のコメントを追加して、ファイルを変更しました。

[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>

彼はgitstatusコマンドを使用してそれを確認しました。

[jerry@CentOS src]$ git status -s
M string_operations.c

Jerryは、変更されたファイルをステージング領域に追加し、gitstatusコマンドで確認します。

[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git status

上記のコマンドは次の結果を生成します。

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#

Gitステータスは、ファイルがステージング領域に存在することを示しています。ここで、-hardオプションを使用してHEADをリセットします。

[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Git resetコマンドが成功しました。これにより、ファイルがステージング領域から戻され、ファイルに加えられたローカルの変更がすべて削除されます。

[jerry@CentOS src]$ git status -s

Gitステータスは、ファイルがステージング領域から戻されたことを示しています。

[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>

headコマンドは、リセット操作によってローカルの変更も削除されたことも示しています。