Gitコミットから一部のファイルを削除するには、「-soft」オプションを指定して「gitreset」コマンドを使用し、HEADの前にコミットを指定します。
$ git reset --soft HEAD~1
このコマンドを実行すると、最新のコミット(HEAD)のファイルが表示され、それらをコミットできるようになります。
ファイルがステージング領域にあるので、「gitreset」コマンドを再度使用してファイルを削除(またはステージング解除)できます。
$ git reset HEAD <file>
注:今回は、ステージング領域からファイルを除外したいだけなので、HEADからリセットします。
このファイルに興味がなくなった場合は、「git rm」コマンドを使用して、インデックス(ステージング領域とも呼ばれます)からファイルを削除できます。
$ git rm --cached <file>
変更が完了したら、「–amend」オプションを使用して変更を再度コミットできます。
$ git commit --amend
ファイルがリポジトリから正しく削除されたことを確認するには、「git ls-files」コマンドを実行して、ファイルがファイルに表示されないことを確認します(もちろん新しいファイルの場合)。
$ git ls-files
<file1>
<file2>
GitRestoreを使用してコミットからファイルを削除する
Git 2.23以降、コミットからファイルを削除する新しい方法がありますが、2.23以降のGitバージョンを使用していることを確認する必要があります。
$ git --version
Gitバージョン2.24.1
注:Git 2.23は2019年8月にリリースされたため、このバージョンがコンピューターでまだ利用できない場合があります。
新しいバージョンのGitをインストールするには、このチュートリアルを確認してください。コミットからファイルを削除するには、「git restore」コマンドを使用し、「-source」オプションを使用してソースを指定し、リポジトリから削除するファイルを指定します。
たとえば、HEADから「myfile」という名前のファイルを削除するには、次のコマンドを記述します。
$ git restore --source=HEAD^ --staged -- <file>
例として、「マスター」ブランチでの最新のコミットでファイルを編集したとしましょう。
ファイルは正しくコミットされていますが、Gitリポジトリから削除したいと考えています。
Gitリポジトリからファイルを削除するには、最初にファイルを復元する必要があります。
$ git restore --source=HEAD^ --staged -- newfile
$ git status
ブランチ'マスター'
あなたのブランチは「origin/master」より1コミット進んでいます。(「gitpush」を使用してローカルコミットを公開します)
コミットする変更:
(use "git restore --staged <file>..." to unstage)
modified: newfile
コミットのためにステージングされていない変更:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: newfile
ご覧のとおり、ファイルはステージング領域に戻っています。
そこから、2つの選択肢があります。ファイルを編集して再度コミットするか、Gitリポジトリからファイルを削除するかを選択できます。
Gitリポジトリからファイルを削除する
このセクションでは、Gitリポジトリからファイルを削除するための手順について説明します。
まず、ステージングされている場合はファイルを削除できないため、ファイルのステージングを解除する必要があります。
ファイルのステージングを解除するには、「git reset」コマンドを使用して、ソースとしてHEADを指定します。
$ git reset HEAD newfile
ファイルが正しくステージングされていない場合は、「-cached」オプションを指定して「gitrm」コマンドを使用し、このファイルをGitインデックスから削除します(これにより、ディスク上のファイルは削除されません)
$ git rm --cached newfile
rm'newfile'
これで、リポジトリのステータスを確認すると、Gitが削除コミットをステージングしたことがわかります。
$ git status
ブランチ'マスター'
あなたのブランチは「origin/master」より1コミット進んでいます。(「gitpush」を使用してローカルコミットを公開します)
コミットする変更:
(use "git restore --staged <file>..." to unstage)
deleted: newfile
ファイルがステージングされたので、リポジトリから最新のコミットを修正するには、「-amend」オプションを指定した「gitcommit」を使用するだけです。
`$ git commit --amend
[master 90f8bb1] Commit from HEAD
Date: Fri Dec 20 03:29:50 2019 -0500
1 file changed, 2 deletions(-)
delete mode 100644 newfile
「ご覧のとおり、これによって新しいコミットは作成されませんが、変更を含めるために、基本的に最新のコミットが変更されます。
Gitコミットから特定のファイルを削除する
場合によっては、すべてのファイルを再度ステージングする必要はありません。リポジトリの1つの非常に特定のファイルを変更するのは1つだけです。
Gitコミットから特定のファイルを削除するには、「– soft」オプションを指定して「gitreset」コマンドを使用し、HEADの前のコミットと削除するファイルを指定します。
$ git reset HEAD^ -- <file>
変更が完了すると、ファイルはステージング領域に戻ります。
まず、「git reset」コマンドを使用してステージング領域からファイルを削除し、HEADからリセットすることを指定できます。
$ git reset HEAD <file>
注:これは、このファイルの変更が失われることを意味するのではなく、ファイルがステージング領域から削除されることを意味します。
インデックスからファイルを完全に削除する場合は、「-cached」オプションを指定して「gitrm」コマンドを使用する必要があります。
$ git reset HEAD <file>
ファイルがステージング領域から正しく削除されたことを確認するには、「gitls-files」コマンドを使用してインデックスに属するファイルを一覧表示します。
$ git ls-files
変更が完全に完了したら、「-amend」オプションを指定した「gitcommit」コマンドを使用して、ファイルを削除したコミットを修正できます。
$ git commit --amend