programing

Git 내역에서 특정 수정본을 제거하는 방법은 무엇입니까?

telecom 2023. 6. 19. 21:08
반응형

Git 내역에서 특정 수정본을 제거하는 방법은 무엇입니까?

Git 내역이 다음과 같이 표시된다고 가정합니다.

1 2 3 4 5

1-5는 별도의 개정판입니다.1, 2, 4, 5를 유지하면서 3을 제거해야 합니다.이것이 어떻게 행해지는가?

삭제할 수정본 이후에 수백 개의 수정본이 있을 때 효율적인 방법이 있습니까?

코멘트(그리고 이것이 사실임을 확인했습니다)에 따르면, rado의 대답은 매우 가깝지만 git는 분리된 헤드 상태로 남아 있습니다.대신 제거HEAD그리고 이것을 제거하는 데 사용합니다.<commit-id>당신이 있는 지점에서:

git rebase --onto <commit-id>^ <commit-id>

이 아닌 다음대이아닌특항정방다제니법입는거하목을화형은▁non다▁▁here▁to▁를 제거하는 방법이 있습니다.<commit-id>오직 그것만을 아는.<commit-id>제거할 항목:

git rebase --onto <commit-id>^ <commit-id> HEAD

앞에서 언급했듯이 git-rebase(1)는 당신의 친구입니다.커밋이 사용자에게 있다고 가정합니다.master지점, 당신은 다음을 할 것입니다.

git rebase --onto master~3 master~2 master

이전:

1---2---3---4---5  master

이후:

1---2---4'---5' master

git-rebase(1)에서:

리베이스를 사용하여 커밋 범위를 제거할 수도 있습니다.다음과 같은 상황이 발생할 경우:

E---F---G---H---I---J  topicA

그 다음 명령

git rebase --onto topicA~5 topicA~3 topicA

커밋 F 및 G가 제거될 수 있습니다.

E---H'---I'---J'  topicA

이것은 F와 G가 어떤 식으로든 결함이 있거나 A 주제의 일부가 되어서는 안 되는 경우에 유용합니다.--to 및 매개 변수에 대한 인수는 유효한 commit-ish일 수 있습니다.

리비전 3과 4를 단일 리비전으로 결합하려면 Gitrebase를 사용할 수 있습니다.버전 3의 변경 사항을 제거하려면 대화형 기본 재배치 모드에서 edit 명령을 사용해야 합니다.변경사항을 단일 리비전으로 결합하려면 스쿼시를 사용합니다.

저는 이 스쿼시 기술을 성공적으로 사용했지만 이전에는 수정본을 제거할 필요가 없었습니다."커밋 분할" 아래의 깃 리베이스 문서를 사용하면 이를 파악할 수 있는 충분한 아이디어를 얻을 수 있을 것입니다. (또는 다른 사람이 알고 있을 수도 있습니다.)

Git 설명서에서 다음을 수행합니다.

현재 상태로 유지할 가장 오래된 커밋으로 시작합니다.

git rebase -i <after-this-commit>

지정된 커밋 다음에 오는 현재 분기의 모든 커밋(합병 커밋 무시)과 함께 편집기가 실행됩니다.이 목록의 커밋을 원하는 대로 다시 정렬하여 제거할 수 있습니다.목록은 거의 다음과 같습니다.

죽은 벌을 골라라 이 약속의 한 줄.fa1afe1 다음 커밋의 한 줄을 선택합니다....

한 줄 설명은 순전히 사용자를 위한 것입니다. git-rebase는 해당 설명을 보지 않고 커밋 이름(이 예에서는 "죽은 벌" 및 "fa1afe1")을 살펴보므로 이름을 삭제하거나 편집하지 마십시오.

"pick" 명령을 "edit" 명령으로 대체하면 git-rebase에 해당 커밋을 적용한 후 중지하도록 지시할 수 있습니다. 따라서 파일 및/또는 커밋 메시지를 편집하고 커밋을 수정한 후 다시 베이스를 변경할 수 있습니다.

두 개 이상의 커밋을 하나로 접으려면 두 번째 이후 커밋에 대해 "pick" 명령을 "squash"로 바꿉니다.커밋의 작성자가 서로 다른 경우, 압축된 커밋을 첫 번째 커밋의 작성자에게 귀속시킵니다.

