GitHub에서 커밋을 어떻게 제거할 수 있나요?
-
19-08-2019 - |
문제
나는 "실수로" GitHub에 커밋을 푸시했습니다.
이 커밋을 제거할 수 있나요?
이 커밋 이전의 GitHub 저장소를 되돌리고 싶습니다.
해결책
메모: 대안을 참조하십시오
git rebase -i
아래 의견에서 -
git reset --soft HEAD^
먼저 로컬 저장소에서 커밋을 제거하십시오. 당신은 이것을 사용하여 할 수 있습니다 git rebase -i
. 예를 들어, 마지막 커밋 인 경우 할 수 있습니다. git rebase -i HEAD~2
팝업되는 편집기 창 내에서 두 번째 줄을 삭제하십시오.
그런 다음 사용하여 Github로 밀어 넣습니다 git push origin +branchName --force
보다 Git Magic 5 장 : 역사의 교훈 - 그리고 일부 자세한 내용은 (예 : 이전 커밋을 제거하려는 경우).
아, 그리고 당신의 작업 나무가 더럽다면, 당신은 git stash
먼저, 그리고 a git stash apply
후에.
다른 팁
git push -f origin HEAD^:master
그것은 푸시를 "취소"해야합니다.
실수라면 쉽게 되돌아 보려면 (아마도 레포를 만들었을 수도 있고, 새로운 것 대신 원본으로 밀어 붙였습니다) 여기에 또 다른 가능성이 있습니다.
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
반환하려는 커밋 수에 대해 해당 번호를 교환합니다.
그 이후로 모든 것이 다시 밀면 삭제됩니다. 그렇게하려면 다음 단계는 다음과 같습니다.
git push --force
git log
반복하려는 커밋을 찾으려면git push origin +7f6d03:master
7F6D03은 잘못된 밀폐 커밋 전에 커밋입니다.+
그랬어force push
그리고 그게 다야.
여기 쉽고 간단한 문제를 해결하는 아주 좋은 가이드입니다!
삭제 후 커밋 변경 사항을 유지하려는 경우:
제거할 커밋이 마지막 커밋인 경우 이 솔루션이 작동합니다.
1 - 로그에서 돌아가고 싶은 커밋 참조를 복사합니다.
git log
2 - Git을 커밋 참조로 재설정합니다.
git reset <commit_ref>
3 - 원격으로 푸시한 후 나중에 사용하기 위해 잘못된 커밋의 로컬 변경 사항을 숨김/저장합니다.
git stash
4 - 변경 사항을 원격 저장소에 푸시합니다(-f 또는 --force).
git push -f
5 - 로컬 저장소에 저장된 변경 사항을 다시 가져옵니다.
git stash apply
7 - 변경 사항에 추적되지 않은/새 파일이 있는 경우 커밋하기 전에 해당 파일을 git에 추가해야 합니다.
git add .
6 - 필요한 추가 변경 사항을 추가한 다음 필요한 파일을 커밋하거나 각 파일 이름을 지정하는 대신 점 '.'을 사용하여 로컬 저장소의 모든 파일을 커밋합니다.
git commit -m "<new_commit_message>" <file1> <file2> ...
또는
git commit -m "<new_commit_message>" .
캐시를 완전히 닦으려면 캐시를 지워야합니다. GIT 의이 도움말 페이지가 도움이 될 것입니다. (나를 도와 주었다)http://help.github.com/remove-sensitive-data/
사용 git revert
당신의 푸시를 되 돌리는 것.
git -revert- 일부 기존 커밋을 되돌립니다
git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>... git revert --continue git revert --quit git revert --abort
관련 패치가 도입 한 변경 사항을 되돌리고 기록하는 새로운 커밋을 기록하십시오. 이를 위해서는 작업 트리가 깨끗해야합니다 (헤드 커밋에서 수정되지 않음).
1. git reset HEAD^ --hard
2. git push origin -f
이것은 나를 위해 일합니다.
원격 저장소에서 커밋을 삭제하려면 :
git push -f origin last_known_good_commit:branch_name
로컬 저장소에서 커밋을 삭제하기 위해
git reset --hard HEAD~1
가장 최근의 커밋을 삭제하여 수행 한 작업을 유지하십시오.
git reset --soft HEAD~1
가장 최근의 커밋을 삭제하여 수행 한 작업을 파괴하십시오.
git reset --hard HEAD~1
GitHub에서 지점의 헤드가 되고자하는 커밋의 심판 사양을 찾아 다음 명령을 사용하십시오.
git push origin +[ref]:[branchName]
귀하의 경우, 당신이 단지 한 커밋으로 돌아 가고 싶다면, 그 커밋에 대한 심판의 시작을 찾으십시오, 예를 들어 7f6d03이고, 당신이 바꾸고 싶은 지점의 이름, 예를 들어 마스터, 그리고 예를 들어 마스터, 그리고 그것은 마스터입니다. 다음을 수행하십시오.
git push origin +7f6d03:master
플러스 캐릭터는 다음으로 해석됩니다 --force
, 역사를 다시 쓰기 때문에 필요합니다.
당신은 언제든지 주목하십시오 --force
당신이 당신의 지점을 합병하는 다른 사람들의 역사를 재 쓸 수있는 커밋. 그러나 문제를 빨리 잡으면 (다른 사람이 지점을 통합하기 전에) 아무런 문제가 없습니다.
반복하려는 커밋에서 커밋 해시를 알아야합니다. github url에서 얻을 수 있습니다. https://github.com/your-organization/your-project/commits/master
Commit의 해시 (돌아가고 싶은 곳)는 "99FB454"(긴 버전 "99FB45413EB9CA4B3063E07B40402B136A8CF264"라고 가정 해 봅시다.
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
커밋에 민감한 데이터가 있기 때문에이 작업을 수행하는 경우 다른 답변을 사용하면 안전하지 않습니다. (Subutux를 제외하고 확장 할 것입니다).
그만큼 이것에 대한 Github 가이드 외부 도구를 사용하는 것이 좋습니다. 그러나 내장 도구를 사용하는 것이 좋습니다.
먼저, 저장소를 백업하십시오. 그 다음에:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all
금후, 저장소가 원하는 상태에 있는지 확인하십시오.. 백업에 대해 차이가있을 수 있습니다.
그렇다면 정확하다면 :
#get rid of old unreferenced commits (including the data you want to remove)
git gc --prune=now
git push origin --force --all
만일을 대비하여 로컬 백업을 잠시 동안 유지하고 싶을 수도 있습니다.
터미널 에서이 명령을 실행하십시오.
git reset HEAD~n
로컬 레포 예를 들어 ~ 2에서 마지막 N 커밋을 제거 할 수 있습니다. 저장소에 힘을주는 git 푸시로 진행하십시오.
git push -f origin <branch>
도움이 되었기를 바랍니다!
분기 및 병합 구조를 보존하려면 --preserve-merges
Rebase를 수행 할 때 옵션 :
git rebase --preserve-merges -i HEAD^^
지역 변경 사항을 먼저 측면 어딘가에 저장 (백업)
최근 커밋을 탐색 한 다음 "전체 SHA 복사"버튼을 클릭하여 클립 보드로 보내면 커밋 해시를 선택할 수 있습니다.
마지막 커밋 해시 인 경우 G0834HG304GH3084GH (예 :)
실행해야합니다.
git push origin +g0834hg304gh3084gh:master
이전에 복사 한 해시를 사용하여 "헤드"개정으로 만듭니다.
원하는 로컬 변경 사항을 추가하십시오. 완료 ;)
Github의 경우
- 로컬 저장소에서 커밋 (하드)을 재설정하십시오.
- 새 지점을 만듭니다
- 새 지점을 밀어 넣으십시오
- 오래된 지점을 삭제합니다 (마스터 브랜치를 삭제하는 경우 새 분기를 기본 브랜치로 만들기)
Do Interactive Rebase를 제거하려면
git rebase -i HEAD~4
4 represents total number of commits to display count your commit and
그에 따라 변경하십시오
목록에서 원하는 커밋 삭제 ...
변경 사항을 저장하십시오 ctrl+x (우분투) 또는 : WQ (Centos)
두 번째 방법, 복귀,
git revert 29f4a2 #your commit ID
이것은 특정 커밋을 되돌릴 것입니다
역사를 다시 쓰는 것은 좋지 않습니다. 우리가 사용하는 경우 git revert <commit_id>
, 상기 커밋 ID의 깨끗한 역 커미트를 만듭니다.
이런 식으로, 역사는 다시 작성되지 않고, 대신, 모든 사람들은 역전이 있다는 것을 알고 있습니다.
원하는 방식으로 물건을 얻기 위해 파일 추가/제거 :
git rm classdir
git add sourcedir
그런 다음 커밋을 수정하십시오.
git commit --amend
이전의 잘못된 커밋은 새로운 인덱스 상태를 반영하기 위해 편집 될 것입니다. 다시 말해서, 처음에는 실수를 한 적이없는 것과 같습니다.
아직 밀지 않은 경우에만이 작업을 수행해야합니다. 당신이 밀면, 당신은 정상적으로 수정을 저지해야합니다.
~ 안에 GitHub 데스크탑 커밋을 마우스 오른쪽 버튼으로 클릭하고 되돌리면 변경 사항을 취소하는 새 커밋이 생성됩니다.
실수로 커밋한 내용은 여전히 기록에 남아 있지만(예를 들어 실수로 API 키나 비밀번호를 커밋한 경우 문제가 될 수 있음) 코드는 되돌려집니다.
이것은 가장 간단하고 쉬운 옵션이며 허용되는 답변은 더 포괄적입니다.