되 돌린 Git 커밋을 "복귀 취소"하려면 어떻게합니까?


485

을 사용하여 커밋 된 commit다음을 사용하여 되 돌린 변경 사항 revert이있는 경우 해당 되돌리기를 실행 취소하는 가장 좋은 방법은 무엇입니까?

이상적으로는 기록을 다시 쓰지 않도록 새로운 커밋으로 수행해야합니다.



@phuclv 중복 가능성에 대한 의견은 여기에 있습니다. 하나는 원본으로 표시되고 다른 하나는 중복으로 표시되어야합니다.
John Demetriou

@JohnDemetriou 더 나은 답변을 가진 질문은 공개하지 않아야합니다. 여기서 시간은 관련이 없습니다. 중복 질문은 어떻게 처리해야합니까?
phuclv

나는 시간에 대해 말하지 않았다. 방금이 문제에 대해 두 가지 중 하나에 대해 언급 한
적이 있습니다

답변:


385

아직 변경 사항을 적용하지 않은 경우 git reset --hard HEAD^

그렇지 않으면 되돌리기를 되 돌리는 것이 완벽합니다.

또 다른 방법은 git checkout HEAD^^ -- .다음에 git add -A && git commit있습니다.


8
원래 변경 사항을 마스터 브랜치에 즉시 적용하지 않고 되돌리려면 (1) 삭제 된 경우 원래 브랜치를 복원하고 (2) Adam이 언급 한대로 되돌리기 브랜치에서 "복귀" 클릭 한 다음 ( 3) 결과 PR의 헤더에서 "편집"을 클릭하고 대상 분기를 마스터 대신 원래 분기로 변경하십시오. 이제 원래 브랜치를 다시 병합하여 이전에 되 돌린 변경 사항을 적용 할 수 있습니다.
pauljm

1
작업 트리 및 색인의 모든 변경 사항이 제거됩니다. git stash를 사용하여 잃고 싶지 않은 변경 사항을 저장하십시오.
zpon

3
checkout && commit 메소드의 장점은 무엇입니까? 일반적인 경우 git cherry-pick또는 대안 git revert으로 되돌리기를 되 돌리는 가장 간단한 방법 인 것 같습니다 .
Robert Jack Will

5
나는 Otherwise, reverting the revert is perfectly fine.다음을 수행 하는 방법을 보여주는 것이 도움이 될 것이라고 생각합니다 git checkout HEAD^^ -- ..
Todd

3
좋은 주인, 사용하지 마십시오 git add -A... 모든 파일을 버전 제어에 추가하지 않으려는 경우에는 원하는 것이 아닙니다.
Kaitain

473

git cherry-pick <original commit sha>
원래 커밋을 복사하여 본질적으로 커밋을 다시 적용합니다.

되돌리기를 되 돌리면 더 확실한 커밋 메시지와 함께 동일한 작업을 수행합니다.
git revert <commit sha of the revert>

이러한 방법 중 하나를 사용하면 git push되 돌린 후에 새 커밋이 생성되므로 기록을 덮어 쓰지 않아도됩니다.
커밋 sha를 입력 할 때 일반적으로 첫 5 ~ 6 자만 필요합니다.
git cherry-pick 6bfabc


60
이것은 OP 질문에 대한 가장 우아하고 완벽한 솔루션입니다. 커밋 트리의 HEAD에있는 되돌리기 커밋에 대한 가정으로 허용 된 답변보다 훨씬 낫습니다. op는 또한 기록을 다시 작성하지 않는 솔루션을 구체적으로 요청했기 때문에 허용 된 답변에 제공된 어려운 솔루션은 단순히 잘못되었습니다.
Timo

6
@Timo 명확히하기 위해, 허용 된 답변에는 내가 사용한 솔루션 ( "reverting revert")이 포함되어 있으며이 답변 보다 3 년 일찍 명확한 내 질문 시간 내에 게시되었습니다 . 따라서 확인 표시가 나타납니다.
JimmidyJoo

6
@JimmidyJoo 저는 3 년 늦었다는 것을 알고 있습니다. Google 검색에서 사람들이 더 나은 답변을 보길 원했습니다.
Stephan

2
@Stephan Yep을 다시 한 번 밝히려면 문제를 해결하는 데 사용한 것이 아니라 더 나은 대답입니다. 나는 왜 체크 표시가 어디에 있는지에 대해 단순히 언급하고있었습니다. 모두에게 질문 : SO 협약은 과거의 질문을 "유지"하고 새로운 답변이 들어 오면 확인 표시를 다시 할당하도록 지시합니까?
JimmidyJoo

3
@JimmidyJoo 나는 SO 협약에 대해 전혀 모른다. 그러나 Google 검색 자로서 더 나은 답변을 확인하는 것이 좋습니다. 과거의 질문을 유지하려는 모든 사람의 노력에 감사드립니다.
Paiman Roointan

28

되돌리기 커밋은 git의 다른 커밋과 같습니다. 의미는 다음과 같이 되돌릴 수 있습니다.

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

