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
의 황금률은 공개 지점에서 절대 사용하지 않는 것입니다.
예를 들어,에 대해 생각하면 어떤 일이 일어날 것을 기준master
에feature
점:
리베이스 이동의 모든 범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
:중 병합하는 로컬feature
john/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
의 이점을 활용할 수있는 옵션이 있습니다.피>
답글 남기기