답변:
같은 코드 저장소에서 다른 사람들과 함께 작업하는 경우 첫째로, 당신은 안 리포지토리에 업데이트를 강제 할 때이 경우는 (불법 상태 예를 동료의 로컬 저장소를 떠나 이후 커밋 삭제 삭제 한 후 커밋을 수행 한 경우 해당 커밋은 현재 존재하지 않는 커밋을 기반으로했기 때문에 유효하지 않습니다.
당신이 할 수있는 일은 커밋을 되 돌리는 것입니다. 이 절차는 사용중인 CVS에 따라 다르게 수행됩니다 (다른 명령).
에 자식 :
git revert <commit>
에 수은 :
hg backout <REV>
편집 : 되돌리기 작업은 되 돌린 커밋과 반대되는 새로운 커밋을 생성합니다 (예 : 원래 커밋에 라인이 추가 된 경우 되돌리기 커밋은 해당 라인을 삭제함).
git backout <REV>
? 또는 : hg backout <REV>
?
다른 사람과 함께 작업 하지 않는 경우 (또는 큰 불편을 끼쳐서 기뻐하는 경우) , bitbucket 브랜치에서 커밋을 제거 할 수 있습니다.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
git에서 일반적으로 master 브랜치는 특별하지 않습니다. 단지 관례 일뿐입니다. 그러나 bitbucket 및 github 및 유사한 사이트에는 일반적으로 기본 브랜치가 있어야합니다 (저장소에 브랜치가 없다는 이벤트를 처리하기 위해 더 많은 코드를 작성하는 것보다 쉽기 때문에-확실하지 않음). 따라서 새 브랜치를 생성하고이를 기본 브랜치로 만들어야합니다.
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
Bitbucket에서 저장소 설정으로 이동하여 "Main branch"를 master_temp
(Github에서 "Default branch"변경)로 변경합니다.
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
이제 Bitbucket으로 이동하면 원하는 기록이 표시됩니다. 이제 설정 페이지로 이동하여 메인 분기를 master
.
이 프로세스는 다른 기록 변경 (예 :)에도 적용 git filter-branch
됩니다. 새 기록이 이전 기록과 분리되기 전에 적절한 커밋으로 재설정해야합니다.
편집 : 분명히 리셋 브랜치를 강제 푸시 할 수 있으므로 github 에서이 모든 번거 로움을 갈 필요가 없습니다 .
다음에 누군가가 저장소에서 가져 오려고하면 (이미 잘못된 커밋을 가져온 경우) 가져 오기가 실패합니다. 변경된 기록 이전의 커밋으로 수동으로 재설정 한 다음 다시 가져와야합니다.
git reset HEAD^
git pull
그들이 나쁜 커밋을 가져와 그 위에 커밋 했다면 , 재설정해야 할 것이고, 그리고 나서 git cherry-pick
그들이 만들고자하는 좋은 커밋을 다시 만들어서 나쁜 커밋없이 전체 브랜치를 효과적으로 다시 생성해야합니다.
그들이 나쁜 커밋을 가져 오지 않았다면,이 전체 프로세스는 그들에게 영향을주지 않을 것이고, 그들은 정상적으로 풀 수 있습니다.
재설정 HEAD^
한 다음 강제로 밀어 넣을 수 있습니다.
git reset HEAD^
git push -u origin master --force
마지막 커밋을 삭제하고 커밋이 삭제되면 bitbucket에 반영되지만 서버에는 계속 남아 있습니다.
나는 과거에 git revert에 문제가있었습니다.
내 간단한 해결책은 이것입니다.
1 단계.
git clone <your repos URL> .
프로젝트를 다른 폴더에 저장 한 다음 :
2 단계.
git reset --hard <the commit you wanna go to>
그런 다음 3 단계.
최신 (및 기본) 프로젝트 디렉토리 (마지막 커밋에 문제가있는 파일)에 2 단계의 파일을 붙여 넣습니다.
4 단계.
git commit -m "Fixing the previous messy commit"
5 단계.
즐겨
git revert
간단합니다. 이전 커밋 (또는 여러 커밋)의 변경 사항을 반대로 수행하는 새 커밋을 만듭니다. 커밋을 삭제하지 않으므로이 질문과 관련이 없습니다. 또한 여기에서 복제 단계는 실제로 필요하지 않습니다.
다음은 최대 4 단계의 간단한 접근 방식입니다.
0-리포지토리를 수정할 팀에 알립니다.
팀과 연결하여 향후 변경 사항을 알립니다.
1-마지막 커밋 제거
대상 분기가 master
다음과 같다고 가정합니다 .
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
이 시점에서 혼자 일하는 경우 완료됩니다.
2-팀원의 로컬 저장소 수정
팀원의 :
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
팀원에게 새로운 커밋이 없다면이 시점에서 완료되었으며 동기화 상태 여야합니다.
3-잃어버린 커밋 가져 오기
팀원이이 프로세스에서 손실 된 새롭고 게시되지 않은 커밋을 가지고 있다고 가정 해 보겠습니다.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
필요한만큼 커밋에 대해이 작업을 수행합니다.
이 방법을 여러 번 성공적으로 사용했습니다. 모든 것이 동기화되도록하려면 팀의 노력이 필요합니다.
다른 사람들이 말했듯이 일반적으로 hg backout
또는 git revert
. 그러나 때로는 커밋을 제거하고 싶을 때가 있습니다.
먼저, 저장소 설정으로 이동해야합니다. Strip commits
링크를 클릭하십시오 .
삭제할 변경 세트의 변경 세트 ID를 입력하고을 누릅니다 Preview strip
. 이를 통해 수행하기 전에 어떤 종류의 손상을 입히고 있는지 확인할 수 있습니다. 그런 다음 클릭하면 Confirm
커밋이 더 이상 기록이 아닙니다. 모든 공동 작업자에게 자신이 한 일을 말하여 실수로 문제가되는 커밋을 되 돌리지 않도록하십시오.
변경 사항이 커밋되면 삭제할 수 없습니다. 커밋의 기본 특성은 삭제가 아니기 때문입니다.
할 수있는 일 (쉽고 안전한 방법),
인터랙티브 리베이스 :
1) git rebase -i HEAD~2
# 최근 2 개의 커밋을 표시합니다.
2) 커밋은 다음과 같이 나열됩니다. 최근 항목은 페이지 하단에 표시됩니다. LILO (last in Last Out)
마지막 커밋 행을 완전히 삭제
3) ctrl+X
또는로 저장ESC:wq
이제 분기가 마지막 커밋없이 업데이트됩니다.
지금까지 클라우드 bitbucket (어떤 버전인지 모르겠 음)은 다음과 같이 파일 시스템에서 커밋을 되돌릴 수 있습니다 (Chrome 브라우저의 Bitbucket 인터페이스에서 되 돌리는 방법을 볼 수 없음).
-실수로 커밋 한 변경 사항을 보호하기 위해 전체 디렉토리 백업
-체크 아웃 된 디렉토리 선택
-마우스 오른쪽 버튼 : 거북이 자식 메뉴
-repo-browser ( 'revert'메뉴 옵션은 커밋되지 않은 변경 사항 만 취소합니다)
-HEAD 버튼을 누릅니다.
-맨 위 줄 선택 (마지막 커밋)
-마우스 오른쪽 버튼 :이 커밋에 의한 변경 되돌리기
-파일 시스템에서 변경 사항을 취소 한 후 commit을 누릅니다.
-이것은 '되돌리기 (이전 메시지)'메시지로 GIT를 업데이트합니다. 이것은 커밋을 되돌립니다.
- '커밋 및 푸시'를 선택하십시오.