푸시되지 않은 자식 커밋은 어떻게 삭제합니까?


947

실수로 잘못된 지점을 다짐했습니다. 커밋을 어떻게 삭제합니까?

답변:


1809

가장 최근의 커밋을 삭제하고 수행 한 작업을 유지하십시오.

git reset --soft HEAD~1

가장 최근의 커밋을 삭제하여 수행 한 작업 을 삭제하십시오 .

git reset --hard HEAD~1

13
HEAD가 지점을 가리키고 있는지 확인하십시오. (먼저 확인하십시오)
Frank Schwieterman

128
그리고 HEAD ~ 1이 커밋인지 확인하십시오 ... 당신도 할 수있는git reset --hard origin
Daenyth

13
생각 git remote은 나에게 기원을 나열 git reset --hard origin한다고 말한다 fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.. 왜?
trss

7
대단해. 방금 내 생명을 구했습니다.
NinjaBoy

2
git reset HEAD~1또한 모든 변경 사항을 유지하지만 모든 --soft옵션을 유지하는 대신 빈 인덱스로 남겨 둡니다 ( 옵션).
Holloway

139

내가 찾은 최고의 답변이 댓글에만있는 이유가 궁금합니다! (대 니트에 의해 86 위로 투표 )

git reset --hard origin

이 명령은 로컬 리포지토리를 원격 리포지토리와 동기화하여 로컬에서 수행 한 모든 변경 사항을 제거합니다. 다음을 수행하여 원점에있는 정확한 분기를 가져올 수 있습니다.

git reset --hard origin/<branch>

16
설명을 약간 확장 해 주셔서 감사합니다. 특정 지점 :git reset --hard origin/<branch>
cleary

4
또는 git reset --soft origin/<branch>커밋을 제거하고 로컬 작업을 유지하려는 경우.
riverhorse

1
나는 fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.다음과 같이 분기를 지정해야한다.git reset --hard origin/feature/my-cool-stuff
Kip

훌륭한! 이것은 실제로 머리를 분리하고 매달려있는 "허용 된"대답과 달리 작동합니다.

55

삭제하지 마십시오. 단 하나의 커밋 git cherry-pick으로 충분합니다.

그러나 잘못된 브랜치에 여러 커밋 이 있으면 그 곳 git rebase --onto이 빛납니다.

이것을 가지고 있다고 가정 해보십시오.

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

그런 다음 master원하는 위치에 표시 하고 이동할 수 있습니다.

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

y 지점을 재설정해야합니다.

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

마지막으로 커밋을 이동하십시오 (다시 적용하여 실제로 새로운 커밋을 만듭니다).

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

불행히도, 그것은 질문이 아닙니다.
KatariaA

1
@KatariaA 잘못된 분기에서 수행 된 커밋을 삭제하는 올바른 대안이며 동일한 상황에서 다른 사람을 도울 것입니다 (잘못된 분기에서 수행 된 올바른 커밋).
VonC 2019

14

를 수행 git rebase -i FAR_ENOUGH_BACK하고 원하지 않는 커밋 라인을 놓습니다.


6

해당 커밋을 다른 브랜치로 옮기려면 커밋의 SHA를 얻으십시오.

git rev-parse HEAD

그런 다음 현재 분기를 전환

git checkout other-branch

그리고 cherry-pick약속other-branch

git cherry-pick <sha-of-the-commit>

내 경험상, 이것은 원래 지점에서 커밋을 취소하지 않으므로 git reset --hard HEAD~1나중에 필요합니다 . 내가 사용하는 생각 reset --soft다음 지점을 전환하고 다시 저장 한 것이다 추가 작업을 커밋. 그런 다음 다시 SourceTree를 사용하여 대부분의 기본 작업을 수행하고 오류가 발생한 후에 만 ​​명령 줄을 지정했습니다.
jusopi

3

참고로, git reset --hard뿐만 아니라 다음 명령을 사용하여 현재 분기에서 "하드 컷"커밋을 수행 할 수 있다고 생각합니다.

git checkout -B <branch-name> <SHA>

실제로 체크 아웃에 신경 쓰지 않으면 원하는대로 분기를 설정할 수 있습니다.

