제 힘내 병합하고 힘내 리베이스 비교

 

힘내  병합  힘내 비교 리베이스

원본 : 후 Jianghua  후 동급생과 친구의 일기 성장  2017년 3월 22일을

git rebase 이 명령은 종종 힘내 마법으로 간주되어, 초보자는 멀리해야한다. 적절하게 사용한다면, 그것은 당신의 팀이 너무 많은 문제를 제거 개발 제공 할 수 있습니다. 이 글에서, 우리는 비교합니다 git rebase및 이와 유사한 git merge명령, 힘내 워크 플로우를 모두 찾을 리베이스 사용합니다.

개요

   당신이 알아야 할 첫 번째 일은이다 git rebase , 그리고  실제로하는 일은 동일합니다. 그들은 변화의 지점이 다른 지점에 통합 할 수 있도록 설계, 그러나 그들의 구현은 다소 차이가있다.git merge

상상 당신은 새로운 기능을 개발하는 특별한 지점을 만든 다음 팀의 다른 구성원이 새 마스터 분기에 투입했다. 이러한 상황은 매우 일반적인해야합니다 위해이 제출 역사는 협력 할 수 힘내를 사용하는 개발자를 위해, (포크)는이 두 갈래로 나눠져의 원인이됩니다.  

지금, 당신의 직무 및 개발의 새로운 제출 마스터가 관련되는 경우. 병합 또는 리베이스 : 새로운 당신의 분기를 제출 통합하기 위해, 두 가지 옵션이 있습니다. 

옵션을 병합

  기능 지점 쉬운 방법으로 마스터 분기 다음 명령을 사용하는 것입니다 :

git checkout feature 
git merge master

양자 택일로, 당신은 행 Yajian에 넣어 수 있습니다 :

git merge master feature

이 커밋 (기능 (기능) 가지 새로운 병합 만듭니다 함께 역사의 두 가지를 연결됩니다 커밋 병합을). 아래 분기 구조를 얻을 수 있습니다 :

병합 다행히, 그것은 안전 운전이다. 기존 지점이 REBASE 잠재적 인 단점을 피하기 위해 변경되지 않습니다 (나중에 말할 것입니다).

반면에, 이것은 또한 각 지점은 관련이없는 제출 병합 기능을 도입 업스트림 변경 내용을 병합된다는 것을 의미합니다. 마스터가 매우 활성화되어 있으면, 그것은 지사의 더 많거나 적은 역사를 오염 것입니다. 하지만 고급 git log옵션은이 문제를 완화 할 수 있지만, 개발자를위한, 또는 프로젝트의 역사를 이해의 어려움을 증가 할 것이다.

옵션을 리베이스

대안 병합으로, 당신은 마스터 지점에이 기능 지점을 같은 수 있습니다 :

git checkout feature 
git rebase master

그것은 효과적으로 모든 마스터를 통해 제기 통합의 새로운 지점을 넣어 다시 마스터 분기에 전체 기능 분기를 이동합니다. 그러나, 프로젝트의 역사를 다시 쓸 것이다 리베이스, 그것은 병합 커밋 가지고 있지만, 원래 분기에 각각 제출에 대한 새로운 제출을 생성하지 않습니다.

가장 큰 장점은 매우 깨끗합니다 프로젝트의 역사를 커밋 리베이스이다. 우선, 그것은 이눔되지 않는  불필요한 합병 병합을 제출 도입한다. 위 그림과 같이 두 번째로, 완벽하게 선형 보여주는 최종 프로젝트의 역사로 이어지는 리베이스 - 당신은 어떤 분기점없이 브라우저의 시작부터 끝까지 투사 할 수 있습니다. 이보다 쉽게 사용할 수있게 git log , git bisect 프로젝트의 역사를 볼 수 gitk이.

