변경 사항을 잃지 않고 마지막으로 푸시되지 않은 git commit을 커밋 해제하는 방법


539

내 로컬 사본 해당 커밋에서 작성된 변경 사항을 유지 하지만 작업 사본에서 커밋되지 않은 변경 사항이 되도록 커밋을 되 돌리는 방법이 있습니까? 커밋을 롤백하면 이전 커밋으로 이동합니다. 변경 사항을 유지하고 싶지만 잘못된 브랜치에 커밋했습니다.

이것은 밀리지 않았으며 커밋되었습니다.



6
git reset --soft그리고 git reset --mixed둘 다, (약간 다르게) 이렇게 볼 자식 리셋
torek

답변:


930

예를 들어, 여러 가지 방법이 있습니다.

커밋을 아직 공개적으로 푸시 하지 않은 경우 :

git reset HEAD~1 --soft   

즉, 커밋 변경 사항이 작업 디렉토리에있는 반면 LAST 커밋은 현재 분기에서 제거됩니다. git reset man 참조


경우에 당신은 ( '마스터'라는 분기)에 공개적으로 푸시 :

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

커밋을 정상적으로 되돌리고 푸시

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

이제 작업 복사본에서 로컬 변경 사항을 적용하면서 변경 사항을 원한다면 ( "로컬 복사본이 해당 커밋에서 변경 사항을 유지하도록") --no-commit옵션을 사용 하여 되돌리기 커밋을 되 돌리십시오 .

git revert --no-commit 86b48ba (hash of the revert commit).

나는 작은 예를 만들었습니다 : https://github.com/Isantipov/git-revert/commits/master


5
정말 고마워요. 제 경우에는 취소하고 싶은 커밋이 두 개 있었고 'git reset HEAD ~ 1 --soft'를 두 번 연속 실행하면 필요한 곳에 도달했습니다.
Geoff Gunter

2
CLI를 사용하지 않는 경우에 대한 약간의 명확성을 추가하기 위해 reset언급 된 첫 번째 명령은 "부드럽게"헤드 이전에 1 rev로 재설정하여 모든 로컬 변경 사항을 유지하는 것입니다. 이것은 SourceTree에서 사용하기 위해 즉시 나에게 분명하지 않았습니다. 재설정하려는 개정이 아닌 이전 개정으로 소프트 재설정하고 있는지 확인하십시오.
Jon B

1
"이미 푸시"접근 방식을 시도했지만 git 2.14.1에서는 작동하지 않습니다 "Already up to date". 병합을 수행 할 때 나타납니다.
Fabio A.

1
@FabioA. , 작업 버전으로 답변을 업데이트했습니다. 이것을 알아 주셔서 감사합니다!
Isantipov

1
작동하지 않습니다. 나는 리셋과 커밋을 건너 뛰고 git revert와 push 만했다 ... 지금은 변경 사항이 확실하지 않을 수도 있습니다 ... 다행히도 백업이 여전히 쉽게 작동 할 수있는 쉬운 방법을 만들었습니다. 그렇지 않으면 그 변경 사항을 복사 할 수 있습니다 .
Skybuck Flying

13

변경 사항을 적용한 경우 undo다른 분기를 사용하지 않고 변경 사항을 적용 하고 파일을 다시 스테이지로 이동할 수 있습니다 .

git show HEAD > patch
git revert HEAD
git apply patch

마지막 분기 변경 사항이 포함 된 패치 파일을 만듭니다. 그런 다음 변경 사항을 되돌립니다. 마지막으로 패치 파일을 작업 트리에 적용하십시오.


당신은 싶어 할 수 rm patch
최대 코플란

6

사례 : "이것은 푸시되지 않았으며 커밋되었습니다 ." - 당신이 사용하는 경우 인 IntelliJ (또는 다른 JetBrains의 IDE)을하고 아직 변경을 추진하지 않은 당신은 다음에 할 수 있습니다.

  1. 버전 관리 창 ( Alt + 9 / Command + 9 )- "로그"탭으로 이동하십시오.
  2. 마지막 커밋 전에 커밋을 마우스 오른쪽 버튼으로 클릭하십시오.
  3. 현재 분기를 여기로 재설정
  4. 소프트 선택 (!!!)
  5. 대화 상자 창에서 재설정 버튼을 누릅니다.

끝난.

변경 사항을 "커밋 해제"하고 git 상태를 마지막 로컬 커밋 이전 지점으로 되돌립니다. 변경 한 내용은 손실되지 않습니다.


2
나는 JetBrains 방식을 배우는 것을 좋아합니다. 감사합니다! 그것은 git reset --soft "HEAD^"Windows의 btw 와 같습니다 . :)
payne

3

나와 함께 주로 잘못된 지점으로 변경 사항을 푸시하고 나중에 깨닫게됩니다. 그리고 다음과 같은 대부분의 시간에 작동합니다.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. 커밋을 되 돌리다
  2. 다른 지사를 생성 및 체크 아웃
  3. 되돌리기를 되돌리기

1
나는 이것을 테스트했다. 원격으로 밀지 않은 경우에도 접근 방식이 작동합니다. $ git revert <commit-hash> ... 그런 다음 다른 분기를 체크 아웃 한 다음 $ git revert <revert-commit-hash>를 입력하십시오. 이 간단한 접근법을 공유해 주셔서 감사합니다 !!
Natalie Cottrill

1

이 명령을 별도의 폴더에서 실행하기 전에 변경 사항을 백업하십시오

자식 체크 아웃 branch_name

지점에서 결제

자식 병합-중단

병합 중단

자식 상태

병합 중단 후 코드 상태 확인

git reset --hard origin / branch_name

이 명령은 변경 사항을 재설정하고 코드를 branch_name (분기) 코드에 맞 춥니 다.


1

2020 간단한 방법 :

git reset <commit_hash>

유지하려는 마지막 커밋의 해시를 커밋하십시오.

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