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

2
gitrevisions 페이지는 'git revert A..D'가 내가 원하는 것을 할 것이라고 제안합니다. : 나는 " 'A..D'을 (를) 찾을 수 없습니다 치명적"오류를 얻을하려고하지만 경우
알렉스 Spurling

답변:


172

어떤 버전의 Git을 사용하고 있습니까?

Git1.7.2 +에서만 지원되는 여러 커밋 되돌리기 : 자세한 내용은 " 여러 번 되돌리기를 사용하여 이전 커밋으로 롤백 "을 참조하세요.
현재 git revertman 페이지현재 Git 버전 (1.7.4+) 전용입니다.


OP Alex Spurling 이 의견에보고 한대로 :

1.7.4로 업그레이드하면 정상적으로 작동합니다.
내 질문에 답하기 위해 내가 찾고 있던 구문은 다음과 같습니다.

git revert B^..D 

B^"B의 첫 번째 부모 커밋"을 의미 B합니다. 이는 되돌리기 에 포함 할 수 있습니다 . 예를 들어 구문 을 포함하는
" git rev-parse개정판 지정 섹션 "을 참조하십시오. 자세한 내용은 " 캐럿 ( ) 문자는 무엇을 의미합니까? ")<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

5
이 답변을 자주 참조하고 순서를 파악하는 데 항상 시간이 걸립니다. 그래서 내 미래를 돕기 위해 :git revert OLDER_COMMIT^..NEWER_COMMIT
Henrik N

2
^은 무엇을 의미합니까?
Dustin Getz

1
@DustinGetz 첫 번째 부모 : git-scm.com/docs/gitrevisions 참조 : " ^개정 매개 변수 의 접미사 는 해당 커밋 객체의 첫 번째 부모를 의미합니다."
VonC

15

단일 커밋에서 커밋 범위 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 에게 감사드립니다.


3
git revert -n B..D커밋 B를 되 돌리지 않고 C와 D 만 git revert -n B^..D되돌립니다. B도 되돌립니다.
Honza Haering

git 문서에 따르면 수행합니다. 게시물 참조
Ramast

1
참조에서이 예제 (약간 혼란 스럽다고 생각)를 참조 git revert -n master~5..master~2하면 다섯 번째 최신 커밋이 포함되어 있다고 말합니다. 그러나 master~5실제로는 6 번째 최신 커밋입니다. 표기법에 대한 자세한 정보는 git 문서의 개정 선택 을 참조하십시오. ..:-)
Honza Haering

6

이렇게 git revert OLDER_COMMIT^..NEWER_COMMIT나를 위해 작동하지 않았다.

나는 사용 git revert -n OLDER_COMMIT^..NEWER_COMMIT했고 모든 것이 좋다. 나는 git version을 사용하고 1.7.9.6있습니다.


나는 똑같은 문제가 있었고 -n을 사용하여 수정했지만 ^를 OLDER_COMMIT로 남겨 두어야합니다 (git revert -n OLDER_COMMIT ^ .. NEWER_COMMIT).
FeelGood 2012

@FeelGood 왜 ^를 떠나야합니까?
올랜도

나는 역사 A-> B-> C를 가지고 있었고 목표는 B와 C를 되 돌리는 것이 었습니다. 'git revert -n B..C'를 실행하면 C 만 되돌 렸습니다. 'git revert -n B ^ .. C'를 사용할 때 git은 두 커밋을 모두 되돌 렸습니다. 내가 뭔가 잘못했을 수도 있습니다.
FeelGood 2012-12-25

시원하고 잘 테스트해야하지만 내 경우에는 잘 작동했다고 생각합니다 (1 커밋 범위를 되 돌리지 않는 한) ^를 포함하도록 답변을 수정할 것입니다. 감사합니다
올랜도

2
-n또는 --no-commit단일의 범위에서 모든 변경 사항을 되돌아갑니다 옵션은 모든이의 범위에 커밋 커밋 대신 되돌리기를 만드는, 커밋합니다. 최종 결과는에서와 동일하며 동일한 변경 사항이 되돌려집니다. git 히스토리가 어떻게 보이기를 원하는지에 달려 있습니다.
Dennis

0

git rebase -i관련 커밋을 하나로 스쿼시하는 데 사용 합니다. 그런 다음 되돌릴 하나의 커밋 만 있습니다.


7
git rebase를 사용하는 경우 커밋을 간단히 제거 할 수 있습니다. 커밋 F의 SHA1을 동일하게 유지하려는 것과 같이 리베이스하지 않는 이유가 있다고 생각합니다.
Paŭlo Ebermann 2011 년

5
또는 되돌리기 커밋을 하나로 스쿼시하십시오.
aeosynth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.