보안 및 추적 그러나,이 간단한 커밋 역사는 두 가지 문제를 가져올 것이다. 당신이 위반하는 경우 황금 규칙을 리베이스 , 개발 워크 플로우에게 치명적인 영향을 줄 수있는 프로젝트의 역사를 다시 작성합니다. 또한, 작업이 증가하지 않는 리베이스는 다시 결합 - 그래서 당신은 함께 상류 지점 기능 분기를 와서 몇시에 볼 수 없습니다.

대화 형 REBASE

  대화 형 REBASE는 제출의 새로운 지점으로 변경할 수 있습니다. 이 지점에 병력을 완벽하게 제어 할 수 있기 때문에, 자동 REBASE보다 더 강력하다. 일반적으로,이 기능은 혼란의 역사를 정리하기 전에 마스터 분기에 분기하는 데 사용됩니다.

자식에 -i 옵션은 대화 형 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  

이 목록은 분기처럼 될 것입니다 후 REBASE이 실행됩니다 정의합니다. 픽 순서를 변경하거나 역사의이 지점이 당신의 아이디어에 따라 변경 될 수 있습니다 순서. 예를 들어, 두 번째는 사소한 문제가 처음 제출하면 제출에 함께 넣어하기 위해 변경 수정 명령을 사용하여 수정 제출 :

 

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

 

파일을 저장하고 닫습니다, 힘내 REBASE이 당신의 지시에 따라 실행됩니다, 같이 표시됩니다 프로젝트의 역사 :

무시 작은 역사적 기능을 사용하면 분기보다 읽기 제출하게됩니다. 이다  불가능합니다.git merge

황금 규칙을 리베이스

당신이 예 리베이스 이해할 때 가장 중요한 것은 REBASE를 사용하지 않는 경우입니다. git rebase 황금률 : 공통 지점에 그것을 사용하지 않습니다.

마스터 분기를 리베이스 경우 발생하는 예를 들어, 기능에 분기합니다 :

이 모든 다시 이동 기능 지점 마스터 모든 지점을 리베이스에 제출 될 것입니다. 문제는 단지 다른 모든 개발자는 여전히 원본 마스터에서 작업, 코드 저장소에서 일어나는 것입니다. REBASE 새로운 제출을 발생하기 때문에, 힘내 마스터의 마스터 분기 및 다른 사람이 갈라 있다고 생각합니다.

유일한 방법은 두 마스터 가지 커밋 제출 더미가 같은 변경 사항이 포함되어 추가 병합의 결과로, 함께 병합 할 수 있습니다 동기화합니다. 말할 필요도없이,이 사람들이 매우 혼란스러워 할 것이다.

당신이 자식 REBASE를 실행하기 전에 그래서, 자신에게 물어해야합니다, "이 지점에 노력하고 다른 사람이 있습니까?" 대답은 '예'경우, 변경 사항을 제출 (예 : 자식 되돌릴 등) 사운드 방식을 재발견하는, 다시 발톱을 넣어. 그렇지 않으면, 당신은 역사를 재 작성 할 수 있습니다.

강제 푸시

당신이 REBASE 원격 저장소에 밀어 후 지점을 마스터하려면 두 가지가 충돌을 포함하기 때문에, 힘내, 그렇게에서 당신을 중지합니다. 하지만 당신은 푸시를 강제로 -force 플래그를 전달할 수 있습니다. 다만 다음과 같은 :

# 小心使用这个命令!
git push --force 

이것은 매우 이상한 보이는 것은 팀의 다른 구성원에 대한웨어 하우스 REBASE의 지점 후 마스터 지점과 일치하도록 마스터 리모컨을 다시 작성합니다. 당신은 재사용을 무엇을하는지 아는이 명령에만 때,주의해야합니다.

당신이 원격 저장소에 사설을 밀어 로컬 청소를 수행 할 때, 푸시을 강제로 몇 장면 중 하나를 사용 (예를 들어, 롤백). 그것은 말처럼 "오 그 기능을 가지 전에, 사실, 내가 현재의 버전으로 교체했다. 밀어 싶지 않아요."또한, 당신은 다른 사람이 기능 분기에 작동되지 않도록주의해야한다.

