git rebase명령에 대한 명성을 가지고 마술 Git 부두는 초보자부터 멀리 있지만,실제로 만들의 삶을 훨씬 더 쉽게 개발 팀과 함께 사용할 때 관리. 이 문서에서,우리는 비교git rebase와 관련된git merge명령을 식별하는 모든 잠재적인 기회를 통합하는 리베이스로 전형적인 워크플로 Git.,

개념

첫 번째 것에 대해 이해하는git rebase은 그 해결되는 동일한 문제로git merge. 이 두 명령은 한 분기의 변경 사항을 다른 분기로 통합하도록 설계되었습니다.

을 고려할 때 어떤 일에 작업을 시작하는 새로운 기능적 지점,다른 팀 구성원이 업데이트master지점으로 새로운 커밋. 이로 인해 Git 을 공동 작업 도구로 사용한 사람이라면 누구나 잘 알고 있어야하는 갈래 역사가 생깁니다.,

이제 말하는 새로운 범master관련된 기능는 당신이에 최선을 다하고 있습니다. 새 커밋을feature브랜치에 통합하려면 병합 또는 rebasing 이라는 두 가지 옵션이 있습니다.,

병합 옵션

는 가장 쉬운 옵션을 병합하는 것입master지점으로 기능을 사용할 수은 다음과 같습니다.

git checkout feature git merge master

또는할 수 있습 응축 이것을 liner:

 git merge feature master

이”병합 commit”feature지점 함께 묶어의 역사는 모두 가지는 분기 구조는 다음과 같습니다.

병합하는 것이 좋기 때문에 그것의 비파괴 작업입니다. 기존 분기는 어떤 식 으로든 변경되지 않습니다., 이렇게하면 리베이스의 잠재적 인 함정을 모두 피할 수 있습니다(아래에서 설명합니다).

On the other hand,또한 이 의미는feature분야는 외부 병합 commit 모든 필요한 시간을 통합하는 업스트림을 변경합니다. master가 매우 활성화되어 있으면 기능 분기의 기록을 상당히 오염시킬 수 있습니다. 는 것이 가능 이 문제를 해결하기 위해 고급git log옵션,그것을 어렵게 만들 수 있습에 대한 다른 개발자들이 쉽게 이해할 수 있도록,프로젝트의 역사.,

튜토리얼 옵션

대안으로 병합할 수 있습 리베이스feature지점에master지점은 다음과 같은 명령을 사용하여:

git checkout feature git rebase master

이동 전feature지점을 시작의 끝 부분에 있는master지점으로,효과적으로 통합하는 새로운 범master. 하지만,대신 사용하여 병합 commit,리베이스를 다시 쓰는 프로젝트 기록을 만들어 브랜드의 새로운 커밋한 각 commit 에서 원래 지점에 있습니다.,

rebasing 의 주요 이점은 훨씬 깨끗한 프로젝트 기록을 얻을 수 있다는 것입니다. 먼저git merge에 필요한 불필요한 병합 커밋을 제거합니다. 두번째,당신이 볼 수 있듯이,위의 그림에서,리베이 또한 완벽한 선형 프로젝트의 역사—당신은 당신을 따를 수 있습의 끝feature모든 방법을 시작 부분의 프로젝트 없이 모든 포크. 이것은 쉽게 탐색하는 귀하의 프로젝트와 같은 명령을git log,git bisect,andgitk.,

그러나이 깨끗한 커밋 기록에는 안전과 추적 성이라는 두 가지 절충점이 있습니다. 지 않는 경우에 따라 황금률의 리베이스,다시 쓰기 프로젝트에 역사될 수 있는 잠재적으로 치명적인 위해 협력합니다. 그리고,중요한 것,리베이스를 잃은 컨텍스트를 제공합 병합 commit—당신이 볼 수 없는 경우 변경 업스트림으로 통합되었다는 특징이 있습니다.

대화식 Rebasing

대화식 rebasing 은 커밋을 새 분기로 이동할 때 변경할 수있는 기회를 제공합니다., 이는 분기의 커밋 기록을 완벽하게 제어 할 수 있기 때문에 자동화 된 리베이스보다 훨씬 강력합니다. 일반적으로 이것은 기능 분기를master에 병합하기 전에 지저분한 기록을 정리하는 데 사용됩니다.,

로 시작하는 대화형 리베이션,통과하는i옵션을git rebase명령:

git checkout feature git rebase -i master

이 텍스트 편집기를 열고 모두 나열사에 대해 이동:

pick 33d5b7a Message for commit #1 pick 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

이 목록을 정의 정확히 어떤 지점에 리베이스가 수행됩니다. pick명령을 변경하고/하거나 항목을 다시 주문하면 브랜치의 기록을 원하는대로 보이게 할 수 있습니다., 는 경우,예를 들어,2commit 수정을 작은 문제에서 1commit 할 수 있습 응축으로 그들을 하나의 커밋fixup명령:

pick 33d5b7a Message for commit #1 fixup 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

