원격 브랜치에서 커밋을 영구적으로 제거하는 방법
나는 그것이 야마다 야다라는 역사를 다시 쓰는 것을 안다.
그러나 원격 브랜치에서 커밋을 영구적으로 제거하는 방법은 무엇입니까?
당신은 git reset --hard
해당 지역의 지점은 당신에게 작업 트리와 인덱스의 변경 사항을 제거하려면 git push --force
원격으로 수정 된 지역의 지점을. ( 다른 솔루션 은 원격 브랜치를 삭제하고 다시 푸시하는 것을 포함합니다)
이 SO 답변 은 특히 사람들이 자신의 로컬 저장소에 대한 원격 기록에 의존하는 경우 이러한 명령의 위험을 보여줍니다. 매뉴얼 페이지 의 UPSTREAM REBASE 복구 섹션으로
사람들을 안내 할 준비를해야합니다 .git rebase
Git 2.23 (2019 년 8 월, 9 년 후)에서는 새로운 명령을 사용합니다 git switch
.
즉 : ( 제거 커밋 수로 대체 )git switch -C mybranch origin/mybranch~n
n
그러면 인덱스와 작업 트리가 원하는대로 복원됩니다 git reset --hard
.
last_working_commit_id
작동하지 않는 커밋을 되돌릴 때을 사용하십시오 .
git reset --hard <last_working_commit_id>
따라서 commit_id
원하지 않는 것으로 재설정해서는 안됩니다 .
그런 다음 원격 지점으로 푸시해야합니다.
git push --force
중요 사항 : "git push -f"에서 어떤 분기를 지정했는지 확인하십시오. 그렇지 않으면 다른 분기를 실수로 수정할 수 있습니다! [*]
이 튜토리얼 에는 세 가지 옵션 이 있습니다 . 링크가 끊어지면 여기에 주요 단계를 남겨 두겠습니다.
- 전체 커밋 되돌리기
- 마지막 커밋 삭제
- 목록에서 커밋 삭제
1 전체 커밋을 되돌립니다
git revert dd61ab23
2 마지막 커밋 삭제
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
또는 지점이 로컬로 제공되는 경우
git reset HEAD^ --hard
git push <<remote>> -f
여기서 + dd61 ...은 커밋 해시이며 git은 x ^를 x의 부모로 해석하고 +는 fast-for-forwared 푸시로 해석합니다.
3 목록에서 커밋 삭제
git rebase -i dd61ab23^
그러면 모든 커밋 목록이 표시된 편집기가 열립니다. 제거하려는 것을 삭제하십시오. 리베이스를 마무리하고 힘을 가하여 리포하십시오.
git rebase --continue
git push <remote_repo> <remote_branch> -f
이 블로그 게시물을 기반으로 pctroll의 답변을 단순화 합니다.
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
너무 늦었을 수도 있지만 멋진 '핵'옵션이 도움이되었습니다. 기본적으로 명령 filter-branch
을 사용하면 전체 git 기록에서 파일을 제거하거나 많은 수의 파일에서 무언가를 변경할 수 있습니다.
여기에 가장 잘 설명되어 있습니다 .
때로는이 문제를 해결하는 가장 쉬운 방법은 코드가 좋은 곳에서 새로운 지점을 만드는 것입니다. 그런 다음 나중에 다른 커밋을 체리 선택해야 할 경우를 대비하여 잘못된 분기 기록을 그대로 둘 수 있습니다. 또한 커밋 히스토리를 잃지 않도록합니다.
현지 오류 지점에서 :
git log
브랜치를 원하는 커밋 해시를 복사하고 git log를 종료하십시오.
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
이제 원하는 방식으로 새 분기가 생겼습니다.
새 브랜치에없는 잘못된 브랜치에서 특정 커밋을 유지해야하는 경우 필요한 특정 커밋을 선택하면됩니다.
git checkout the_errant_branch
git log
좋은 브랜치로 가져 와서 git log를 종료하는 데 필요한 커밋의 커밋 해시를 복사하십시오.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
등을 두 드리십시오.
예를 들어 마지막 3
커밋 을 삭제하려면 다음 명령을 실행하여 로컬 브랜치의 파일 시스템 (작업 트리) 및 커밋 기록 (인덱스)에서 변경 사항을 제거하십시오.
git reset --hard HEAD~3
그런 다음 로컬 컴퓨터에서 다음 명령을 실행하여 원격 분기가 기록을 다시 쓰도록합니다.
git push --force
축하합니다! 다됐다!
몇 가지 참고 사항 :
원하는 커밋 ID를 검색하여 실행할 수 있습니다
git log
그런 다음 다음 HEAD~N
과 <desired-commit-id>
같이 바꿀 수 있습니다 .
git reset --hard <desired-commit-id>
파일 시스템에 대한 변경 사항을 유지하고 색인 (커밋 기록)을 수정하려면 다음 --soft
과 같은 플래그를 사용하십시오 git reset --soft HEAD~3
. 그런 다음 최신 변경 사항을 확인하고 변경 사항 전부 또는 일부를 유지하거나 삭제하십시오. 후자의 경우 runnig git status
는 이후에 변경된 파일을 표시합니다 <desired-commit-id>
. --hard
옵션 을 사용 git status
하면 로컬 지점이 원격 지점과 정확히 동일하다는 것을 알 수 있습니다. --hard
nor를 사용하지 않으면 --soft
기본 모드 인가 사용됩니다 --mixed
. 이 모드에서는 다음과 git help reset
같이 말합니다.
작업 트리가 아닌 색인을 재설정하고 (즉, 변경된 파일은 보존되지만 커밋으로 표시되지 않음) 업데이트되지 않은 내용을보고합니다.
git reset --soft commit_id
git stash save "message"
git reset --hard commit_id
git stash apply stash stash@{0}
git push --force
참고 URL : https://stackoverflow.com/questions/3293531/how-to-permanently-remove-few-commits-from-remote-branch
'development' 카테고리의 다른 글
C ++에서 현재 시간과 날짜를 얻는 방법? (0) | 2020.02.22 |
---|---|
문자 목록을 문자열로 변환 (0) | 2020.02.22 |
UUID는 얼마나 독특합니까? (0) | 2020.02.22 |
SVG 채우기 색상 투명도 / 알파? (0) | 2020.02.22 |
PHP의 var_dump ()와 동등한 파이썬은 무엇입니까? (0) | 2020.02.22 |