개발 워크 플로우에 적용

팀의 힘내 워크 플로우에 더 많거나 적은을 적용 할 수 있습니다 리베이스. 이 섹션에서 우리는 기능 지점의 개발의 여러 단계를 살펴, 혜택은 무엇 리베이스.

워크 플로 균형 자식의 첫 번째 단계의 부정적인 영향이 특징 지점의 기능 개발을 만드는 것입니다 리베이스. 이 지점 구조는 REBASE의 안전한 사용을 할 수 있습니다 :  

지역 청소

워크 플로우에서 가장 사용 REBASE 중 하나를 사용하는 로컬 브랜치를 정리하기 위해 개발되고있다. 때때로 대화 형 REBASE를 수행, 당신은 당신의 기능 지점이 각각 제출이 구체적이고 의미있는 것을 확인할 수 있습니다. 제출 느슨한 원인에 대한 걱정없이 코드를 작성하는 경우 -이 문제를 해결하기 위해 REBASE를 사용할 수 있습니다.

전화 git rebase (예 : 마스터로) 상류 지점 또는 이전 제출에 기능 지점 : 시간, 두 간주로 이동하는 옵션이 있습니다. 은 "대화 형 REBASE"하나 우리는 첫 번째 예제를 보았다. 최신 제출 유용 때 후자 만 몇 번 변경해야 할 때. 예를 들어, 최신 세에서 다음 명령을 대화식 REBASE를 제출 :

