원격 저장소로 푸시 된 Git의 특정 커밋을 실행 취소하십시오.


788

특정 커밋을 취소하는 가장 간단한 방법은 다음과 같습니다.

  • 머리 나 머리에 없다
  • 리모컨으로 밀었습니다.

최신 커밋이 아닌 경우

git reset HEAD

작동하지 않습니다. 리모컨으로 밀렸 기 때문에

git rebase -i

git rebase --onto

리모컨에 문제가 발생할 수 있습니다.

더구나, 나는 역사를 정말로 수정하고 싶지 않습니다. 잘못된 코드가 있으면 기록에 있었고 볼 수 있습니다. 나는 단지 작업 복사본에서 그것을 원하고 리버스 병합 커밋을 신경 쓰지 않습니다.

즉, Git 은 다음 svn 명령과 동일합니다.

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

새 개정으로 해당 개정의 모든 변경 사항을 역 병합하여 295에서 302 로의 모든 변경 사항을 제거합니다.

svn merge -c -302 ^/trunk

물론 해당 커밋의 변경 사항을 역으로 병합하는 다른 커밋을 추가하여 302 커밋을 취소합니다.

나는 그것이 Git에서 상당히 간단한 작업이어야하고 상당히 일반적인 사용 사례라고 생각했다. 원자 커밋의 다른 점은 무엇입니까?

스테이징이 준비 되어 있으며 커밋이 완벽하게 원 자성을 갖도록하기 위해 하나 이상의 원자 커밋을 쉽게 취소 할 수 없습니까?

답변:


1210

git log을 사용 하여 커밋의 해시를 식별 한 다음을 사용 git revert <commit>하여 이러한 변경 사항을 제거하는 새 커밋을 만듭니다. 어떤면에서는 git revert그 반대입니다 git cherry-pick. 후자는 패치가없는 분기에 패치를 적용하고, 전자는 패치가있는 분기에서 패치를 제거합니다.


237
그리고 당신은 코드 등을 원하는 경우 -n 스위치를 사용하지만, 다시 자동으로 커밋되지
jaygooby

17
"m"옵션의 기능은 무엇입니까? git revert 8213f7d를 시도했지만 대신 이것을 얻었습니다. 오류 : Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30은 병합되었지만 -m 옵션이 제공되지 않았습니다. 치명적인 : 되돌리기 실패
말콤

10
병합을 되돌리려면 : 자식 되돌리기 -m 1 <해시>
brunozrk

31
병합을 되돌리려는 사람에게 경고 : git revert는 모든 데이터 변경 사항을 취소하지만 파일 변경 사항은 되돌려집니다. 그러나 병합은 여전히 ​​히스토리에 남아 있습니다. 이 때문에 나중에 동일한 브랜치를 병합하려고하면 되돌리기 병합 전에 병합 브랜치의 커밋이 포함되지 않습니다. 이것은 당신이 원하는 것이 아닐 것입니다. 분기를 다시 완전히 병합하려면 먼저 원래 병합을 되 돌린 커밋을 되돌려 야합니다. 여기에서 자세히 알아보십시오 : kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/…
etreworgy

3
@etreworgy의 코멘트 링크는 404입니다. 이것이 링크의 최신 버전 인 것 같습니다. kernel.org/pub/software/scm/git/docs/howto/…
Tim Smith

368

나는 자동 커밋을 git revert좋아하지 않으므로 일부에게는 도움이 될 수 있습니다.

방금 수정 된 파일을 원하는 경우 자동 - 커밋하지 , 당신은 사용할 수 있습니다--no-commit

% git revert --no-commit <commit hash>

어느 것과 동일 -n

% git revert -n <commit hash>

9
다니지 git reset HEAD~1 --soft않고 이미 복귀 한 경우 에도 가능합니다-n
Daniel

1
그러나 git reset HEAD~n머리에서 지속적으로 도달 할 수없는 커밋의 실행 취소는 해결하지 못합니다. 쿼리는 특정 커밋을 되 돌리는 것입니다.
sangeethkumarp

이 솔루션을 사용했지만 되돌리기 도중 충돌이 발생했습니다. 갈등을 해결 한 후 나는 git revert --continue지시대로 행동 했다. 그것은 효과가 있었지만 슬프게도 결과를 커밋했습니다. 어쩌면 내가해야 할 것 git revert --no-commit --continue입니다.
mareoraft

1
@sangeethkumarp Daniel의 코멘트는 git revert잊어 버린 경우에 따라 수행 할 수있는 추가 단계입니다 -n. 마지막 커밋 그 시점에서이 복귀이기 때문에, 소프트 리셋 있도록 커밋이 취소 것이지만 되돌리기 아닌 관련 코드 변경
올리버

@Daniel 나를 위해 주석 작업으로 솔루션을 제공하는 덕분에 많은 ''자식 리셋 HEAD ~ 1 --soft ''
. 메릴랜드 아부 사예드

41

이미 푸시되었으므로 기록을 직접 조작해서는 안됩니다. git revert커밋 기록을 조작하지 않도록 새 커밋을 사용하여 커밋에서 특정 변경 사항을 되돌립니다.


1

되돌리려는 커밋이 병합 된 커밋 (이미 병합 된 경우)이면 아래와 같이 -m 1또는 -m 2옵션 중 하나를 선택 해야합니다 . 이것은 병합 된 커밋의 어떤 부모 커밋을 사용할지 git에 알려줍니다. 자세한 내용은 여기를 참조하십시오 .

  • git revert <commit> -m 1
  • git revert <commit> -m 2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.