Articles

git rebase (한국어)

Rebasing 은 커밋 시퀀스를 새로운 기본 커밋으로 이동하거나 결합하는 프로세스입니다. 리베이싱은 기능 분기 워크플로의 컨텍스트에서 가장 유용하고 쉽게 시각화됩니다. 일반적인 프로세스로 시각화할 수 있으며 다음과 같다:

에서는 콘텐츠 관점에서,리베이 변경의 기초점에서 하나 투입하기로 표시되는 경우 당신이 만들어진 지점 에서 다른다., 내부적으로 Git 은 새로운 커밋을 만들어 지정된베이스에 적용하여이를 수행합니다. 분기가 동일하게 보일지라도 완전히 새로운 커밋으로 구성된다는 것을 이해하는 것이 매우 중요합니다.

사용법

rebasing 의 주요 이유는 선형 프로젝트 기록을 유지하는 것입니다. 예를 들어 피처 브랜치에서 작업을 시작한 이후 마스터 브랜치가 진행된 상황을 생각해보십시오., 당신이 원하는 최신 업데이트를 얻을 마스터점에서 당신의 기능을 지지만,당신을 유지하려면 지점의 역사는 청소로 나타나도록 만약 당신이 일하고 최신입니다. 이렇게하면 나중에 기능 분기를 다시 마스터 분기로 새로 병합 할 수있는 이점이 있습니다. 왜 우리는”깨끗한 역사”를 유지하기를 원합니까? 회귀의 도입을 조사하기 위해 Git 작업을 수행 할 때 깨끗한 히스토리를 갖는 이점은 가시적이됩니다. 더 실제 시나리오는 다음과 같습니다.

  1. 버그에서 확인입니다., 성공적으로 작동 한 기능이 이제 고장났습니다.
  2. 개발자 검사의 역사,브랜를 사용하는git log문의”깨끗한 역사는”개발자가 신속하게 할 수있는 이유에 대해 프로젝트의 역사.
  3. 개발을 식별 할 수없는 경우 버그를 사용하여 소개git log그래서 개발자를 실행하는git bisect.
  4. 기 때문에 git 역사는 청소,git bisect는 세련되고 정의 설정에 투입하는 비교를 찾을 때 회귀분석 등을 다룬다., 개발자는 버그를 도입 한 커밋을 신속하게 찾아 그에 따라 행동 할 수 있습니다.

개별 사용 페이지에서 git log 및 git bisect 에 대해 자세히 알아보십시오.

하기 위한 두 가지 옵션이 있습니다 통합하는 기능으로 마스터 브랜치:병합이 직접 또는 리베고 다음을 합병. 이전 옵션은 3 방향 병합 및 병합 커밋을 초래하고 후자는 빨리 감기 병합 및 완벽하게 선형 히스토리를 초래합니다. 다음 다이어그램은 마스터 브랜치에 리베이스하여 빨리 감기 병합을 촉진하는 방법을 보여줍니다.,

Rebasing 은 업스트림 변경 사항을 로컬 저장소에 통합하는 일반적인 방법입니다. Git merge 로 업스트림 변경 사항을 당기면 프로젝트가 어떻게 진행되었는지보고 싶을 때마다 불필요한 병합 커밋이 발생합니다. 다른 한편으로,리베이싱은”나는 모든 사람들이 이미 한 일에 대한 나의 변화를 기반으로하고 싶다.”

public history

rewriting history 에서 이전에 논의한 것처럼 커밋을 공용 저장소로 푸시하면 커밋을 리베이스하지 않아야합니다., 리베이스는 이전 커밋을 새로운 커밋으로 대체 할 것이고 프로젝트 기록의 일부가 갑자기 사라진 것처럼 보일 것입니다.

Git Rebase Standard vs Git Rebase Interactive

Git rebase interactive 는 git rebase 가-- i인수를 수락 할 때입니다. 이것은”대화 형”의 약자입니다.”인수가 없으면 명령이 표준 모드로 실행됩니다. 두 경우 모두 별도의 기능 분기를 작성했다고 가정 해 보겠습니다.,

 # Create a feature branch based off of master git checkout -b feature_branch master # Edit files git commit -a -m "Adds new feature" 

