3

私が理解していることから、各 git commit は、最後のコミット以降に追跡されたファイルに加えられた変更を保存します。ソースコードから古いコミットを削除する方法はありますか? たとえば、テキストファイルがある場合

textfile.txt

Text line one
More text line

そして、あなたは先に進み、コミットしましたgit commit -m "Initial Commit"

次に、 textfile.txt を再度編集します

textfile.txt

Text line one
More text line
Even more lines
Just one more line

そして、あなたは先に進み、コミットしましたgit commit -m "Added new lines 2"

その後、最終編集を行いました

textfile.txt

Text line one
More text line
Even more lines
Just one more line
These are the last lines
In this file

そしてコミットしたgit commit -m "Added new lines 3"

ファイルが次のようになるように、コミット番号 2 (「新しい行 2 を追加」) のすべての変更を削除する方法はありますか。

textfile.txt

Text line one
More text line
These are the last lines
In this file

(削除された行Even more linesJust one more line、コミット 2 で変更された行に注意してください)

4

3 に答える 3

4

リベースでこれを行うことができます (これにはインタラクティブなリベースは必要ありません):

git rebase HEAD --onto HEAD~2

これは基本的に次のことを意味します。

HEAD 以降のすべてのコミット (つまり 1 つのコミット) を取得し、それらを親の親 (最初のコミット) に適用します。したがって、親コミット (2 番目のコミット) はスキップされます。

前:

     HEAD
      |
A--B--C

後:

A--B--C
 \
  C'
  |
 HEAD

C'HEAD は(元の C のコピー) を指すようになりましたC'が、A代わりに親としてB.

編集:

Klas Mellbourn の回答に対するコメントから、コミットを保持したいが、変更を元に戻したいと思われます。それgit revertがそうです。

git revert HEAD~1
于 2013-03-29T09:42:25.297 に答える
3

他の回答(Kl​​asMellbournとIkkeによる)は、「それは決して起こらなかった」というコミットを消去します。そのように履歴を書き換えるのは良くありません (ただし、必要な場合もあります...)。古いものを元に戻す新しいコミットを作成するために使用できますgit revert(詳細については発行するだけです)。--help

于 2013-03-30T02:33:05.657 に答える
2

インタラクティブなリベースを行い、そのコミットを削除します

git rebase -i HEAD~2

これにより、エディターに 2 つのコミットのリストが表示されます。不要なコミットの行を完全に削除します。エディターを保存して閉じ、リベースを終了します。コミットと変更は目に見える履歴から消えます (元のコミットはまだリポジトリにありますが、最終的にガベージ コレクションされます)

于 2013-03-29T09:36:35.323 に答える