"실수로" 커밋을 GitHub에 푸시했습니다.
이 커밋을 제거할 수 있습니까?
내 GitHub 리포지토리를 이 커밋 이전의 상태로 되돌리고 싶습니다.
질문자 :hectorsq
"실수로" 커밋을 GitHub에 푸시했습니다.
이 커밋을 제거할 수 있습니까?
내 GitHub 리포지토리를 이 커밋 이전의 상태로 되돌리고 싶습니다.
참고: 아래 주석에서
git rebase -i
에 대한 대안을 참조하세요.
git reset --soft HEAD^
먼저 로컬 저장소에서 커밋을 제거합니다. git rebase -i
사용하여 이 작업을 수행할 수 있습니다. 예를 들어, 마지막 커밋이라면 git rebase -i HEAD~2
하고 팝업되는 편집기 창에서 두 번째 줄을 삭제할 수 있습니다.
git push origin +branchName --force
사용하여 GitHub로 강제 푸시합니다.
자세한 내용은 Git Magic Chapter 5: Lessons of History - And then Some 을 참조하십시오(예: 오래된 커밋을 제거하려는 경우).
아, 작업 트리가 더러우면 먼저 git stash
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 reset --soft HEAD~1
가장 최근 커밋을 삭제하여 수행한 작업을 파괴합니다.
git reset --hard HEAD~1
1. git reset HEAD^ --hard 2. git push origin -f
이것은 나를 위해 일합니다.
푸시를 git revert
를 사용하십시오.
git-revert - 일부 기존 커밋 되돌리기
git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>... git revert --continue git revert --quit git revert --abort
관련 패치가 도입한 변경 사항을 되돌리고 이를 기록하는 몇 가지 새로운 커밋을 기록합니다. 이를 위해서는 작업 트리가 깨끗해야 합니다(HEAD 커밋에서 수정 사항 없음).
참고 : git revert 는 일부 새로운 커밋을 기록하여 이전 커밋(종종 결함이 있는 커밋만)의 효과를 되돌리는 데 사용됩니다. 작업 디렉토리에서 커밋되지 않은 모든 변경 사항을 버리고 싶다면 git-reset 특히 --hard 옵션이 표시되어야 합니다.
원격 저장소에서 커밋을 삭제하려면:
git push -f origin last_known_good_commit:branch_name
로컬 저장소에서 커밋을 삭제하려면:
git reset --hard HEAD~1
되돌리려는 커밋의 커밋 해시를 알아야 합니다. https://github.com/your-organization/your-project/commits/master 와 같은 GitHub URL에서 가져올 수 있습니다.
커밋의 해시(돌아가고 싶은 위치)가 "99fb454"(긴 버전 "99fb45413eb9ca4b3063e07b40402b136a8cf264")라고 가정하면 다음과 같이 하면 됩니다.
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264 git push --force
Github에서 분기의 헤드가 되고 싶은 커밋의 참조 사양을 찾고 다음 명령을 사용합니다.
git push origin +[ref]:[branchName]
귀하의 경우 한 커밋으로 돌아가려면 해당 커밋에 대한 ref의 시작 부분을 찾으십시오. 예를 들어 7f6d03이라고 가정하고 변경하려는 분기의 이름을 예를 들어 마스터라고 가정하십시오. 다음을 수행하십시오.
git push origin +7f6d03:master
더하기 문자는 --force
로 해석되며, 이는 기록을 다시 작성하기 때문에 필요합니다.
--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
로컬 저장소(예: HEAD~2)에서 마지막 n개의 커밋을 제거할 수 있습니다. 저장소에서 강제 git push를 진행합니다.
git push -f origin <branch>
도움이 되었기를 바랍니다!
분기 및 병합 구조를 유지하려면 리베이스를 수행할 때 --preserve-merges
git rebase --preserve-merges -i HEAD^^
GitHub의 경우
로컬 변경 사항을 먼저 측면 어딘가에 저장하십시오 ( 백업 )
최근 커밋을 검색한 다음 "전체 SHA 복사" 버튼을 클릭하여 커밋 해시를 선택하여 클립보드로 보낼 수 있습니다.
마지막 커밋 해시가 g0834hg304gh3084gh(예: )라고 가정해 보겠습니다.
다음을 실행해야 합니다.
git push origin +g0834hg304gh3084gh:master
이전에 복사한 해시를 사용하여 "HEAD" 개정판으로 만듭니다.
원하는 로컬 변경 사항을 추가합니다. 완료 ;)
대화형 리베이스를 제거하려면
git rebase -i HEAD~4
4는 커밋을 표시하고 그에 따라 변경하는 4 represents total number of commits to display count your commit and
목록에서 원하는 커밋을 삭제하십시오 ...
Ctrl+X(ubuntu) 또는 :wq(centos)로 변경 사항 저장
두 번째 방법, 되돌리기,
git revert 29f4a2 #your commit ID
이것은 특정 커밋을 되돌릴 것입니다
GitHub Desktop 에서 커밋을 마우스 오른쪽 버튼으로 클릭하고 되돌릴 수 있습니다. 그러면 변경 사항을 취소하는 새 커밋이 생성됩니다.
실수로 커밋한 것은 여전히 기록에 남지만(예를 들어 실수로 API 키나 비밀번호를 커밋한 경우 문제가 될 수 있음) 코드는 되돌려집니다.
이것은 가장 간단하고 쉬운 옵션이며 허용되는 답변이 더 포괄적입니다.
역사를 다시 쓰는 것은 좋지 않습니다. git revert <commit_id>
를 사용하면 해당 커밋 ID의 깨끗한 역 커밋이 생성됩니다.
이렇게 하면 역사가 다시 쓰여지지 않고 모든 사람이 되돌려졌다는 것을 알 수 있습니다.
원하는 방식으로 파일을 추가/제거하세요.
git rm classdir git add sourcedir
그런 다음 커밋을 수정합니다.
git commit --amend
이전의 잘못된 커밋은 새 인덱스 상태를 반영하도록 편집됩니다. 즉, 처음부터 실수를 한 적이 없는 것과 같습니다.
아직 푸시하지 않은 경우에만 이 작업을 수행해야 합니다. 푸시한 경우 정상적으로 수정 사항을 커밋하면 됩니다.
출처 : http:www.stackoverflow.com/questions/448919/how-can-i-remove-a-commit-on-github
현재 Git 브랜치를 마스터 브랜치로 만들기 (0) | 2021.12.28 |
---|---|
모든 Git 브랜치를 가져오는 방법 (0) | 2021.12.28 |
NodeJS 및 NPM을 다음 버전으로 업데이트하려면 어떻게 해야 합니까? (0) | 2021.12.28 |
Vim에서 전체 줄을 복제하는 방법은 무엇입니까? (0) | 2021.12.28 |
브라우저 간에 일관되게 확인란과 레이블을 정렬하는 방법 (0) | 2021.12.28 |