71

私は大規模なgitプロジェクトを持っており、愚かなことに、Eclipseにインポートして、自動フォーマットを実行しました。これで、プロジェクト内のすべてのファイルが変更済みとして表示されます。フォーマットされたファイルをコミットするのではなく、フォーマットされただけで他の変更が加えられていないすべてのファイルを元に戻したいと思います。例えば:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)

#     modified: dir/file1.cpp
#     modified: dir/file1.h
#     modified: dir/file2.cpp
#     modified: dir/file2.h
#     modified: dir/file3.cpp
#     modified: dir/file3.h
#     modified: dir/file4.cpp
#     modified: dir/file4.h

file2.cpp、、file2.hおよびがコンテンツで変更されていることを知ってfile3.cppいます(つまり、フォーマットされているだけではありません)。これらの3つのファイルへの変更を隠してから、古いリビジョンをチェックアウトして、後でこれらのファイルに変更を再適用できるようにします。私はむしろ次のようなものを避けたいです:

$ cp file2.cpp ~/tmp
$ git checkout blahblahblah
$ cp ~/tmp/file2.cpp .

隠し場所を含まない、これを行うための明白な方法がある場合は、私に知らせてください。仕事を成し遂げるものは何でも。

4

5 に答える 5

68

add保持したい変更を含むファイル、次にstash残りのファイルを保存してスタッシュをクリアできます。

git add file2.cpp file2.h file3.cpp
git stash --keep-index

この時点で、不要な変更を隠しました。それらを完全に削除したい場合は、次を実行します。

git stash drop

これfile2.cppで、 、file2.h、およびfile3.cppがコミット用にステージングされました。その後、これらのファイルを隠しておきたい (コミットはしない) 場合は、次のようにします。

git reset
git stash

これで、前のコミットに戻って、これら 3 つのファイルだけが隠されています。

アップデート:

Git 2.13 以降には、VonC が回答で説明しているようにgit stash push、特定のファイルをより直接的に隠しておく方法が含まれています。

于 2012-09-06T17:21:44.420 に答える
4

それはIMOgit diffの良い使い方です:git apply

git diff file2.cpp file2.h file3.cpp > ../my-changes.patch
git checkout ...
git apply ../my-changes.patch

の後diff、パッチ ファイルを検査して、すべての変更がそこにあることを確認できます。

--rejectパッチが完全に適用されない場合は、適用するオプションを使用する必要がある場合があることに注意してください。apply の man ページも参照してください。

于 2012-09-06T17:30:22.093 に答える