Git 은 리베이스 표준 모드에서 자동으로 수행됩니다.사에서 당신의 현재 작업 지점과 적용이 그들의 머리에 전달됩니다.

 git rebase 

이 자동으로 개상 현재 지점에될 수 있는 어떠한 종류의 commit 참조(예를 들어,ID,지점 이름,태그,또는 상대적인 참조하여HEAD).

git rebase-i플래그로 실행하면 대화식 rebasing 세션이 시작됩니다., 모든 커밋을 맹목적으로 새로운베이스로 옮기는 대신 대화식 리베이싱을 통해 프로세스의 개별 커밋을 변경할 수 있습니다. 이를 통해 기존 일련의 커밋을 제거,분할 및 변경하여 기록을 정리할 수 있습니다. 스테로이드에Git commit --amend와 같습니다.

 git rebase --interactive 

이 개상 현재 지점에그러나 사용하는 대화형 리베니다. 그러면 리베이스할 각 커밋에 대한 명령(아래에 설명됨)을 입력할 수 있는 편집기가 열립니다., 이러한 명령은 개별 커밋이 새베이스로 전송되는 방법을 결정합니다. 커밋 목록의 순서를 변경하여 커밋 자체의 순서를 변경할 수도 있습니다. Rebase 의 각 커밋에 대한 명령을 지정하면 Git 은 rebase 명령을 적용하는 커밋을 재생하기 시작합니다. 다 리베이스 편집하는 명령은 다음과 같습니다:

리베이스에 추가 명령

상세한 역사를 다시 쓰기 페이지 리베이스를 변경하는 데 사용할 수 있습니다 나이가 여러 commits,최선을 다하고 파일에 여러 메시지입니다., 이들은 대부분의 일반적인 애플리케이션,git rebase또한 추가 명령행 옵션을 사용할 수 있는 더 복잡한 응용 프로그램입니다.

  • git rebase -- d는 재생 중에 커밋이 최종 결합 된 커밋 블록에서 폐기된다는 것을 의미합니다.
  • git rebase -- p는 커밋을 그대로 둡니다. 커밋의 메시지 나 내용을 수정하지 않으며 여전히 분기 기록에서 개별 커밋이 될 것입니다.
  • git rebase -- x재생 중에 표시된 각 커밋에서 명령 줄 쉘 스크립트를 실행합니다., 유용한 예제를 실행하는 것입 코드베이스의 테스트에는 특정 커밋을 수 있는 식별하는 데 도움이 재발하는 동안에는 리베이스.

요점을 되풀이하다

대화 형 rebasing 당신에게 당신의 프로젝트 역사의 모습을 완벽하게 제어 할 수 있습니다. 이는 많은 자유를 개발할 수 있으므로 그들을 저지 복잡한 역사 동안 그들은 집중에 코드를 작성한 다음 다시 가고 그것을 정리 후 사실이다.

대부분의 개발자를 사용하여 리베이스화하는 폴란드어 기능 지기 전에 병합으로 그것의 기본 코드 베이스., 이 기회를 제공 하 스쿼시 중요하지 커밋,삭제 사용되지 않는 사람,확인 다른 모든 것은 순서로 투입하기 전에는”공식적인”프로젝트의 역사. 다른 모든 사람들에게는 전체 기능이 단일 일련의 잘 계획된 커밋으로 개발 된 것처럼 보일 것입니다.

대화 형 rebasing 의 실제 힘은 결과 마스터 브랜치의 역사에서 볼 수 있습니다. 다른 사람처럼 당신이 화려한 개발자를 구현한 새로운 기능과 완벽한 금액의 범했다., 이것이 대화식 리베이스가 프로젝트의 기록을 깨끗하고 의미있게 유지할 수있는 방법입니다.

구성 옵션

