Github 및 로컬에서 마지막 n 커밋을 삭제하는 방법은 무엇입니까?


127

내 GitHub 리포지토리 중 하나에서 마지막 2 개의 커밋을 삭제하려고합니다. 제안 나는 시도했습니다 여기에 : git push -f origin HEAD^^:master. 마지막 두 커밋이 제거되어 작동하는 것 같습니다.

그런 다음로 로컬 저장소에서 삭제했습니다 git rebase -i HEAD~2. 해당 커밋과 관련된 줄을 제거하고 git log올바르게 제거되었는지 확인 합니다.

그런 다음 로컬 리포지토리를 변경하고 새로운 커밋을 한 다음 GitHub로 푸시합니다. 문제는 내 GitHub 계정에서 삭제하려고 시도한 이전 두 커밋이 있다는 것입니다.

문제는 로컬 리포지토리에 있다고 생각합니다 .Github 리포지토리를 로컬에 복제하고 여기에서 약간의 변경을 수행하면 새 커밋을 푸시 할 때 이전 커밋이 GitHub에 푸시되지 않기 때문에.

어떤 생각?

답변:


199

로컬에서 마지막 두 커밋을 제거하려면 다음을 사용하는 것이 좋습니다.

git reset --hard HEAD^^

Rebase는 여기서 전혀 도움이되지 않는 완전히 다른 작업입니다.


23
이미이 변경 사항을 원격 저장소로 푸시 한 경우 당신은 자식 푸시 -f으로 제거 할 수 있습니다
이반 페르난데스에게

마지막 n 개의 커밋에 대해 이것을 일반화 할 수 있습니까?
user_19

6
@ user_19 당신은 git reset --hard HEAD^4또는 같은 일을 할 수 있습니다 git reset --hard HEAD~4. 그러나 기록에 병합이 포함되어 있으면 상황이 약간 복잡해질 수 있습니다. 개정판 지정에 대한 자세한 내용은 여기 에서 해당 섹션을 참조 하십시오 .
KL-7

2
지난 7 개의 커밋을 삭제하려면 ?? 내가 HEAD 후 7 번 ^를 넣어해야합니까 ... 저를 취소하십시오
가갠 가미

4
@GaganGami, 나는 당신이 할 것이라고 생각 git reset --hard HEAD~7하지만, 내가 틀렸다면 나를 정정하십시오.
Con Antonakos

105

마지막 커밋 2 개를 제거하려면 쉬운 명령이 있습니다.

git reset --hard HEAD~2

2제거하려는 마지막 커밋 수를 변경할 수 있습니다 .

그리고이 변경 사항을 원격으로 푸시 git push하려면 force ( -f) 매개 변수 를 사용해야합니다 .

git push -f

그러나 제거하려는 커밋 후에 원격 (Github)에 새로운 커밋 이있는 경우 명령 이나 관련 옵션 을 사용 하지 않는 것이 좋습니다 . 이 경우 항상을 사용하십시오 .git-f--hardgit revert


내가 변경 한 사항이 유지됩니까?
Zuhayer Tahir

@SymfonyUser, 아니요. 당신이 만들었을 때 hard명령을, 당신은 느슨한 이 두 커밋. 변경 사항을 저장 diff하려면 재설정을 적용하기 전에 이러한 커미트 파일을 작성 하십시오.
Dherik

3
@ZuhayerTahir 지난 5 개의 커밋에 대한 커밋 을 취소하려면 git reset HEAD~5사용하지 마십시오 hard. 이렇게하면 변경 사항을 준비된 상태 (즉, 커밋되지 않음)로 얻을 수 있습니다. 나를 위해이 답변을 참조하십시오 .

@Honey 귀하의 답변에 감사드립니다. 나는 같은 결론에 도달했다.
Zuhayer Tahir

29

다음은 나를 위해 작동합니다.

git reset HEAD~n

하나만 제거 n하므로 로컬 저장소에서 마지막 커밋을 HEAD^제거합니다. 리모컨에서 이러한 변경 사항을 제거해야하는 경우 리모컨 뒤에있을 때 강제로 밀어야 할 수도 있습니다.

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