푸시되지 않은 자식 커밋 제거


722

나는 그것을 git commit했지만 저장소에 아직 푸시하지 않았다. 그래서 내가 할 때 git status'# 당신의 지점은 1 커밋으로'마스터 '보다 앞서 있습니다.

따라서 최고 커밋을 롤백하려면 다음을 수행하십시오.

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

내가 할 때 주어진 git log:

커밋 eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
날짜 : 9 월 29 일 (화) 11:21:41 2009 -0700


커밋 db0c078d5286b837532ff5e276dcf91885df2296
날짜 : 9 월 22 일 화요일 10:31:37 2009 -0700

9
이 질문은 귀하의 다른 질문과 중복되는 것 같습니다 : stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
위험 : reset --hard로컬 파일 (새 작업)을 웹의 파일 (나에게 발생 함)로 덮어 쓰는 작업으로 인해 작업 손실이 발생할 수 있습니다. git에 대한 질문과 답변은 명령이 수행하는 작업과 독자가 따르는 위험에 대해 명시 적으로 설명해야합니다.
OrangeSherbet

답변:


673

실제로을 사용할 때는 git reset재설정 하려는 커밋을 참조해야 합니다 . db0c078커밋 을 원할 것입니다.

더 쉬운 버전은 git reset --hard HEAD^현재 헤드 이전의 이전 커밋으로 재설정하는 것입니다 . 그렇게하면 커밋 ID를 복사 할 필요가 없습니다.

git reset --hard커밋되지 않은 변경 사항을 잃을 수 있으므로을 수행 할 때주의하십시오 . 당신은 확인 할 수 git status있는지 당신의 작업 복사본이 깨끗한 지, 또는 당신이 거기있는 모든 변경 사항을 날려 싶지 않음을 확인합니다.

또한 HEAD 대신 origin/master주석에서 @bdonlan이 제안한대로 참조로 사용할 수 있습니다 .git reset --hard origin/master


374
또는 git reset --hard origin/master, 원점에 관계없이 재설정하십시오.
bdonlan

1
재설정 할 수있는 또 다른 유용한 포인터는 ORIG_HEAD 또는 reflog HEAD @ {1} (HEAD의 마지막 위치)를 사용하는 일반화입니다.
Jakub Narębski

12
git reset코드를 읽기 전에 독자 . 차이 : 미래의 자기 부탁을 reset, reset --soft그리고 reset --hard당신의 이전은 어떻게됩니까 ( git add일명 "작업":) 사진 : 링크
user18099

3
이렇게하면 제거하려는 커밋에 있던 내용이 삭제되므로 git status변경 사항이 표시되지 않고 커밋이 제거됩니다 / 변경 내용이 손실됩니다.
Bjørn Børresen

12
참고 : git reset --hard HEAD^커밋 된 파일의 변경 내용이 손실되므로 변경 내용이 삭제 되므로 사용시주의하십시오 . 이 질문에는 두 가지가 있습니다 : 커밋을 되돌 git reset --soft HEAD~1
리지만

625

변경 사항을 원격으로 푸시하지 않은 경우

git reset HEAD~1

로 작업 복사본이 깨끗한 지 확인하십시오 git status.

그렇지 않으면 변경 사항을 원격으로 푸시했습니다

git revert HEAD

이 명령은 마지막 커밋 / 변경을 되돌 리거나 제거 한 다음 푸시 할 수 있습니다


34
"밀어되지 않은 커밋 자식 최신 제거"이 답변 (가장 가까운 응답 IMHO)
피에르 드 LESPINAY

25
또한 마지막 커밋에서 로컬 변경 사항을 유지하지만 git reset –hard does
Stanimir Stoyanov

1
나를 위해, 그것은 마지막 푸시 커밋과 푸시되지 않은 커밋을 취소합니다
CodyChan

git revert HEAD는 방금 밀어 넣을 준비가 된 모든 파일을 삭제했습니다. 조심해!
Jason Bruce

159
git reset --hard origin/master

원점에 관계없이 재설정하십시오.

이것은 코멘트 에 @bdonlan에 의해 게시되었습니다 . 댓글을 읽지 않는 사람들을 위해이 답변을 추가했습니다.


4
이 질문은 거의 5 년 전에 제기되었으며, 이것은 이미 의견 중 하나에 있습니다.
Anubian Noob

1
현재 지역 지점과 다른 경우 어떻게 master해야 origin/mybranch합니까?
Pavel Vlasov

9
내가 대답으로 퍼팅을 위해 ... 대답을 서둘러 감사있을 때 나는 보통 주석을 읽지 않는다 (단순 하나 그 작품)
레오나르도 알베스 마차도

