web-dev-qa-db-ja.com

Gitはいくつかのファイルの変更を元に戻します

コーディング中に、何が起こっているかを追跡するために、いくつかのファイルにprintステートメントを追加しました。

完了したら、一部のファイルの変更を元に戻すことはできますが、実際に作業したファイルをコミットしますか?

ファイルAにprintを追加したが、ファイルBを変更したとします。 Bはコミットしたいものであり、Aは古い状態に戻したいものです。

184
Hamza Yerlikaya

これを行うには、ファイルAに加えた変更に応じて3つの基本的な方法があります。インデックスに変更を追加またはコミットしていない場合は、checkoutコマンドを使用します。リポジトリに一致する作業コピーの状態:

git checkout A

すでにインデックスに追加している場合は、resetを使用します。

git reset A

コミットした場合は、revertコマンドを使用します。

# the -n means, do not commit the revert yet
git revert -n <sha1>
# now make sure we are just going to commit the revert to A
git reset B
git commit

一方、コミットしたのに、元に戻さないファイルがかなり多く含まれている場合、上記の方法には多くの「リセットB」コマンドが含まれている可能性があります。この場合、次の方法を使用できます。

# revert, but do not commit yet
git revert -n <sha1>
# clean all the changes from the index
git reset
# now just add A
git add A
git commit

また別の方法では、rebase -iコマンドを使用する必要があります。これは、編集するコミットが複数ある場合に役立ちます。

# use rebase -i to cherry pick the commit you want to edit
# specify the sha1 of the commit before the one you want to edit
# you get an editor with a file and a bunch of lines starting with "pick"
# change the one(s) you want to edit to "edit" and then save the file
git rebase -i <sha1>
# now you enter a loop, for each commit you set as "edit", you get to basically redo that commit from scratch
# assume we just picked the one commit with the erroneous A commit
git reset A
git commit --amend
# go back to the start of the loop
git rebase --continue
285

ソース: http://git-scm.com/book/en/Git-Basics-Undoing-Things

git checkout-modifiedfile.Java


1)$ gitステータス

変更されたファイルが表示されます

2)$ git checkout-modifiedfile.Java

3)$ gitステータス

19
dekdev
git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index
7
Stefan Mai

man git-checkoutgit checkout A

6
Nicolas Dumazet

はい;

git commit FILE

fILEのみをコミットします。その後、使用することができます

git reset --hard

他のファイルのローカル変更を元に戻すため。

私が知らない他の方法もあるかもしれません...

編集:または、NicDumZが言ったように、git-checkoutは変更を元に戻したいファイルだけです(最良の解決策は、コミットするファイルがもっとあるか、元に戻すファイルがもっとあるかによって異なります:-)

3
Jay

git add<file>」を使用して、コミットにどのような変更を加えたいのか単にマークできないのはなぜですかまたは「git add --interactive」、または「git gui」(インタラクティブなコミットのオプションがあります)、そして「git commit -a」の代わりに「git commit」を使用しますか?

あなたの状況では(あなたの例のために):

Prompt> git add B
Prompt> git commit

ファイルBへの変更のみがコミットされ、ファイルAは「ダーティ」のままになります。つまり、作業領域バージョンのそれらのprintステートメントが残ります。これらのprintステートメントを削除する場合は、使用するだけで十分です。

Prompt> git reset A

または

Prompt> git checkout HEAD -- A

コミットされたバージョン(HEADからのバージョン、つまり「git show HEAD:A」バージョン)に戻す。

1
Jakub Narębski