programing

푸시되지 않은 GIT 커밋을 삭제하려면 어떻게 해야 합니까?

easyjava 2023. 4. 29. 09:59
반응형

푸시되지 않은 GIT 커밋을 삭제하려면 어떻게 해야 합니까?

제가 실수로 지점을 잘못 잡았습니다.해당 커밋을 삭제하려면 어떻게 해야 합니까?

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

git reset --soft HEAD~1

최근 커밋을 삭제하고 수행한 작업을 삭제합니다.

git reset --hard HEAD~1

제가 찾은 최고의 답이 왜 댓글에만 있는지 궁금합니다! (86개의 찬성표를 가진 데니스)

git reset --hard origin

이 명령은 로컬 리포지토리를 원격 리포지토리와 동기화하여 로컬에서 변경한 내용을 모두 제거합니다.Cleary가 설명에서 제안한 대로 오리진에 있는 정확한 분기를 가져오려면 다음 작업을 수행할 수도 있습니다.

git reset --hard origin/<branch>

삭제하지 마십시오. 한 번의 커밋만으로도 충분합니다.

하지만 잘못된 분기에 여러 번 커밋이 있었다면, 여기서 빛이 납니다.

예를 들어 다음과 같습니다.

 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

분기를 재설정해야 하는 위치:

 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

를 .git rebase -i FAR_ENOUGH_BACK그리고 당신이 원하지 않는 약속에 대한 선을 내려놓으세요.

해당 커밋을 다른 지점으로 이동하려면 해당 커밋의 SHA를 가져옵니다.

git rev-parse HEAD

그런 다음 현재 분기를 전환합니다.

git checkout other-branch

그리고.cherry-pick에한대에 대한 other-branch

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

명령을 실행한 후 로컬 커밋된 모든 변경 내용이 삭제되고 로컬이 원격 오리진/마스터 분기와 동일하게 재설정됩니다.

git reset -- 하드 오리진

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

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

실제로 체크아웃에 신경 쓰지 않는 경우 다음과 같이 원하는 대로 지점을 설정할 수 있습니다.

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

이는 예를 들어 분기에 새 커밋을 복사하기 위해 분기에서 커밋을 제거하는 프로그래밍 방식입니다(기본 재배치 사용).

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

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

이제 항목 분기의 복제본을 만든 다음 분기 "dump"에 있는 소스 코드 덤프를 기준으로 다시 작성합니다.

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

이제 변경 사항은 "dump"의 시작 지점을 기준으로 branch 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

현재 "주제_중복"을 지운 후 체리픽을 선택할 수도 있습니다.

제가 말하고자 하는 것은 다른 조상을 기반으로 현재 "중복" 분기를 업데이트하려면 먼저 다음을 수행하여 이전에 "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

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

이제 다음을 시연해 보겠습니다.

  • reset은 분기점을 다른 커밋(--hard commit)으로 만듭니다(--hard commit, --soft는 추가된 파일을 인덱스에 보관(다시 커밋하면 커밋됨). 그리고 기본(--mixed)은 이전 커밋을 체크아웃(로컬 변경 사항에 따라)하지 않지만 인덱스를 지웁니다(아직 커밋에 추가된 것이 없음).
  • 지점이 다른 커밋을 가리키도록 강제할 수 있습니다.
  • 커밋을 즉시 체크아웃하는 동안에도 그렇게 할 수 있습니다.
  • 현재 지점에 있는 커밋에 대한 기본 작업
  • 체리 무늬는 다른 지점에서 복사하는 것을 의미합니다.

이것이 누군가에게 도움이 되기를 바랍니다.저는 이것을 다시 쓰려고 했지만, 지금은 그럴 수가 없습니다.안부 전해요.

언급URL : https://stackoverflow.com/questions/3197413/how-do-i-delete-unpushed-git-commits

반응형