git checkout feature 
git rebase -i HEAD~3   通过指定HEAD~3作为新的基提交,你实际上没有移动分支——你只是将之后的3次提交重写了。注意它不会把上游分支的更改并入到feature分支中。 ![Rebasing onto Head~3](https://wac-cdn.atlassian.com/dam/jcr:079532c4-2594-40ed-a5c4-0e3621b9edff/07.svg?cdnVersion=da)

당신은 전체 기능 분기를 다시 작성하는이 방법을 사용하려면, 자식은  병합-자료 명령 갈래 분기 시작베이스 피처를 쉽게 찾을 수 있습니다. 이 명령은 다음 자식 REBASE에 전달할 수있는 다음 ID 기반의 제출을 반환합니다 :

git merge-base feature master

이 로컬 브랜치에 영향을주기 때문에 대화 형 REBASE의 자식은 좋은 방법으로 워크 플로우의 도입을 리베이스. 다른 개발자들은 작업을 완료 한 결과를 볼 수 있으며, 그 분기의 역사를 추적하기 위해 매우 깨끗하고 간단합니다.

그러나 다시,이 사설에서 사용할 수 있습니다. 이 기능 분기 및 다른 개발자와 협력한다면,이 분기가 열려, 당신은 역사를 다시 쓸 수 없습니다.

대화 형 REBASE와 지역 청소에 의해 제출, 자식을 사용하는 것은 불가능  대신의 명령을 병합합니다.

분기 기능에 상류 지점의 변화

개요에서, 우리는 어떻게 기능 자식 분기를 참조  상류 지점 병합 또는 자식 REBASE를 포함하는 방법. 안전한 선택을 병합하는 것은, 당신의 전체 역사를 유지하여 기능 분기, 마스터 지점의 뒤쪽으로 이동 선형 역사를 만듭니다 리베이스하는 것입니다.

자식 리베이스 사용 및 지역의 청소는 매우 유사하다 (그리고 동시에 사용할 수 있습니다)하지만, 사이 마스터의 업스트림 변경을 통합합니다.

기억 원격 지점이 아니라도 마스터 완벽하게 합법적으로 리베이스. 당신과 협력의 동일한 특징점에 다른 개발자, 당신이 사용을 사용하는 경우, 변경 사항은 프로젝트에 통합.

요한은 저장소에서 가져 오기 후 예를 들어, 당신과 다른 개발자 --John-- 기능에 대한이 제출의 몇 가지를 추가, 저장소는 다음과 같이 보일 수 있습니다 :

업스트림 및 마스터에서 동일한 변경 사항을 적용, 그래서 당신이 포크를 해결할 수에 : 중 해당 지역의 지사 및 지점 존의, 또는 해당 지역의 지점이 존의 뒤에 지점을 리베이스에 병합합니다.

모든 일이 변경되지 않은 전에 만 이동 된 해당 지역의 지점에 커밋하기 때문에, 황금 규칙을 위반하지 않았다 여기 Rebase 현재를 리베이스, 있습니다. 그것은 말처럼 "내 변화가 요한의 이동의 뒷면에 적용." 대부분의 경우, 원격 지사를 동기화하는이 제출 합병을 통해보다 직관적이다.

기본적으로 자식 풀 명령은 병합을 수행하지만, 당신은 REBASE을 통해 원격 지사를 통합하기 위해 강제로 -rebase를 전달할 수 있습니다.

풀 요청과 검토

당신이 당신의 코드 리뷰 프로세스의 일부로 요청을 당겨 경우, 당신은 당신이 끌어 오기 요청을 생성 한 후 자식이 리베이스 사용하지 않도록해야합니다. 만큼 당신이 끌어 오기 요청을 시작으로, 다른 개발자 즉, 코드를 볼 수있는 일반적인 지점으로이 지점입니다. 망할 놈의 역사를 다시 쓰기가 발생합니다 당신의 동료들은 이후의 제출이 어려운 지점을 찾을 수 있습니다.

다른 개발자의 변경 사항은 자식을 사용해야  대신 자식 REBASE의 병합을 통합 할 수 있습니다.

따라서, 코드 정리를 제출하기 전에 대화 형 REBASE 풀 요청을 사용하는 것은 일반적으로 좋은 생각입니다.

함수 분파 인용

함수가 팀을 전달하면 이후 분기 선택 마스터 분기를 리베이스, 또는 사용의 자식을 수행 할 수 있습니다  주요 코드베이스에이 기능을 병합합니다.

이 변경은 상류 지점 기능에 통합 될 것입니다 것은 매우 비슷하지만, 당신은 마스터 지점에 제출 다시 작성할 수 없습니다, 당신은 결국 자식 사용해야합니다  이 기능을 통합하는 병합. 당신이 병합 REBASE를 수행하기 전에 그러나, 당신은 병합 똑바로, 그리고 마지막으로 완전히 선형 역사를 커밋이다 생성 된 것을 확인할 수 있습니다. 당신은 또한 풀 요청 이후에 제출 추가 할 수 있습니다이 방법.

 

당신이 자식 rebase에 완전히 익숙하지 않은 경우, 당신은 또한 임시 지점에서 리베이스 수행 할 수 있습니다. 이 경우, 실수로 엉망 당신의 기능 지점의 역사를하는 경우, 당신은 또한 원래의 지점을 확인하고 다시 시도 할 수 있습니다.

예를 들면 :

git checkout feature
git checkout -b temporary-branch
git rebase -i master
# [清理目录]
git checkout master
git merge temporary-branch

개요

당신은 당신이에서 지식 포인트를 리베이스 사용하기 전에 알아야합니다. 당신이 깨끗하고 선형 프로젝트 역사를 원하는 경우, 불필요한 병합 커밋하지, 당신은 자식 대신 자식의 리베이스 사용해야  다른 가지에 변경 사항을 적용 병합합니다.

프로젝트의 전체 역사를 저장하고, 공통의 지점에 커밋 재 작성하지 않도록하려는 경우 반면에, 당신은 자식 사용할 수 있습니다  병합. 두 옵션 모두 매우 쉽게 쓸 수 있지만, 적어도 당신은 이제 선택의 여지가 자식 REBASE 있습니다.

원본 소스

리베이스 대 병합

 

 
 

추천

출처www.cnblogs.com/idyllcheung/p/11614291.html