development

원격 브랜치에서 커밋을 영구적으로 제거하는 방법

big-blog 2020. 2. 22. 11:42
반응형

원격 브랜치에서 커밋을 영구적으로 제거하는 방법


나는 그것이 야마다 야다라는 역사를 다시 쓰는 것을 안다.

그러나 원격 브랜치에서 커밋을 영구적으로 제거하는 방법은 무엇입니까?


당신은 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. 전체 커밋 되돌리기
  2. 마지막 커밋 삭제
  3. 목록에서 커밋 삭제

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하면 로컬 지점이 원격 지점과 정확히 동일하다는 것을 알 수 있습니다. --hardnor를 사용하지 않으면 --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



반응형