변경 사항을 푸시 한 후, 특히 대상 브랜치 ( 마스터 브랜치에 좋은 아이디어)에 강제로 푸시 할 수없는 경우에만 의미가 있습니다 . 변경 사항이 적용되지 않은 경우 다른 게시물에 따라 체리 픽 선택, 되돌리기 또는 되돌리기 커밋을 제거하십시오.

우리 팀, 우리는 사용하는 규칙이 되돌리기 당신이 되돌립니다 무엇을 커밋 확인할 수 있습니다 그래서, 주로 깨끗한 역사를 유지하기 위해 주요 지점에 최선을 다하고 있었다 되돌리기 커밋에를 :

      7963f4b2a9d   Revert "Revert "OD-9033 parallel reporting configuration"
      "This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
                    ...
     a0e5e86d3b6    Revert "OD-9055 paralel reporting configuration"
     This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
                ...
     Merge pull request parallel_reporting_dbs to master* commit 
    '648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'

이런 식으로, 당신은 역사를 추적하고 전체 이야기를 알아낼 수 있으며, 유산에 대한 지식이없는 사람들조차도 스스로 해결할 수 있습니다. 반면, 물건을 선택 하거나 리베이스하는 경우 ,이 중요한 정보는 손실됩니다 (댓글에 포함하지 않은 경우).

분명히 커밋이 두 번 이상 되 돌렸다가 다시 되돌아 오면 상당히 지저분 해집니다.


14

되돌리기를 되 돌리면 트릭을 수행합니다.

예를 들어

경우 abcdef당신이 커밋하고 ghijkl있는 당신이 커밋 복귀 할 때 당신이 커밋 abcdef다음 실행 :

git revert ghijkl

이것은 되돌리기를 되돌릴 것입니다


4

그것은 바보처럼 보입니다. 그러나 나는 같은 상황에 있었고 되 돌린 커밋을 위해 복귀했다. 나는 숫자 되돌리기를 했으므로 각 'revert commit'에 대해 되돌려 야했습니다.

이제 내 커밋 역사는 조금 이상해 보입니다.

이상한 역사

애완 동물 프로젝트이므로 괜찮습니다. 그러나 실제 프로젝트의 경우 되돌리기 전에 모든 커밋 된 코드를 한 번의 커밋과보다 합리적인 주석으로 복원하기 전에 마지막 커밋을 선호합니다.


4
내 다른 질문에 대한 답변에 관심이있을 수도 있습니다 : stackoverflow.com/questions/10415565/…
JimmidyJoo

2
자동 커밋을 피하고 되돌릴 때 --no-commit 플래그를 사용하여 메시지 커밋을 선택한 다음 관련 메시지로 커밋
David Barda

또한 git revert를 사용할 때 여러 커밋 ID를 지정할 수 있습니다 (제 생각에 올바른 순서 여야 함).
Aalex Gabi

github desktop에서 그렇게 할 수 있습니까?

4

내가 한 방법은 다음과 같습니다
. 분기 my_branchname가 병합 된 병합에 포함 된 경우 되돌 렸습니다. 그리고 나는 되돌리기를 원했다 my_branchname.

나는 먼저 git checkout -b my_new_branchnamefrom을한다 my_branchname.
그런 다음 첫 커밋 직전에 커밋의 커밋 해시를 git reset --soft $COMMIT_HASH어디에서 합니까 (참조 ) 그런 다음 새 커밋을 만든 다음 새 브랜치를 푸시 한 다음 새 브랜치에 대한 풀 요청을했습니다.$COMMIT_HASHmy_branchnamegit log
git commit -m "Add back reverted changes"
git push origin new_branchname


할 "체리 픽"이 너무 많을 때가는 길. 나는 왜이 답변이 그렇게 많은
지지를 받는지 모르겠다

2

또는 당신은 할 수 git checkout -b <new-branch>git cherry-pick <commit>하여에 이전과 git rebase드롭에 revert커밋합니다. 이전처럼 풀 요청을 보냅니다.


1

"리버 트 되돌리기"라는 아이디어가 마음에 들지 않으면 (특히 많은 커밋에 대한 히스토리 정보가 유실되는 경우) 항상 "잘못된 병합 되돌리기" 에 대한 git 문서로 이동할 수 있습니다 .

다음과 같은 시작 상황이 주어지면

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(W는 병합 M의 초기 복귀이며, D와 E는 처음 중단 된 기능 분기 / 커밋에 대한 수정입니다)

이제 커밋 A를 E로 간단히 재생할 수 있으므로 되 돌린 병합에 "포함"되지 않습니다.

$ git checkout E
$ git rebase --no-ff P

이제 지점의 새 사본을 master다시 병합 할 수 있습니다 .

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E

문서 링크에 대한 좋은 생각과 감사합니다. 우리는 일반적으로 다시 병합하기 전에 master로 rebase하지만 git은 A ', B', C '가 이전과 동일하다는 것을 인식하고 W ( pastbin ) 뒤에 D, E가 있습니다. 이 문제를 해결하는 방법에 대한 제안?
Kristoffer Bakkejord

0

커밋 후에 되돌려 진 비 단계적 및 단계적 변경 사항을 되돌리려면 다음을 수행하십시오.

git reset HEAD@{1}

준비되지 않은 모든 삭제를 복구하려면

git ls-files -d | xargs git checkout --
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.