경고 : git reset HEAD~커밋을 코드로 다시 설정하는 것 외에는 기존의 모든 코드 변경 사항이 제거됩니다.
Mayer Spitzer

69

이 질문에는 두 가지가 있습니다 (커밋을 롤백한다고해서 모든 로컬 변경 사항을 잃고 싶지는 않습니다)

1. 커밋 된 파일에서 최신 커밋을 되돌리고 변경 사항 을 취소하려면 다음을 수행하십시오.

git reset --hard HEAD~1

2. 최신 커밋을 되돌 리지만 로컬 변경 사항 (디스크)을 유지하려면 다음을 수행하십시오.

git reset --soft HEAD~1

이것은 (나중의 명령) 당신이했을 경우의 상태로 당신을 데려 갈 것 git add입니다.

그 후에 파일을 스테이지 해제하려면

git reset

이제 추가하고 다시 커밋하기 전에 더 많은 변경을 할 수 있습니다.


47

콘솔에 간단히 입력하십시오.

$ git reset HEAD~

이 명령은 원격 HEAD에 앞서 모든 로컬 커밋을 삭제합니다.


7
기존 답변에 대한 답변이 무엇인지 설명 할 수 있습니까?
nvoigt

다른 답변처럼 - - 로컬 당신이 만든 변화를 되 돌리는없이 - 이것은 현재 이전 추진 저지 웁니다 심각한 머리를 철수 순간이 될 수있는
그랜트

42

나는 그 중 하나가 당신의 필요에 맞을 것이라고 믿습니다.

1-커밋을 취소하고 모든 파일을 준비된 상태로 유지하십시오. git reset --soft HEAD~;

2-커밋 실행 취소 및 모든 파일 준비 해제 : git reset HEAD~;

3-커밋을 취소하고 모든 변경 사항을 완전히 제거하십시오. git reset --hard HEAD~;

여기에 답을 찾았습니다


이 답변을 받아 들여야합니다. D
Aaron John Sabu

30

푸시하기 전에 마지막 커밋을 제거하십시오.

git reset --soft HEAD~1

1마지막으로 당신이 개 마지막으로 사용을 제거 할 경우, 커밋 의미 2등, 그리고 *


3
안녕하세요 카리나에 대한 언급은 --soft가능한 답변에 큰 도움이되지만 그 이유도 언급 할 수 있습니까? 솔루션을 설명하는 것이 항상 도움이됩니다. 또한 영어를 고수하십시오. 감사합니다
Vlastimil Ovčáčík

1
--soft-커밋을 취소하려는 파일의 변경 사항을 잃지 않도록합니다.
papigee

19

나는 이보다 훨씬 쉬운 상황을 경험했다. 전달 commit-Id하면 원하는 커밋에 도달 할 수 있습니다.

git reset --hard {commit-id}

마지막 커밋을 제거 commit-Id하려면 포인터를 이동 해야하는 위치 를 전달 해야합니다.

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

나 자신과 같은 초보자에게는 경고-변경 사항을 유지하려는 파일은 이전 버전으로 되돌릴 수 있으므로 백업하십시오. 내 시나리오는 실수로 내 저장소 디렉토리에 데이터베이스 덤프를 넣은 다음 커밋했습니다. 분명히 해당 파일을 저장소에 커밋하고 싶지는 않지만 DID는 다른 파일에 대한 변경 사항을 유지하려고합니다. 따라서 git reset을 수행하기 전에 백업에서 필요한 변경 사항을 복사하여 붙여 넣어야했습니다.
user1063287 2016 년

10

이것이 제가하는 것입니다:

먼저 지점을 확인하십시오 (내 사례 master지점의 경우 ).

git checkout master

그런 다음 원격 HEAD ^로 재설정 하십시오 (모든 로컬 변경 사항이 제거됩니다 ).

git reset HEAD^ --hard && git clean -df && git pull

1
매우 핵 옵션입니다. 제한된 커밋으로 소프트 리셋을 제안합니다.
c0der512

3

한 가지 방법은 로컬 브랜치를 삭제하고 로컬 브랜치가 여러 커밋으로 원격보다 앞서 있고 모든 커밋을 해제 해야하는 경우 서버에서 해당 브랜치를 체크 아웃하는 것입니다.


훌륭한 답변-sourcetree에서 쉽게 클릭 할 수 있습니다 :)
Kamil Kiełczewski

1

나는 방금 같은 문제가 있었고 결국 일을했다.

git rebase -i HEAD~N

(N은 커밋의 수가 git에서 보여줍니다)

텍스트 편집기가 표시되고 연결된 줄을 삭제하여 원하는 커밋을 제거 할 수 있습니다.

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