경우 파일을 저장하고 닫,Git 수행합니다 리베이 당신의 지시에 따라 결과,프로젝트의 역사는 다음과 같습니다:

를 제거하는 중요하지 커밋 다음과 같이 기능의 역사를 훨씬 쉽게 이해할 수 있습니다. 이것은git merge단순히 할 수없는 것입니다.,

Rebasing 의 황금률

rebasing 이 무엇인지 이해하면 배워야 할 가장 중요한 것은 그것을하지 않을 때입니다. git rebase의 황금률은 공개 지점에서 절대 사용하지 않는 것입니다.

예를 들어,에 대해 생각하면 어떤 일이 일어날 것을 기준masterfeature점:

리베이스 이동의 모든 범master위에의 끝feature. 문제는 이것이 저장소에서만 발생했다는 것입니다., 다른 모든 개발자는 여전히 원래master로 작업하고 있습니다. 이후 결과 리베에서 새로운 커밋,자식을 생각하는 것이 귀하의master지점의 역사는 갈라서 모두가 다른 사람 이다.

유일한 방법을 동기화하는 두 개의master가지를 병합하는 것입니다 그들을 함께 돌아가,결과에 추가로 병합하는 두 개의 세트의 커밋을 포함하는 동 변경 내용(본래 그들,그리고 사람에서 기준점). 말할 필요도없이 이것은 매우 혼란스러운 상황입니다.,

이전에 실행할git rebase항상 자신에게 묻은”다른 사람이 이점?”그렇다면,당신의 손에 키보드를 시작에 대해 생각하고 비파괴적인 방법을 변경(예를 들어,git revert명령). 그렇지 않으면 원하는만큼 역사를 다시 쓰는 것이 안전합니다.

포스-밀

당신이 시도하는 경우를 밀어베이스master지점이 다시에 원격 저장소의 명령하지 못할을 하기 때문에 그렇게 충돌을 원격으로master지점에 있습니다., 하지만,당신이 할 수 있을 강제로 밀어를 통하여 전달하는--force깃발 아래와 같이

# Be very careful with this command! git push --force

로컬 원격master지점 일치하는 기준 중 하나에서 저장소 및 만드는 일을 매우 혼란의 나머지 부분에 대한 귀하의 팀이 있습니다. 따라서 자신이하는 일을 정확히 알고있을 때만이 명령을 사용하도록 매우주의하십시오.

중 하나만 당신이 강제 추진이 있을 때 수행되는 현지 정리를 한 후 밀라이빗 기능을 지점을 원격 저장소에(예를 들어,백업 목적으로)., 이것은”죄송합니다,나는 그 원래 버전의 기능 브랜치를 실제로 푸시하고 싶지 않았습니다. 대신 현재를 가져 가라.”다시 말하지만,아무도 기능 분기의 원래 버전에서 커밋을 작업하지 않는 것이 중요합니다.

워크 플로우 연습

Rebasing 은 기존 Git 워크 플로우에 팀이 편안한만큼 또는 적게 통합 할 수 있습니다. 이 섹션에서는 기능 개발의 여러 단계에서 리베이스가 제공할 수 있는 이점을 살펴 보겠습니다.,

첫 번째 단계는 모든 워크플로 활용하는git rebase성 전용에 대한 지점은 각각의 특징이다. 이것은 당신에게 필요한 지점 구조를 안전하게 활용하는 리베:

로컬 정

가장 좋은 방법 중 하나를 통합하는 리베이로 당신의 워크플로를 깨끗한 지역,진행 중인 기능입니다. 대화식 리베이스를 주기적으로 수행하면 기능의 각 커밋이 집중되고 의미가 있는지 확인할 수 있습니다., 이것은 당신의 코드를 작성하고 걱정하지 않고 그것으로 절연 커밋—당신은 그것을 해결할 수 있습까지 사후에 이를 공지합니다.

호출할 때는git rebase,당신은 두 가지 옵션을 위한 새로운 기준:기능의 부모로점(예를 들어,master),또는 이전에 투입하는 당신의 특징이다. 우리는 대화 형 리베이싱 섹션에서 첫 번째 옵션의 예를 보았습니다. 후자의 옵션은 마지막 몇 커밋 만 수정해야 할 때 좋습니다. 예를 들어 다음 명령은 마지막 3 개의 커밋에만 대한 대화식 리베이스를 시작합니다.,

git checkout feature git rebase -i HEAD~3

지정하여HEAD~3새로운 기지,당신이하지 않는 실제로 이동하는지 당신은 그냥 대화식으로 다시 쓰기 3 투 그것을 따르십시오. 이렇게하면 업스트림 변경 사항이feature브랜치에 통합되지 않습니다.

하려는 경우 다시 쓰는 모든 기능을 이 방법을 사용하여git merge-base명령이 유용할 수 있습을 찾기 위해 원료의feature지점에 있습니다., 다음과 같은 반환합니다 commit ID 의 원료,할 수 있는 그런 다음 전달을git rebase

git merge-base feature master

