246

選択したコミット ログ エントリをリニア コミット ツリーから削除して、エントリがコミット ログに表示されないようにしたいと考えています。

私のコミットツリーは次のようになります。

R--A--B--C--D--E--HEAD

B と C のエントリを削除して、コミット ログに表示されないようにしたいのですが、A から D への変更は保持する必要があります。おそらく単一のコミットを導入することで、B と C が BC になり、ツリーは次のようになります。

R--A--BC--D--E--HEAD

または、理想的には、A の直後に D が続きます。D' は、A から B、B から C、C から D への変化を表します。

R--A--D'--E--HEAD

これは可能ですか?はいの場合、どのように?

これはかなり新しいプロジェクトであるため、現時点ではブランチがないため、マージもありません。

4

9 に答える 9

276

git-rebase(1)はまさにそれを行います。

$ git rebase -i HEAD~5

git awsome-ness [git rebase --interactive]には例が含まれています。

  1. git-rebase公開 (リモート) コミットでは使用しないでください。
  2. 作業ディレクトリがクリーンであること (commitまたはstash現在の変更内容) を確認してください。
  3. 上記のコマンドを実行します。を起動します$EDITOR
  4. pick前後Cを置き換えます。C と D を B に融合します。コミットを削除する場合は、その行を削除するだけです。Dsquash

迷った場合は、次のように入力してください。

$ git rebase --abort  
于 2009-01-30T12:26:03.353 に答える
76
# detach head and move to D commit
git checkout <SHA1-for-D>

# move HEAD to A, but leave the index and working tree as for D
git reset --soft <SHA1-for-A>

# Redo the D commit re-using the commit message, but now on top of A
git commit -C <SHA1-for-D>

# Re-apply everything from the old D onwards onto this new place 
git rebase --onto HEAD <SHA1-for-D> master
于 2009-01-30T13:45:48.293 に答える
41

削除したいコミットIDのみを知っている特定のコミットIDを削除する方法を次に示します。

git rebase --onto commit-id^ commit-id

これにより、コミットによって導入された変更が実際に削除されることに注意してください。

于 2010-09-13T23:32:01.567 に答える
20

JF Sebastian の回答を拡張するには:

git-rebase を使用すると、コミット履歴にあらゆる種類の変更を簡単に加えることができます。

git rebase --interactive を実行すると、$EDITOR に次のように表示されます。

pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
# Rebase 57d0b28..121802a onto 57d0b28
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit

行を移動してコミットの順序を変更し、行を削除してそのコミットを削除できます。または、コマンドを追加して、2 つのコミットを 1 つのコミットに結合 (スカッシュ) したり (前のコミットは上記のコミットです)、コミットを編集したり (何が変更されたか)、コミット メッセージを書き換えたりすることができます。

pick は、そのコミットをそのままにしておきたいという意味だと思います。

(例はこちらから)

于 2010-03-27T00:23:57.387 に答える
14

次の例を使用して、非対話的に B と C を削除できます。

git rebase --onto HEAD~5 HEAD~3 HEAD

または象徴的に、

git rebase --onto A C HEAD

B と C の変更はD には反映されないことに注意してください。それらはなくなります

于 2009-05-09T19:49:26.680 に答える
3

もう1つの方法は、

git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash)
and
git push origin master  -f

ベースとして使用するハッシュを選択します。上記のコマンドはそれをインタラクティブにする必要があるため、すべての上位メッセージを押しつぶすことができます (最も古いものを残す必要があります)。

于 2015-04-17T16:59:08.947 に答える
-1

これには git cherry-pick を使用できます。「cherry-pick」は、現在のブランチにコミットを適用します。

それからする

git rebase --hard <SHA1 of A>

次に、D および E コミットを適用します。

git cherry-pick <SHA1 of D>
git cherry-pick <SHA1 of E>

これにより、B および C コミットがスキップされます。BなしでDコミットをブランチに適用することは不可能かもしれないと言ったので、YMMV。

于 2009-02-02T23:47:42.350 に答える