web-dev-qa-db-ja.com

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

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

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

私は同等のことをしたい:

git revert B-D

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

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

ここで、FにはB-Dの逆が含まれます。

105
Alex Spurling

Gitのどのバージョンを使用していますか?

Git1.7.2 +でのみサポートされている複数のコミットを元に戻す:詳細については、「 複数回元に戻すを使用した古いコミットへのロールバック 」を参照してください。
現在 - git revert manページ は、currentGitバージョン(1.7.4+)専用です。


OP Alex Spurling はコメントで報告します:

1.7.4へのアップグレードは正常に機能します。
私自身の質問に答えるために、これは私が探していた構文です。

git revert B^..D 

B^は「Bの最初の親コミット」を意味します。これにより、Bを復帰に含めることができます。
見る " - git rev-parse SPECIFYING 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"
141
VonC

1回のコミットでコミット範囲BからD(少なくともGitバージョン2)に戻したい場合は、次のようにします。

 git revert -n B^..D

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

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

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

同じ方法を使用して、単一のコミットで複数の無関係なコミットを元に戻すこともできます。たとえば、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修正

9
Ramast

git revert OLDER_COMMIT^..NEWER_COMMITを実行してもうまくいきませんでした。

git revert -n OLDER_COMMIT^..NEWER_COMMITを使用しましたが、すべて問題ありません。 gitバージョン1.7.9.6を使用しています。

6
Orlando

つかいます git rebase -i関連するコミットを1つにまとめます。次に、元に戻すコミットが1つだけあります。

0
Graham Borland