git branch -f <branch-name> <SHA>

예를 들어 리밋을 사용하여 새로운 커밋을 복사하기 위해 브랜치에서 커밋을 제거하는 프로그래밍 방식입니다.

다른 위치에서 소스를 가져 와서 분기로 덤프했기 때문에 마스터와 연결이 끊어진 분기가 있다고 가정하십시오.

이제 변경 사항을 적용한 지점이 있습니다. "토픽"이라고하겠습니다.

이제 토픽 브랜치를 복제 한 다음 브랜치 "덤프"에있는 소스 코드 덤프에 리베이스하십시오.

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

이제 "덤프"시작점을 기준으로 topic_duplicate 브랜치에 변경 사항이 다시 적용되지만 "마스터"이후에 발생한 커밋 만 다시 적용됩니다. 따라서 마스터 이후 변경 사항은 이제 "덤프"위에 다시 적용되지만 결과는 "topic_duplicate"로 나타납니다.

그런 다음 다음을 수행하여 "덤프"를 "topic_duplicate"로 바꿀 수 있습니다.

git branch -f dump topic_duplicate
git branch -D topic_duplicate

또는

git branch -M topic_duplicate dump

아니면 그냥 덤프를 버려서

git branch -D dump

현재 "topic_duplicate"를 지운 후에 체리 픽을 선택했을 수도 있습니다.

내가 말하려고하는 것은 현재를 업데이트 할 경우 지점은 당신이 먼저 수행하여 커밋을 "cherrypicked"이전에 삭제해야 다른 조상의 기반으로 "중복"이다 git reset --hard <last-commit-to-retain>또는 git branch -f topic_duplicate <last-commit-to-retain>다음 주부터 (이상 다른 커밋을 복사 토픽 브랜치)

리베이스는 이미 커밋이있는 브랜치에서만 작동하므로 원할 때마다 토픽 브랜치를 복제해야합니다.

체리 픽킹은 훨씬 쉽습니다.

git cherry-pick master..topic

따라서 전체 시퀀스는 다음과 같습니다.

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

주제 중복 브랜치가 체크 아웃 된 경우 그러면 현재 복제본에서 이전에 고른 커밋이 제거되고 현재 "덤프"(다른 조상) 위에 "주제"에서 발생하는 모든 변경 사항이 다시 적용됩니다. 다른 "다운 스트림"마스터를 사용하여 로컬 변경 사항이 여전히 그에 적용되는지 확인하기 위해 개발을 "실제"업스트림 마스터를 기반으로하는 합리적으로 편리한 방법 인 것 같습니다. 또는 diff를 생성 한 다음 Git 소스 트리 외부에 적용 할 수 있습니다. 그러나 이런 방식으로 배포의 버전을 기반으로하는 최신 수정 된 (패치 된) 버전을 유지하면서 실제 개발은 실제 업스트림 마스터에 반할 수 있습니다.

따라서 다음과 같이 설명하십시오.

  • reset은 분기가 다른 커밋을 가리 키도록합니다 (-이전 커밋도 확인합니다. --soft는 추가 된 파일을 인덱스에 유지하고 (다시 커밋하면 커밋 됨) 기본 (--mixed)은 그렇지 않습니다. 이전 커밋을 확인하고 (로컬 변경 내용을 지우십시오) 인덱스가 지워집니다 (아직 커밋을 위해 아무것도 추가되지 않았습니다)
  • 지점이 다른 커밋을 가리 키도록 할 수 있습니다.
  • 커밋을 즉시 확인하면서 그렇게 할 수 있습니다.
  • rebasing은 현재 브랜치에있는 커밋에서 작동합니다.
  • 체리 따기는 다른 지점에서 복사하는 것을 의미합니다.

이것이 누군가를 돕기를 바랍니다. 나는 이것을 다시 쓰려고했지만 지금은 관리 할 수 ​​없습니다. 문안 인사.


0

다음 명령이 저에게 효과적이었습니다. 로컬 커밋 된 모든 변경 사항이 삭제되고 로컬이 원격 오리진 / 마스터 브랜치와 동일하게 재설정됩니다.

git reset-하드 원점

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