1

私は、svnを捨てて、GITを続行するだけで、GITに精通する過程にあります。今、私は手を汚しました:
私はブランチを作成し、emacsマクロでたくさんのファイルを変更し、commit-aでそれらすべてをコミットしました。他のファイルにも他の変更を加えました。すべてをマスターにマージする前に、私はいくつかのことをテストしましたが、emacsマクロにはいくつかの重要な詳細が欠けていました。したがって、一括コミットの大部分は元に戻す必要がありますが、すべてではありません。また、一括コミット後のコミットも安定しています。バルクコミットの大部分を復元するための最も簡単な方法は何ですか?チェリーピックユーティリティはありますか?私は現在、コマンドラインgitとemacs vcs(git-el)を使用しています。私は本を​​購入していくつかのサイトを閲覧しましたが、これまでのところ満足のいく答えはまだ見つかりません。

よろしく、
ジェロエン。

4

1 に答える 1

1

git revert -n <hash of bulk commit>作業ツリーの一括コミットの変更を元に戻そうとします。git reset HEAD -- <paths to keep changes in>完了したら、--patch(保持する変更をインタラクティブに選択するために)を使用して実行できます。次に、他のコミットと同じようにコミットします。

リポジトリはプライベート/プッシュされていませんか?もしそうなら、私はこのようなことについてはお勧めしませんが、もう1つの選択肢があります。 git rebase -i <hash of commit before bulk>eまたはで始まる最初の行(一括コミットの最初の行が必要)を編集しeditます。

その時点で、git reset <hash of commit before bulk> -- <paths to revert>続いてを使用git commit --amendして一括コミットを修正し、一部のファイルの変更を除外できます。次にgit rebase --continue、調整されたコミットに加えて、残りのすべての履歴を書き換えます。競合を解決して、ファイルの元に戻されたビットに触れた場合は、再度続行する必要がある場合があります。その後、あなたの歴史は、あなたが悪い変更をまったく加えなかったように読まれます。プライベートプロジェクトの場合は良いことかもしれませんが、リベース後、書き換え元の中間状態に戻るのがかなり難しくなることに注意してください。しばらくの間はそれを行うことができますgit reflogが、最終的には古いバージョンのコミットが期限切れになり、リポジトリから削除されます。

いずれの場合も、git diff --name-only変更を元に戻したい/したくないパスをリストしたテキストファイルを編集してから、$(< badfiles)パスのリストの使用について説明した場所のようにシェル構造を使用することをお勧めします。コマンドラインでそのファイルをプルインします。1行に1つ、またはスペースで区切ると、そのような場合に問題なく機能します。ああ、パスにスペースがある場合は、ファイル内のパスを引用符で囲む必要があります。

于 2011-02-20T21:50:12.333 に答える