2012-03-12 14 views
1

私はいくつかのファイルで私の枝に一連の編集を加えました。私は今、これらの編集のほとんどすべてを少し変更したいと決めました。ファイル名や行番号を(例えば、git diffから)得る簡単な方法はありますか?そして選択したエディタ(vimですが、特定の行でファイルを開くことができるエディタを想定します)を開き、順番に?私は頭の上から考えることができる唯一の方法は、いくつかのスクリプトを介してdiff出力を実行することですが、それはかなり醜い得ることができるように聞こえる..gitのすべての変更を編集しますか?

説明:この段階ではコミットをしていません。あなたがコミットの管理可能な数を持っている場合は

答えて

2

質問を正しく解釈すると、作業コピーにいくつかの変更が保留されています。あなたはこれらの変更をどこにでもコミットしておらず、今ではそれらの場所のすべてで少し違うことをしたいと思っています。

git add -pを使用すると、それぞれ個別のパッチgit addが表示されます。各パッチのオプションの1つはeditです。これはあなたをdiffでエディタにドロップします。行を変更する必要がある場合は、追加された行(+とマークされています)のテキストを変更して保存するだけです。行を追加または削除するのはやや複雑です(ただし、どのように説明します)。

git diff --cachedには新しい変更が表示されますが、git diffは作業コピーがまだgit add -pの起動時の状態であることを示します。その後、希望の変更をgit commitに変更し、不要なものをgit reset --hard、または通常どおりにgit checkoutにドロップします。

+0

それはかなりいいです。参考までに、[インタラクティブな追加](http://book.git-scm.com/4_interactive_adding.html)(元のリンクのcarleetoに感謝) – naught101

+0

実際、これは少し違うことです。あまりにも急いで!また、 'git add -p;のショートカットとして' git commit --interactive'を使うことができます。 'git commit -a' – naught101

+1

@ naught101:' git commit --interactive'にまっすぐに行くことができますが、 'git add -p'を好む理由は複数チャンスがあるからです。 'git reset 'を使って、ファイルからパッチの段階を解除し、やり直してください。 'git diff --cached'を使って作業内容を確認できます。 –

1

、あなたが対話的に

git rebase -i lastcommitsha1^ 

をリベースし、編集する必要があるものをマークすることができます。

がトンであり、変更はスクリプト化されている、あなたはおそらくinteractive rebaseと呼ばれている探しているものをgit filter-branch --tree-filter

1

を使用する場合:

git rebase -i <last_commit_you_want_to_keep> 

違いは、インタラクティブなリベースを行うときということですその範囲内のすべてのコミットを「編集」することを選択します。その後、リベースを続行し、プロンプトが表示されたら、コミットを変更してコミットし、リベースを続行します。あなたが完了するまで続けてください。

注意:リベースを開始する前に、一時ブランチを作成し、そのブランチに切り替えてその上でリベースを実行してください。そうすれば、何かを混乱させるなら、いつでも元のコードに戻すことができます。

+0

私はまだコミットしていないコードについて話しているので、うまくいくとは思えません。 – naught101

関連する問題