gitでコミットの範囲を元に戻す


127

gitでコミットの範囲を元に戻すにはどうすればよいですか?gitrevisionsのドキュメントを見ると、必要な範囲を指定する方法がわかりません。例えば:

A -> B -> C -> D -> E -> HEAD

同等のことをしたい:

git revert B-D

結果は次のようになります。

A -> B -> C -> D -> E -> F -> HEAD

ここで、FにはBDの逆が含まれます。


gitrevisions(7)ページの終わりに向かって、「範囲の指定」という見出しのセクションがあります。あなたが欲しいものがそこに記載されているものとどう違うのですか?
Gareth McCaughan、2011

2
gitrevisionsページは、「git revert A..​​D」が私がやりたいことをすることを示唆しています。しかし、それを実行しようとすると、「致命的: 'A..D'が見つかりません」というエラーが表示されます
Alex

回答:


172

使用しているGitのバージョンは何ですか?

複数のコミットの復帰は、Git1.7.2 +でのみサポートされています。詳細については、「復帰を複数回使用して古いコミットにロールバックする」を参照してください。
現在のgit revertmanページは、現在の Gitバージョン(1.7.4以降)専用です。


以下のようOPアレックス・スパーリングはコメントで報告します。

1.7.4へのアップグレードは問題なく動作します。
私自身の質問に答えるために、これは私が探していた構文です:

git revert B^..D 

B^「Bの最初の親コミット」を意味します。これによりB、復帰に含めることができます。たとえば、構文を含む
git rev-parseSPECIFYING REVISIONSセクション」を参照してください。詳細は、「キャレット()文字の意味は?」を参照してください<rev>^HEAD^^

元に戻された各コミットは個別にコミットされることに注意してください。

Henrik N はコメントで明確にしています

git revert OLDER_COMMIT^..NEWER_COMMIT

以下に示すように、すぐにコミットせずに元に戻すことができます。

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

1
ありがとう、それが答えでした。1.7.4へのアップグレードは問題なく動作します。私自身の質問に答えるために、これは私が探していた構文です:git revert B ^ .. D
Alex Spurling

天才。ありがとう。パッチを適用するために、コミットを逆の順序で元に戻す必要があるとは思いませんでした。このコマンドは方法を示します。
Tim Abell、2012年

5
私はこの回答を頻繁に参照しますが、順序を理解するには常に時間がかかります。だから私の将来の自分を助けるために:git revert OLDER_COMMIT^..NEWER_COMMIT
Henrik N

2
^はどういう意味ですか?
ダスティンゲッツ

1
@DustinGetzの最初の親:git-scm.com/docs/gitrevisionsを参照:「^リビジョンパラメータのサフィックスは、そのコミットオブジェクトの最初の親を意味します」。
VonC、2015年

15

コミット範囲BをDに(少なくともgitバージョン2では)単一のコミットで元に戻したい場合は、次のようにすることができます。

 git revert -n B^..D

これにより、Bの親コミット(除外)からDコミット(含まれる)へのコミットによる変更が元に戻されますが、元に戻された変更でコミットは作成されません。元に戻す操作では、作業ツリーとインデックスのみが変更されます。

変更をコミットすることを忘れないでください

 git commit -m "revert commit range B to D"

同じ方法を使用して、1つのコミットで関連のない複数のコミットを元に戻すこともできます。たとえば、BとDを元に戻すが、Cは元に戻さない

 git revert -n B D
 git commit -m "Revert commits B and D"

参照: https //www.kernel.org/pub/software/scm/git/docs/git-revert.html

Honza Haering訂正に感謝


3
git revert -n B..DコミットBを元に戻さず、CとDのみを元に戻しgit revert -n B^..Dます。B も元に戻し ます。
Honza Haering 2017

gitのドキュメントによると、それはそうです。投稿の参照
2017

1
リファレンスでこの例(少し混乱すると思います)を参考にするgit revert -n master~5..master~2と、5番目に最新のコミットが含まれていることがわかります。しかしmaster~5、実際には6番目に新しいコミットです。記法に関する詳細情報については、git docsのリビジョン選択を参照してください..:-)
Honza Haering

6

している git revert OLDER_COMMIT^..NEWER_COMMITうまくませんでした。

私が使用しgit revert -n OLDER_COMMIT^..NEWER_COMMIT、すべてが良好です。私はgitバージョンを使用してい1.7.9.6ます。


私は同じ問題を抱えており、-nを使用して修正しましたが、^はOLDER_COMMIT(git revert -n OLDER_COMMIT ^ .. NEWER_COMMIT)のままにしておきます。
FeelGood

@FeelGoodなぜあなたは^を残すべきか?
オーランド

履歴A-> B-> Cがあり、目標はBとCを元に戻すことでした。「git revert -n B..C」を実行すると、Cのみが元に戻りました。「git revert -n B ^ .. C」を使用すると、gitは両方のコミットを元に戻しました。多分私は何か間違ったことをしました。
FeelGood

クールですが、テストする必要がありますが、私の場合はうまくいったと思います(1コミットの範囲を元に戻していなかった場合は笑)。答えを^を含むように変更します。ありがとう
オーランド

2
-nまたは--no-commit、単一の範囲全体のすべての変更を元に戻しますオプションは、すべてが範囲内にコミットのコミットの代わりに元に戻すを作成するので、コミット。最終結果は同じで、同じ変更が元に戻されます。gitの履歴をどのように表示するかによって異なります。
デニス

0

git rebase -i関連するコミットを1つにまとめるために使用します。その後、元に戻すコミットが1つだけあります。


7
git rebaseを使用している場合は、単にコミットを削除できます。コミットFのSHA1を同じにしたいなど、リベースしない理由があると思います。
–PaŭloEbermann、2011

5
または、元に戻すコミットを1つに潰します。
aeosynth 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.