내 마스터 브랜치에서 "중간"커밋을 팝업하고 폐기해야합니다. 내가 어떻게 해?


94

예를 들어, 다음 마스터 브랜치에서 이전 rebase로 인해 두 번째 인 커밋 af5c7bf16e6f04321f966b4231371b21475bc4da 만 폐기해야합니다.

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

나는 관리해야한다

  • 첫 번째 커밋 60b413512e616997c8b929012cf9ca56bf5c9113,
  • 세 번째 커밋 e6523efada4d75084e81971c4dc2aec621d45530 및
  • 마지막 커밋 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"버려"두 번째 커밋 af5c7bf16e6f04321f966b4231371b21475bc4da

어떻게 할 수 있습니까? 미리 감사드립니다 Luca

답변:


98

Rebase 또는 Revert 가 옵션입니다. Rebase는 실제로 기록에서 커밋을 제거하므로 두 번째 커밋이 존재하지 않은 것처럼 보입니다. 마스터 브랜치를 다른 리포지토리로 푸시 한 경우 문제가됩니다. 이 경우 rebase 후에 푸시를 시도하면 git은 거부 비 빨리 감기 병합 오류를 제공합니다.

되돌리기는 분기가 다른 저장소와 공유 된 경우 올바른 솔루션입니다. git revert af5c7bf16af5c7bf16이 도입 한 변경 사항을 간단히 되 돌리는 새 커밋을 만듭니다. 이렇게하면 기록이 다시 작성되지 않고 실수에 대한 명확한 기록이 유지되며 다른 저장소가 푸시를 수락합니다.

지우는 좋은 방법 git rebase -i <commit>^ 이 있습니다. 제거하려는 커밋 바로 전에 커밋으로 이동합니다. 대화 형 편집기는 해당 지점까지의 모든 커밋 목록을 보여줍니다. 선택, 스쿼시 등을 수행 할 수 있습니다.이 경우 지우려는 커밋 행을 제거 하고 파일을 저장합니다. Rebase가 작업을 완료합니다.


2
Rebase를 선택하는 경우 rebase에 대한 올바른 커밋은 무엇입니까? 두 번째 만 드롭해야합니다 ...
Luca G. Soave 2011

@ BBJ3 mipadi의 답변을 참조하십시오.
Prajwal Dhatwalia

32

rebase가 옵션 인 경우 rebase하고 그냥 삭제할 수 있습니다.

$ git rebase -i 414ceffc^

rebase가 옵션이 아닌 경우 되돌릴 수 있습니다.

$ git revert af5c7bf16

이전 커밋 인 "git rebase 414ceffc"가 있으면 세 번째 e6523과 첫 번째 60b41도 잃지 않습니까?
Luca G. Soave

3
@Luca G. Soave : 커밋 git rebase을 삭제하도록 특별히 지시 한 경우에만 커밋을 "잃어 버립니다" ( rebase대화 형 모드에서 실행 하고 항목을 제거하여).
mipadi 2011

감사합니다 mipadi, 두 사람이 똑같은 말을 했더라도 근본적으로 광범위한 설명을 위해 JCotton에 투표합니다. 다시 한 번 감사드립니다.
Luca G. Soave 2011

29

여기에서받은 원본 답변의 모든 신용에도 불구하고 질문에 만족스럽게 답변 할 수있는 답변을 찾지 못했습니다. 커밋을 제거하거나 히스토리 중간에있는 커밋 모음을 제거해야하는 상황에 처해 있다면 다음과 같이 제안합니다.

  • 모든 커밋을 포함하는 헤드에서 새 분기를 만들고 전환합니다.
  • 새 기지를 시작하려는 지점으로 새 분기를 되돌립니다.
  • 그런 다음 (여기에 요점이 있습니다) 체리 는 원래 브랜치에서 새 브랜치로 실제로 적용하려는 후속 커밋을 선택하고 더 이상 원하지 않는 커밋 (예 : 삭제중인 커밋)을 건너 뜁니다.
  • 원하는 경우 원래 브랜치의 이름을 이전 코드임을 나타내는 이름으로 바꾼 다음 새 브랜치의 이름을 원래 브랜치의 이름으로 바꿉니다.
  • 마지막으로 변경 사항을 원격 저장소에 푸시합니다 (사용하는 경우). 아마도 "강제 푸시"를 사용해야 할 것입니다. 공동 작업자가 수정본을 가져 오는 데 문제가있는 경우 원격 소스에서 repo를 다시 복제하는 것이 가장 쉬울 수 있습니다. 어쨌든 역사의 중간에서 커밋을 추출한다면 그들과 이야기하고 싶을 것입니다!

체리 따기에 대한 정보는 다음과 같습니다. git으로 체리 따기 커밋은 무엇을 의미합니까?

Tortoise Git을 사용하여 수행하는 방법에 대한 일부입니다 (방금했던 것처럼). 이러한 종류의 작업에 GUI 유틸리티를 사용하는 것이 확실히 더 쉽습니다! TortoiseGit을 사용한 체리 선택


6
이것이 최고의 대답이었을 것입니다!
MadOgre

체리 픽을 사용하는 좋은 방법입니다.이 솔루션은 하나 이상의 커밋을 "건너 뛰고"싶을 때 더 좋습니다.
Johnny Willer

원래 질문을 실제로 다루지 않습니다. 제안 된 솔루션이 작동하는 동안에는 훨씬 더 많은 시간이 소요되고 / 어렵고 IMO는 아무런 이점도 제공하지 않습니다. 브랜치가 이미 밀려 났고 (그리고 야생에서 사용 되었다면) 되돌리기 전략이 아마도 답일 것입니다. 그렇지 않다면 대화 형을 리베이스하고 문제가되는 커밋을 제거하는 것이 내가 사용할 것입니다. 푸시되었지만 아무도 사용하지 않는다는 것을 알고 있다면 리베이스와 강제 푸시를 통해 벗어날 수 있습니다.
raduw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.