git merge squash 및rebase

3083 단어 GitGitHub

merge 형식(메모 대체)


mergepr 시 세 가지 선택
  • 일반merge
  • rebase merge
  • squash merge
  • 이 세 가지가 뭐가 다른지 우리는 현지 지점으로 설명한다

    master 분기 모형


    예를 들어, 만약 이 지점에 몇 개의commit가 있다면

    그리고 또 새로운 지점을 세우고 몇 가지 약속을 개발했다. 그러면 전체적인 그림이 이렇게 된다.

    일반 Merge


    브랜치를 결합할 때 흔히 볼 수 있는 작업은 다음과 같다.
    마스터 지점에 대한 checkout, 합병:git merge devel그리고 사용된 분기 삭제:git branch -D develpush - 원격 브랜치:git push origin master언뜻 보기에는 아무런 문제가 없지만, 실제로는 어떤 결과일까, 합병 전의 지점은 다음과 같다.

    작업 후

    언뜻 보기에는 괜찮은데, 곧은commit선이고, devel 지점 내의 제출도 모두 마스터 지점에 기록되어 있지만, 도대체 이렇게 많은 제출을 기록할 필요가 있는가
    예를 들어 만약에 수십 명이 참가한 대형 프로젝트가 하나를 수정하기 위해 약간의 실수로 몇 십 개의 약속을 홍보했고 merge에 의해 그 때 이 프로젝트의 역사 기록에 몇 십 개의 상관없는commit가 추가되었는데 매니저가 이걸 보면 곤혹스러울 것이다.그리고 몇 번 반복하면 롤백도 힘들어지겠죠.

    squash merge


    여러 개의commit를 하나로 합칠 때gitcommit-amend, 사용 후 자신의commit 이력을 확인할 수 있으며,pick선택,squash합병 등을 통해.마찬가지로merge때도 가능합니다. 단계는 두 개뿐입니다.
    분기 전환 :git checkout mastersquash 형식으로mergemerge:git merge --squash devel이 때 마스터 지점에 제출하지 않은commit가 나타납니다. 주의해야 할 것은 자신의commit, 즉commit의author를 변경한 것입니다. 결과는 다음과 같습니다.

    일반적인merge보다 좋아요. 지금commit이 하나가 됐어요. 하위 지점이 아무리 그래도commit는 여기 하나밖에 없어요!

    rebase merge


    만약 합병하여 작가의 데이터를 남기고 싶다면, 리베이스를 사용하시오
    먼저 devel 지점 체크아웃: git checkout devel중기: git rebase -i master마스터 분기 반환:git checkout master병합: git merge devel두 번째 조작은 devel에서master를 참조하여 중기를 하는 것이다. 중기, 즉 두 개의 지점으로 이동하는 공동 조상은 현재의 지점에서 조상에서 현재의commit를 합병하기 때문에 두 번째 조작에서 이commit들의 처리 방법을 선택할 수 있다. 이때merge를master로 이동하면commit 기록도 하나만 남는다. 아래와 같다.

    현재commithistory가 좋아졌지만, 주의해야 할 것은 원래의commithistory를 바꾸려면 지점의 개발자가 스스로 다시 세워야 한다는 것이다

    이 세 가지 방식을 비교하면 몇 가지 결론을 얻을 수 있다.

  • rebasemaster를 예쁜 상태로 만들고 author
  • 도 식별하기 쉽다
  • squash도 마스터를 예쁜 상태로 만들었지만 마스터의 author는 모두maintainer이지 원래의 owner가 아니다
  • mergemaster의 역사 기록을 오염시켰지만 모든commithistory
  • 를 기록하였다

    좋은 웹페이지 즐겨찾기