etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 5. 2. 22:11
반응형

질문자 :NullVoxPopuli


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



수행한 작업을 유지하면서 가장 최근 커밋을 삭제합니다.

 git reset --soft HEAD~1

가장 최근 커밋을 삭제하여 수행한 작업을 파괴합니다.

 git reset --hard HEAD~1

dbyrne

내가 찾은 최고의 답변이 댓글에만 있는 이유가 궁금합니다! ( 86 위로 표를 얻은 Daenyth 작성 )

 git reset --hard origin

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

 git reset --hard origin/<branch>

Ashkan Sirous

삭제하지 마십시오. 단 한 번의 커밋으로 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

VonC

git rebase -i FAR_ENOUGH_BACK 을 수행하고 원하지 않는 커밋에 대한 줄을 삭제합니다.


Hank Gay

해당 커밋을 다른 브랜치로 이동하려면 해당 커밋의 SHA를 가져옵니다.

 git rev-parse HEAD

그런 다음 현재 분기를 전환하십시오.

 git checkout other-branch

그리고 other-branch 대한 커밋을 cherry-pick

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

Alexander Groß

다음 명령이 저에게 효과적이었고 모든 로컬 커밋 변경 사항이 삭제되고 로컬이 원격 원본/마스터 분기와 동일하게 재설정되었습니다.

자식 재설정 --하드 원점


Atul Sureka

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

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

사실, 체크아웃에 신경 쓰지 않는다면 다음을 사용하여 분기를 원하는 대로 설정할 수 있습니다.

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

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

다른 위치에서 소스를 가져와서 분기에 덤프했기 때문에 마스터에서 연결이 끊긴 분기가 있다고 가정합니다.

이제 변경 사항을 적용한 분기가 있습니다. "주제"라고 합시다.

이제 토픽 브랜치의 복제본을 생성한 다음 "dump" 브랜치에 있는 소스 코드 덤프에 리베이스합니다.

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

이제 변경 사항이 "dump"의 시작점을 기반으로 분기 topic_duplicate에 다시 적용되지만 "master" 이후에 발생한 커밋만 적용됩니다. 따라서 마스터 이후의 변경 사항은 이제 "dump" 위에 다시 적용되지만 결과는 "topic_duplicate"로 끝납니다.

그런 다음 다음을 수행하여 "dump"를 "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"를 지운 후 체리를 고를 수도 있습니다.

내가 말하려는 것은 다른 조상을 기반으로 현재 "중복" 브랜치를 업데이트하려면 먼저 git reset --hard <last-commit-to-retain> 또는 git branch -f topic_duplicate <last-commit-to-retain> 을 실행한 다음 리베이스 또는 체리 선택을 통해 다른 커밋을 (주 주제 분기에서) 복사합니다.

Rebase는 이미 커밋이 있는 브랜치에서만 작동하므로 그렇게 할 때마다 토픽 브랜치를 복제해야 합니다.

체리 따기가 훨씬 쉽습니다.

 git cherry-pick master..topic

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

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

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

그래서 그냥 보여주기 위해:

  • reset은 분기 지점을 다른 커밋으로 만듭니다(--hard는 이전 커밋도 확인하고, --soft는 인덱스에 추가된 파일을 유지합니다(다시 커밋하면 커밋됨). 기본값(--mixed)은 그렇지 않습니다. 이전 커밋을 확인(로컬 변경 사항 지우기)하지만 인덱스가 지워집니다(아직 커밋에 추가된 것이 없음).
  • 분기가 다른 커밋을 가리키도록 할 수 있습니다.
  • 해당 커밋을 즉시 확인하는 동안에도 그렇게 할 수 있습니다.
  • 현재 브랜치에 있는 커밋에 대한 리베이스 작업
  • 체리 피킹은 다른 지점에서 복사하는 것을 의미합니다.

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


Xennex81

출처 : http:www.stackoverflow.com/questions/3197413/how-do-i-delete-unpushed-git-commits

반응형