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 저장소에서.
-
git checkout b3d92c5
마지막으로 사용 가능한 커밋을 확인합니다. -
git checkout -b repair
작업 할 새 분기를 만듭니다. -
git cherry-pick 77b9b82
커밋 3을 실행합니다. -
git cherry-pick 2c6a45b
커밋 1을 실행합니다. -
git checkout master
Checkout 마스터 -
git reset --hard b3d92c5
마스터를 마지막으로 사용 가능한 커밋으로 재설정합니다. -
git merge repair
새 분기를 마스터에 병합합니다. -
git push --hard origin master
마스터를 원격 저장소로 푸시합니다.
최종 참고 사항
Git rebase & cherrypick은 위험하지만 강력합니다. 마지막으로 만 사용해야하는 솔루션 자신이 무엇을하고 있는지 아는 사람 만이 수행 할 수 있습니다. 두 솔루션 모두 동일한 저장소 / 브랜치에서 작업하는 다른 사용자에게 부정적인 영향을 미칠 수 있습니다.
마지막으로 조심하고 행운을 빕니다!