버전 3에서 변경한 내용만 제거하려는 경우 gitrevert를 사용할 수 있습니다.

Git revert는 단순히 되돌리는 수정본의 모든 변경사항을 취소하는 변경사항으로 새 수정본을 만듭니다.

즉, 원하지 않는 커밋과 이러한 변경 사항을 제거하는 커밋에 대한 정보를 모두 유지합니다.

복구는 기본적으로 표준 커밋에 불과하기 때문에 다른 사용자가 그동안 저장소에서 가져온 것일 가능성이 있는 경우 훨씬 더 친숙할 수 있습니다.

지금까지의 모든 답변이 다음과 같은 문제를 해결하지는 못합니다.

삭제할 수정본 이후에 수백 개의 수정본이 있을 때 효율적인 방법이 있습니까?

단계는 다음과 같습니다. 그러나 참조를 위해 다음과 같은 기록을 가정해 보겠습니다.

[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]

C: 제거할 커밋 직후 커밋(정리)

R: 제거할 커밋

B: 제거할 커밋 직전의 커밋(기준)

"수백 번의 수정" 제약 때문에, 저는 다음과 같은 전제 조건을 가정하고 있습니다.

  1. 당신이 존재하지 않기를 바라는 부끄러운 약속이 있습니다.
  2. 실제로 해당 난처한 커밋에 의존하는 후속 커밋은 0개입니다(복귀 시 충돌 없음).
  3. 당신은 당신이 수백 개의 개입된 커밋 중 '커밋터'로 등재되는 것에 대해 신경 쓰지 않습니다('작성자'는 보존됩니다).
  4. 리포지토리를 공유한 적이 없습니다.
    • 아니면 당신은 실제로 당신의 새로운 역사를 사용하도록 설득하기 위해 그것을 가지고 역사를 복제한 모든 사람들에게 충분한 영향력을 가지고 있습니다.
    • 그리고 당신은 역사를 다시 쓰는 것에 대해 신경쓰지 않습니다.

이것은 상당히 제한적인 제약 조건이지만, 이 코너 케이스에서 실제로 효과가 있는 흥미로운 대답이 있습니다.

다음은 단계입니다.

  1. git branch base B
  2. git branch remove-me R
  3. git branch save
  4. git rebase --preserve-merges --onto base remove-me

충돌이 없으면 더 이상 중단하지 않고 진행해야 합니다.충돌이 있는 경우 이를 해결할 수 있습니다.rebase --continue아니면 그냥 창피함을 감수하고 살기로 결정하고,rebase --abort.

이제 당신은 해야 합니다.master더 이상 커밋 R을 포함하지 않습니다.save화해를 원할 경우를 대비해 이전에 있던 곳으로 분기점을 지정합니다.

다른 모든 사용자의 새 기록으로의 이전을 어떻게 준비할지는 사용자에게 달려 있습니다.당신은 그것에 대해 잘 알아야 할 것입니다.stash,reset --hard,그리고.cherry-pick그리고 삭제할 수 있습니다.base,remove-me,그리고.save나뭇가지

저도 비슷한 상황에 처했습니다.아래 명령을 사용하여 대화형 기본 재배치를 사용하고 선택하는 동안 세 번째 커밋을 삭제합니다.

git rebase -i remote/branch

여기 제가 직면한 시나리오와 해결 방법이 있습니다.

[branch-a]

[Hundreds of commits] -> [R] -> [I]

여기서R내가 제거되어야 했던 약속이고,I다음에 오는 단일 커밋입니다.R

나는 되돌리기로 약속하고 그들을 뭉개 버렸습니다.

git revert [commit id of R]
git rebase -i HEAD~3

대화형 기본 재배치 중에 마지막 2개의 커밋을 스쿼시합니다.

rado 및 kareem의 응답은 나에게 아무런 도움이 되지 않습니다("Current branch is update." 메시지만 표시됨).Windows 콘솔에서 '^' 기호가 작동하지 않기 때문일 수 있습니다.그러나 이 의견에 따르면 '^'을 '~1'로 대체하면 문제가 해결됩니다.

git rebase --onto <commit-id>^ <commit-id>

언급URL : https://stackoverflow.com/questions/37219/how-do-you-remove-a-specific-revision-in-the-git-history

반응형