パッチを作成してフォルダーを特定のコミットに戻す方法


97

これが「somefolder」フォルダの私の履歴です

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

somefolderを「Bugs fixed in some folder」コミットに戻したいのですが。

2番目のコミットにはsomefolder以外の変更が含まれていたため、このコミットを元に戻したくありません。

最も安全な方法は、いくつかのフォルダにのみ適用されるコミットe095と89cdの間に差分/パッチを作成し、そのパッチを適用することだと思います。どうやってやるの?

回答:


155

git checkoutを使用して、リポジトリを特定の状態に更新できます。

git checkout e095 -- somefolder

差分を生成することについてのあなたの質問に関しては、それもうまくいきます。現在の状態からe095次の状態に戻るための差分を生成するだけです。

git diff 89cd..e095 -- somefolder

30
これにより、そのコミットで追加されたファイルは削除されません。git reset e095 -- some/folder代わりに使用してください
shime

2
git 2.22以降では、チェックアウトしているコミットされていない追跡ファイルが削除さ--no-overlayれるgit checkoutようにfor を使用できます。
Mariusz Pawelski

53

を使用git resetしてインデックスをリセットできます。これには、最近のコミットで追加されたファイルの削除も含まれます(git checkoutそれ自体はこれを行いません):

git reset e095 -- somefolder

ただしgit reset、作業コピーは更新されず、--hardオプションはフォルダーでは機能しません。したがって、を使用git checkoutして、作業コピーをインデックスと同じにします。

git checkout -- somefolder

追加したファイルも削除したい場合は、次のことも行う必要があります。

git clean -fd somefolder

この回答は、ディレクトリに新しいファイルが含まれている場合に役立ちます。
Yahoho 2017年

2
この回答は、その時点でリポジトリのクリーンなスナップショットが本当に必要な場合にはるかに適しています。
データプリンセス

確かにはるかに良いです!
Alexis Pautrot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.