`git push` 후 로컬 및 원격에서`git commit`을 실행 취소하는 방법


242

나는 git commit다음에 수행 했다 git push. 로컬 및 원격 리포지토리 모두에서 해당 변경 사항을 되돌리려면 어떻게해야합니까?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

답변:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(예 : 푸시 git push -f origin bugfix/bug123)

마지막 커밋을 취소하고 업데이트 된 기록을 원격으로 푸시합니다. -f리모컨에서 업스트림 기록을 교체 하고 있기 때문에 를 전달해야합니다 .


24
또는을 사용하십시오 git reset --hard <the-sha-you-want-to-return-to>.
Alexander Groß

2
참조는 HEAD (대소 문자 구분)
dunni

26
또한 다른 사람들이 저장소에서 가져온 경우 AFAIK를 사용하면 안됩니다.
Amadan

1
@BipinVayalu 현재 사용중인 지점에 영향을줍니다. 더 정확하게는 HEAD. HEAD는 가장 자주 분기에 "첨부"됩니다 (커밋을 직접 가리키는 대신 분기 이름을 가리킴). 따라서 일반적으로 HEAD가 가리키는 지점에 영향을 미칩니다. git log --decorate --onelineHEAD가 가리키는 곳을 찾는 데 사용하십시오 .
Alexander Groß

4
git reset HEAD~1변경 사항이 사라지지 않게하려면 (무단계 변경). 변경, 커밋 및 다시 푸시git push -f [origin] [branch]
softvar

161

일반적으로 다음을 사용하여 "역"커밋을 만듭니다.

git revert 364705c

그런 다음 평소처럼 리모컨으로 보냅니다.

git push

커밋은 삭제되지 않습니다. 추가 커밋은 첫 번째 커밋이 수행 한 모든 작업을 취소합니다. 특히 변경 사항이 이미 전파 된 경우 실제로 안전하지 않은 다른 모든 것.


9
이 답변은 Alexander Groß (선택된 답변)보다 더 안전합니다 (아마도 더 낫습니다).
Graeck

6
@Graeck 솔루션은 모두 그 의미와 장점이 있습니다.
Alexander Groß

5
이것은 대답이되어야합니다. 팀과 공동 작업하는 경우에는 역사를 덮어 쓰지 않는 것이 가장 좋습니다. git reset변경 사항을 여전히 서버로 푸시하지 않은 경우에만 승인됩니다.
Josue Alexander Ibarra

17
@JosueIbarra 모든 경우에 동의하지 않습니다. 대부분의 경우 기록을 덮어 쓰지 않아야합니다. 그러나 나는 당신이 반드시해야 할 합법적 인 경우가 있다고 생각합니다. 예를 들어, 실수로 비밀 파일을 커밋하고 푸시합니다. 그것은 git repo에 있지 않아야합니다. 허용 된 답변을 사용하여 신속하게 제거 할 수 있습니다.
bfcoder

11
@bfcoder "비밀"을 원격 저장소로 푸시하면 더 이상 비밀이 아닙니다. 그리고 올바른 해결책은 실수를 숨기려고 시도하지 않고 새로운 비밀을 만드는 것입니다.
erbsman

41

우선, 휴식을 취하십시오.

"우리가 통제 할 수있는 것은 없습니다. 우리의 통제는 단순한 환상입니다. "

실수로 코드를 (으)로 푸시했습니다 remote-master. 이것은 괜찮을 것입니다.

1. 처음에는 SHA-1반환하려는 커밋 값을 가져 옵니다 (예 : 마스터 브랜치에 커밋). 이것을 실행하십시오 :

git log

각 커밋과 함께 문자열과 같은 'f650a9e398ad9ca606b25513bd4af9fe ...'무리가 표시됩니다. 되돌아 가려는 커밋에서 해당 번호를 복사합니다 .

2. 이제 아래 명령을 입력하십시오 :

git reset --hard your_that_copied_string_but_without_quote_mark

"HEAD is now at"과 같은 메시지가 나타납니다. 당신은 분명하다. 방금 수행 한 작업은 해당 변경 사항을 로컬에 반영하는 것입니다.

3. 아래 명령을 입력하십시오 :

git push -f

당신은 다음과 같이 보일 것입니다

"경고 : push.default가 설정되어 있지 않습니다. 암시 적 값이 ..... ...에서 변경되었습니다. 총 0 (델타 0), 재사용 된 0 (델타 0) ... ... your_branch_name-> 마스터 (강제 업데이트) "

자, 당신은 모두 분명합니다. "git log"로 마스터를 다시 확인하십시오. fixed_destination_commit이 목록의 맨 위에 있어야합니다.

당신은 환영합니다 (사전;))

최신 정보:

이제이 모든 것이 시작되기 전에 변경 한 내용이 사라졌습니다. 이러한 노력을 다시 되돌리려면 가능할 것입니다. git refloggit cherry-pick 명령 덕분 입니다.

이를 위해, 나는 다음과 기쁘게 제안 이 블로그 또는 이 게시물을 .


"git push -f"를 수행 할 때 리모트와 브랜치를 지정하는 것도 좋은 방법이지만 "git push -f"는 대부분의 시간에 작동합니다
Robson

8

git reset HEAD~1변경 사항이 사라지지 않게하려면 (무단계 변경). 변경, 커밋 및 다시 푸시git push -f [origin] [branch]


3

대화식 리베이스를 수행 할 수 있습니다.

git rebase -i <commit>

기본 편집기가 나타납니다. 제거하려는 커밋이 포함 된 행을 삭제하여 해당 커밋을 삭제하십시오.

물론이 변경 사항을 적용하려면 원격 저장소에 액세스해야합니다.

이 질문을 참조하십시오 : 힘내 : 저장소에서 선택된 커밋 제거


3

사용해보십시오

git reset --hard <commit id> 

참고 : 커밋 ID는 커밋하려는 ID이지만 재설정하려는 ID는 아닙니다. 이것이 내가 붙어있는 유일한 지점이었습니다.

그런 다음 밀어

git push -f <remote> <branch>

2

또는

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

오리진 원격 저장소의 마스터 브랜치를 마지막 커밋의 상위로 강제

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