git config를 사용하여 설정할 수있는 몇 가지 rebase 속성이 있습니다. 이 옵션은git rebase출력 모양과 느낌을 변경합니다.

  • rebase.stat:기본적으로 false 로 설정된 부울입니다. 이 옵션은 마지막 debase 이후 변경된 내용을 보여주는 시각적 diffstat 콘텐츠 표시를 토글합니다.
  • rebase.autoSquash:--autosquash동작을 토글하는 부울 값입니다.,
  • rebase.missingCommitsCheck:할 수 있는 여러 설정 값을 변경하는 리베이 동작 주위에 누가한다.,/tr>

    error

    Stops the rebase and prints removed commit warning messages

    ignore

    Set by default this ignores any missing commit warnings
    • rebase.instructionFormat: A git log format string that will be used for formatting interactive rebase display

    Advanced rebase application

    The command line argument --onto can be passed to git rebase., 할 때에 git 은 리베이스--onto모드 명령을 확대하기:

      git rebase --onto 

    --onto명령할 수 있는 더 강력한 형태 또는 재구축할 수 있는 전달하는 특정 심판을 끝의 리베이스.
    자 말로는 우리가 예 repo 가지와 같다.

      o---o---o---o---o master \ o---o---o---o---o featureA \ o---o---o featureB 

    featureB 기반으로 featureA,그러나,우리는 실 featureB 에 의존하지 않는 임의 변경에 featureA 출할 수 있습니다 분 master.

      git rebase --onto master featureA featureB 

    featureA 는입니다., master고 featureB 은 참조를 위해 무엇을HEAD가리킵니다. 결과는 다음:

      o---o---o featureB / o---o---o---o---o master \ o---o---o---o---o featureA 

    이해 위험으로의 재구축

    주의할 점을 고려할 때 Git 은 리베이 병합 충돌이 될 수 있습니다 더 자주 중 리베이스 워크플로우. 이것은 마스터에서 탈선 한 수명이 긴 브랜치가있는 경우에 발생합니다., 결국 당신이 원하는 리베이스에 대한 마스터 및 그 시간에 포함될 수 있습니다 많은 새로운 투 지점의 변화와 충돌할 수 있습니다. 이것은 마스터에 대해 분기를 자주 리베이스하고 더 자주 커밋함으로써 쉽게 해결할 수 있습니다. --continue--abort명령줄 인수로 전달할 수 있을git rebase진출하거나 재설정의 튜토리얼을 다룰 때에 충돌이 있습니다.

    더 심각한 리베이스주의해야 할 점은 대화식 기록 재 작성에서 커밋이 손실된다는 것입니다., 대화 형 모드에서 리베이스를 실행하고 스쿼시 또는 드롭과 같은 하위 명령을 실행하면 브랜치의 즉시 로그에서 커밋이 제거됩니다. 언뜻보기에 이것은 커밋이 영구적으로 사라진 것처럼 나타날 수 있습니다. git reflog를 사용하면 이러한 커밋을 복원하고 전체 rebase 를 취소 할 수 있습니다. git reflog를 사용하여 손실 된 커밋을 찾는 방법에 대한 자세한 내용은 Git reflog 문서 페이지를 방문하십시오.

    Git Rebase 자체는 심각하게 위험하지 않습니다., 실제 위험이 발생할 경우 실행할 때 역사를 다시 쓰기 대화형 및 개상 강제로 밀어 결과는 원격 지점을 공유하는 다른 사용자. 이것은 다른 원격 사용자의 작업을 당길 때 덮어 쓸 수있는 기능이 있으므로 피해야하는 패턴입니다.

    에서 복구류 용

    경우 다른 사용자가베이스와 강제로 밀어지는 당신이 저지르고,git pull다 덮어쓰 커밋을 기반으로 하는 이전 분기 끝에는 강제로 밀어냈다., 다행히git reflog를 사용하면 원격 분기의 reflog 를 얻을 수 있습니다. 원격 분기의 reflog 에서 ref 를 rebased 하기 전에 찾을 수 있습니다. 할 수 있습 리베이스의 지점에 대하여 원격 심판을 사용하는--onto옵션은 위에서 설명한 대로에서 고급 리베이스 응용 프로그램 섹션입니다.

    요약

    이 기사에서는git rebase사용법을 다루었습니다. 기본 및 고급 사용 사례와 더 많은 고급 예제에 대해 논의했습니다., 몇 가지 주요 논제는 다음과 같습니다.

    • git 은 리베이스 표준을 대화형 모드
    • git 은 리베이스 구성 옵션
    • git 은 리베이스–에
    • git 은 리베이스를 잃을 커밋