Git-fix-mistakes
Git-間違いを修正
誤ることは人間です。 そのため、すべてのVCSは、特定のポイントまでミスを修正する機能を提供します。 Gitは、ローカルリポジトリに加えられた変更を取り消すために使用できる機能を提供します。
ユーザーがローカルリポジトリに誤って変更を加えた後、これらの変更を元に戻したいとします。 このような場合、 revert 操作が重要な役割を果たします。
コミットされていない変更を元に戻す
Jerryがローカルリポジトリのファイルを誤って変更したとします。 しかし、彼は変更を元に戻したいと考えています。 この状況に対処するには、 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
注意-コミットする前にこれらすべての操作を実行できます。
ステージング領域から変更を削除
追加操作を実行すると、ファイルがローカルリポジトリから開始領域に移動することがわかりました。 ユーザーが誤ってファイルを変更してステージング領域に追加した場合、 git checkout コマンドを使用して、変更を元に戻すことができます。
Gitには、常に最新のコミットを指す1つのHEADポインターがあります。 ステージング領域からの変更を取り消す場合は、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リセットコマンドは、変更をリセットまたは元に戻すために使用されます。 3種類のリセット操作を実行できます。
以下の図は、Gitリセットコマンドの図的表現を示しています。
Soft
各ブランチには、最新のコミットを指すHEADポインターがあります。 --softオプションの後にコミットIDを指定してGitのリセットコマンドを使用すると、何も破壊せずに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リセットはgit reset --mixedと同等です。
hard
Gitリセットコマンドで—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>
彼はgit statusコマンドを使用してそれを検証しました。
[jerry@CentOS src]$ git status -s
M string_operations.c
Jerryは変更されたファイルをステージング領域に追加し、git statusコマンドで検証します。
[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リセットコマンドが成功しました。これにより、ファイルがステージング領域から戻され、ファイルに加えられたローカルの変更がすべて削除されます。
[jerry@CentOS src]$ git status -s
Gitステータスは、ファイルがステージング領域から元に戻されたことを示しています。
[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>
また、headコマンドは、リセット操作によってローカルの変更も削除されたことを示しています。