programing

원격 분기에서 소수의 커밋을 영구적으로 제거하는 방법

megabox 2023. 7. 18. 21:38
반응형

원격 분기에서 소수의 커밋을 영구적으로 제거하는 방법

나는 그것이 역사를 다시 쓰는 것이라는 것을 압니다. 나쁜 야다야다.

그러나 원격 지점에서 몇 개의 커밋을 영구적으로 제거하는 방법은 무엇입니까?

은 너git reset --hard색인에서 사항을 와 사용자는 "사용자"입니다.git push --force(또는 ) 수정된 로컬 지점을 원격으로 전송합니다.
(여기에 있는 다른 솔루션(원격 분기 삭제 및 재실행 포함)

SO 답변은 특히 사람들이 자신의 로컬 저장소를 위해 원격 기록에 의존하는 경우 이러한 명령의 위험성을 보여줍니다.
당신은 사람들이 man 페이지의 RECOVERING FROM UPSTREBASE 섹션을 가리킬 준비가 되어 있어야 합니다.

또한, 댓글ringo가 지적한 바와 같이 원격 분기가 강제 푸시로부터 보호되는 경우,git revert이 대답에서 처럼, 더 좋을 수도 있습니다.


Git 2.23(2019년 8월, 9년 후)을 사용하면 새 명령을 사용할 수 있습니다.
즉, 다음과 같습니다.
(교체)n제거할 커밋 수 기준)

작업 됩니다. 예를 들어,git reset --hard그럴 것이다.
설명서에는 다음이 추가되어 있습니다.

-C <new-branch>
--force-create <new-branch>

와유한과 --create, 만약 만다라면<new-branch>합니다. 이 설정은 "미이존합니다재다니"로됩니다. 재설정됩니다.<start-point>.
이것은 다음을 위한 편리한 바로 가기입니다.

$ git branch -f <new-branch>
$ git switch <new-branch>

참고로 사용할 수 있습니다.last_working_commit_id하지 않는 커밋을 경우 ▁when우▁rever

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의 부모로 해석하고 +를 강제 비고속 포워드 푸시로 해석합니다.

3 목록에서 커밋 삭제

git rebase -i dd61ab23^

그러면 모든 커밋 목록이 열리고 편집기가 표시됩니다.제거할 항목을 삭제합니다.리포를 완료하고 리포로 힘을 가합니다.

git rebase --continue
git push <remote_repo> <remote_branch> -f

마지막 커밋을 삭제하려면 다음 명령을 실행하여 로컬 분기의 파일 시스템(작업 트리) 및 커밋 기록(인덱스)에서 변경 사항을 제거합니다.

git reset --hard HEAD~3

그런 다음 로컬 컴퓨터에서 다음 명령을 실행하여 원격 분기가 기록을 다시 쓰도록 합니다.

git push --force

축하합니다!다 끝냈어!

참고 사항:

를 실행하여 원하는 커밋 ID를 검색할 수 있습니다.

git log

그면교수있다니습할체러다있▁replace니를 대체할 수 있습니다.HEAD~N와 함께<desired-commit-id>다음과 같이:

git reset --hard <desired-commit-id>

사항을 기록하려면 " " " " " " " " " " " " " " ( " " " " ( " " " " ( " " " " " " " " 을 합니다.--soft처럼 깃발을 내미는.git reset --soft HEAD~3그런 다음 최신 변경사항을 확인하고 변경사항의 전부 또는 일부를 보관하거나 삭제할 수 있습니다. 후의경 런닝우자런▁in닝우n▁the경▁run자git status에는 " 변경파표시다니합일을이" 이후 있습니다.<desired-commit-id>사용하는 경우--hard 선택,git status로컬 지점이 원격 지점과 정확하게 같다는 메시지가 표시됩니다. 당신이 않경지는우를 사용하지 --hard도 아니다--soft인 기모드다같사용다니됩이음과본는▁is▁that▁mode▁used▁is▁default다▁the니사용을 사용합니다.--mixed모드에서는, 이모에는서드,,git help reset다음과 같이 말합니다.

인덱스는 재설정하지만 작업 트리는 재설정하지 않습니다(즉, 변경된 파일은 보존되지만 커밋으로 표시되지 않음). 업데이트되지 않은 내용을 보고합니다.

TL:DR;

  1. git switch -C branch_name origin/branch_name~n
  2. git push --force

는 완었습다니에 됩니다. 원격 분기는 다음 사람에 의해 반환됩니다.n커밋


설명:

  1. 사용하다git switch분기를 n개의 커밋 수로 재설정합니다.-C옵션을 선택하면 이름이 같은 새 분기가 강제로 생성됩니다.

    • 체교다를 branch_name당신의 지점 이름과 함께,
    • 체교다를 n되돌리려는 커밋 수와 함께 (명령 끝에) 표시됩니다.

    명령 #1: git switch -C branch_name origin/branch_name~n

    예:git switch -C feature/dashboard origin/feature/dashboard~1이 명령은 대시보드 분기에서 커밋 1개를 반환합니다.

  2. 로컬 변경사항 강제 푸시

    명령 #2: git push --force


팁: 커밋된(밀지 않은) 변경 내용 실행 취소하기git reset HEAD~

유사하게 이 블로그 게시물을 기반으로 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 로그를 종료합니다.

git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch

이제 당신은 당신이 원하는 대로 새로운 지점을 갖게 되었습니다.

새 분기에 없는 오류 분기의 특정 커밋도 유지해야 하는 경우 필요한 특정 커밋을 선택하면 됩니다.

git checkout the_errant_branch
git log

git 로그를 종료하는 데 필요한 하나의 커밋 해시를 정상 분기에 복사합니다.

git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied

자신의 등을 두드리세요.

 git reset --soft commit_id
 git stash save "message"
 git reset --hard commit_id
 git stash apply stash stash@{0}
 git push --force

저는 리베이스를 사용해서 하는 것을 좋아합니다.아래에서 n은 마지막 n개의 커밋입니다.따라서 세 번째 항목을 삭제하려면 3으로 대체합니다.

git rebase -i HEAD~n

그런 다음 목록에서 원하는 커밋을 찾아 "선택"에서 "삭제"로 변경합니다.rebase를 종료하고 방금 rebase를 수행한 것처럼 "-f" 옵션과 함께 git push를 사용합니다.

언급URL : https://stackoverflow.com/questions/3293531/how-to-permanently-remove-few-commits-from-remote-branch

반응형