문제

나는 "실수로" 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
  1. git log반복하려는 커밋을 찾으려면

  2. git push origin +7f6d03:master7F6D03은 잘못된 밀폐 커밋 전에 커밋입니다.+ 그랬어 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 키나 비밀번호를 커밋한 경우 문제가 될 수 있음) 코드는 되돌려집니다.

이것은 가장 간단하고 쉬운 옵션이며 허용되는 답변은 더 포괄적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top