이의 사용을 대화형 리베이 좋은 방법을 소개하는git rebase으로 귀사의 워크플로,그것에만 영향을 미치지역. 다른 개발자가 볼 수있는 유일한 것은 완성 된 제품이며,이는 깨끗하고 따라하기 쉬운 기능 분기 기록이어야합니다.

그러나 다시 이것은 개인 기능 분기에만 작동합니다., 당신이 협력으로 다른 개발자를 통해이 같은 기능을 지점,그 지점,공공,당신은 허용되지 않은 다시 작성합니다.

대화식 리베이스로 로컬 커밋을 정리하기위한git merge대안이 없습니다.

통합 업스트림으로 변경 기능

에서 개념적인 개요 섹션에 우리가 보는 방법 기능을 지점을 통합할 수 있는 업스트림에서 변경master중 하나를 사용하여git merge또는git rebase., 병합하는 안전한 선택을 보존의 전체 역사의 저장소에는 리베이스를 만들 역사를 이동하여 귀하의 기능을 지점에 팁의master.

이의 사용git rebase이와 유사한 현지 정리(와 동시에 수행할 수 있습니다)하지만,그 과정에서 그는 통합 그 업스트림에서 커밋master.

master대신 원격 브랜치에 rebase 하는 것이 완벽하게 합법적이라는 것을 명심하십시오., 이는 다른 개발자와 동일한 기능을 공동 작업 할 때 발생할 수 있으며 변경 사항을 저장소에 통합해야합니다.,

경우,예를 들어 및 다른 개발자는 요한이라고 이름을 추가 투입하는feature지점,당신의 저장소는 다음과 같습니다를 가져오는 후 원격feature지점에서 존의 저장소:

를 해결할 수 있습이 포크 정확히 동일한 방법으로 통합하는 업스트림에서 변경master:중 병합하는 로컬featurejohn/feature, 이나 리베이스의 로컬feature위에의 끝john/feature.,

이 용을 위반하지 않는 황금률의 리베이기 때문에 로컬feature커밋이고—모든기 전에는 훼손되지 않은 것입니다. 이것은”존이 이미 한 일에 내 변경 사항을 추가하십시오.”대부분의 상황에서 이것은 병합 커밋을 통해 원격 분기와 동기화하는 것보다 직관적입니다.

기본적으로git pull명령을 수행합 병합하지만,강제할 수 있습니다 통합하는 원격 지점과 리베이스에 의해 전달--rebase옵션을 선택합니다.,

를 검토하는 기능을 가진 풀을 요청

경우 사용자의 요청의 일부로 귀하의 코드는 검토 프로세스,피할 필요가 사용하는git rebase을 만든 후 당겨 요청을 합니다. 끌어 오기 요청을하자마자 다른 개발자가 귀하의 커밋을 살펴볼 것이며 이는 공개 브랜치임을 의미합니다. 그 기록을 다시 작성하면 Git 과 팀원이 기능에 추가 된 후속 커밋을 추적 할 수 없게됩니다.

의 변경 다른 개발자들이 필요한 통합과 함께git merge대신git rebase.,이러한 이유로 일반적으로 끌어 오기 요청을 제출하기 전에 대화식 리베이스로 코드를 정리하는 것이 좋습니다.

통합하는 승인 기능

후 기능이 승인되었습니다 귀하의 팀에 의해,당신은 옵션의 리베이스 기능에의 끝master지점 사용하기 전에git merge을 통합하는 기능으로 기본 코드 베이스.,

이것은 비슷한 상황을 통합하는 업스트림으로 변경 기능을 지지만,때문에 당신은 허용되지 않습을 다시 쓰기 범master지점,당신은 결국 사용하는git merge을 통합하는 기능입니다. 그러나 병합 전에 리베이스를 수행하면 병합이 빠르게 전달되어 완벽하게 선형 히스토리가 생성 될 것이라고 확신합니다. 이것은 또한 당신에게 풀 요청 중에 추가 된 후속 커밋을 스쿼시 할 수있는 기회를 제공합니다.,

하지 않으면 완전히 편안한git rebase,당신은 항상 수행 할 수 있습니다 다 리베이스에 임시니다. 그렇게하면 실수로 기능의 기록을 엉망으로 만들면 원래 지점을 확인하고 다시 시도 할 수 있습니다. 예를 들어,

git checkout feature git checkout -b temporary-branch git rebase -i master # git checkout master git merge temporary-branch

요약

그리고 그것의 모든 당신이 정말로 시작하기 위해 필요한 리베이스의 지점., 선호하시는 경우 깨끗하고,선형 역사서 불필요한 병합 커밋을 도달해야에 대한git rebase대신git merge통합하는 경우는 변경에서 다른 지점에 있습니다.

On the other hand,을 유지하려면 완벽한 역사의 프로젝트 위험을 피하고 다시 쓰기 공약할 수 있습으로 스틱git merge. 두 옵션 모두 완벽하게 유효하지만 적어도 지금은git rebase의 이점을 활용할 수있는 옵션이 있습니다.피>