git 커밋 삭제

Git으로 작업 할 때 버그가 발생했거나 재 작업이 필요하기 때문에 커밋을 제거해야하는 경우가 있습니다.

그렇다면 마지막 커밋은 매우 간단합니다. 다음을 실행하면됩니다.

git reset HEAD^

이렇게하면 최신 커밋이 표시되지만 파일의 모든 변경 사항은 그대로 유지됩니다.

마지막 커밋보다 더 많이 삭제해야하는 경우 사용할 수있는 두 가지 방법이 있습니다. 첫 번째는 rebase를 사용하여 하나 이상의 연속 된 커밋을 제거 할 수 있도록하고 다른 하나는 연속되지 않은 커밋을 제거 할 수있는 cherry-pick입니다.

예제 git log

번호 해시 메시지 커밋 작성자
1 2c6a45b (HEAD) 공개 메소드 추가 보호 된 방법에 액세스하려면 Tom
2 ae45fab 데이터베이스 인터페이스 업데이트 계약 업체 1
3 77b9b82 데이터베이스 인터페이스 개선 계약 업체 2
4 3c9093c 개발 브랜치를 마스터로 병합 Tom
5 b3d92c5 새 이벤트 CMS 모듈 추가
6 7feddbb CMS 클래스 및 파일 추가 Tom
7 a809379 Git에 프로젝트 추가 Tom

Rebase 사용

위의 git 로그를 사용하여 다음 커밋을 제거하려고합니다. 2 & 3 (ae45fab & 77b9b82). 연속 커밋이므로 리베이스를 사용할 수 있습니다.

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

예 : 커밋 제거 2 & 3 위

git rebase --onto repair~3 repair~1 repair

Cherry Pick 사용

1 단계 : 커밋 전에 커밋 찾기 git log

2 단계 : 커밋 한 체크 아웃 git checkout <commit hash>

3 단계 : 현재 체크 아웃 커밋을 사용하여 새 브랜치를 만듭니다. git checkout -b <new branch>

4 단계 : 이제 커밋을 제거한 후에 커밋을 추가해야합니다. git cherry-pick <commit hash>

5 단계 : 이제 유지하려는 다른 모든 커밋에 대해 4 단계를 반복합니다.

6 단계 : 모든 커밋이 새 브랜치에 추가되고 커밋되었습니다. 모든 것이 올바른 상태이고 의도 한대로 작동하는지 확인하십시오. 모든 것이 커밋되었는지 다시 확인하십시오. git status

7 단계 : 손상된 브랜치로 전환 git checkout <broken branch>

8 단계 : 이제 제거하려는 커밋 이전에 끊어진 브랜치에서 하드 리셋을 수행합니다. git reset --hard <commit hash>

9 단계 : 이 분기로 고정 분기 git merge <branch name>

10 단계 : 병합 된 변경 사항을 원본으로 다시 푸시합니다. 경고 : 원격 저장소를 덮어 씁니다! git push --force origin <branch name>

2 단계 & 3을 8 단계로 바꾸면 새 분기를 만들지 않고도 프로세스를 수행 할 수 있습니다. 7 단계를 수행하지 마십시오. & 9.

커밋을 제거하고 싶다고 가정 해 보겠습니다. 2 & 4 저장소에서.

  1. git checkout b3d92c5 마지막으로 사용 가능한 커밋을 확인합니다.
  2. git checkout -b repair 작업 할 새 분기를 만듭니다.
  3. git cherry-pick 77b9b82 커밋 3을 실행합니다.
  4. git cherry-pick 2c6a45b 커밋 1을 실행합니다.
  5. git checkout master Checkout 마스터
  6. git reset --hard b3d92c5 마스터를 마지막으로 사용 가능한 커밋으로 재설정합니다.
  7. git merge repair 새 분기를 마스터에 병합합니다.
  8. git push --hard origin master 마스터를 원격 저장소로 푸시합니다.

최종 참고 사항

Git rebase & cherrypick은 위험하지만 강력합니다. 마지막으로 만 사용해야하는 솔루션 자신이 무엇을하고 있는지 아는 사람 만이 수행 할 수 있습니다. 두 솔루션 모두 동일한 저장소 / 브랜치에서 작업하는 다른 사용자에게 부정적인 영향을 미칠 수 있습니다.

마지막으로 조심하고 행운을 빕니다!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다