programing

merge --squash와 rebase의 차이점은 무엇입니까?

javamemo 2023. 4. 10. 20:50
반응형

merge --squash와 rebase의 차이점은 무엇입니까?

나는 스쿼시와 리베이스의 차이를 이해하려고 노력하고 있다.제가 알기로는 리베이스 할 때 스쿼시를 하는 걸로 알고 있어요.

커밋 병합: 브랜치 내의 모든 커밋을 유지하고 기본 브랜치 상의 커밋과 인터리브합니다.여기에 이미지 설명 입력

머지 스쿼시: 변경 내용은 유지되지만 개별 커밋은 이력에서 제외됩니다.

기본 재배치: 이렇게 하면 기능 브랜치 전체가 마스터 브랜치 끝에서 시작되도록 이동하며 모든 새로운 커밋을 마스터에 효과적으로 통합합니다.

여기에 이미지 설명 입력

자세한 것은 이쪽


처음 두 그림은 GitHub Docs의 풀 요청 병합 정보에서 가져온 것입니다.

둘다요.git merge --squash그리고.git rebase --interactive"스퀴드" 커밋을 생성할 수 있습니다.하지만 그들은 다른 목적을 가지고 있다.

는, 머지 관계를 표시하지 않고, 행선지 브랜치로 스퀴시 커밋을 작성합니다.(주의: 커밋은 곧바로 생성되지 않습니다.추가 커밋이 필요합니다.git commit -m "squash branch")

이것은 소스 브랜치를 완전히 폐기하고 싶을 때 유용합니다(SO 질문에서 추출한 스키마).

git checkout stable

          X               stable
         /
a---b---c---d---e---f---g tmp

대상:

git merge --squash tmp
git commit -m "squash tmp"


# In the following graph, G is c--d--e--f--g squashed together

          X-------------G stable
         /
a---b---c---d---e---f---g tmp

그 후 삭제한다.tmp분점.


참고: 옵션은 있지만, 와 함께 사용할 수 없습니다.--squash사용할 수 없었습니다.--commit그리고.--squash함께.Git 2.22.1(Q3 2019) 이후, 이러한 비호환성은 명백해졌다.

Vishal Verma()reloadbrain의 commit 1d14d0c(2019년 5월 24일)를 참조하십시오.(Merged by Junio C Hamano -- gitster -- in commit 33f2790, 25 Jul 2019)

merge: 거부--commit와 함께--squash

이전에--squash제공되었습니다.'option_commit'가 사일런트 드롭되었습니다.이것은 스쿼시의 no-commit 동작을 덮어쓰려고 했던 사용자에게 놀라움을 줄 수 있습니다.--commit명쾌하게

git/git builtin/merge.c#cmd_merge() 이하가 포함됩니다.

if (option_commit > 0)
    die(_("You cannot combine --squash with --commit."));

는 커밋의 일부 또는 전부를 새로운 베이스로 재생하고, 스쿼시(또는 보다 최근의 「수정」, 「SO」의 질문 참조)할 수 있도록 해, 다음의 주소로 직접 이동합니다.

git checkout tmp
git rebase -i stable

   stable
      X----------------G tmp
     /
a---b

모든 커밋을 뭉개기로 선택한 경우tmp(단, 이와는 달리)merge --squash, 일부 재생과 크래시를 선택할 수 있습니다).

차이점은 다음과 같습니다.

  • squash소스 브랜치에 닿지 않음)tmp원하는 위치에 단일 커밋을 만듭니다.
  • rebase같은 소스 브랜치로 계속할 수 있습니다(계속).tmp)의 내용:
    • 새 기지
    • 더 깨끗한 역사

다음 예부터 시작하겠습니다.

여기에 이미지 설명 입력

기능 브랜치의 변경 내용을 마스터 브랜치에 Marge하기 위한 3가지 옵션이 있습니다.

  1. (커밋)
    기능 브랜치의 모든 커밋 이력을 보관하고 마스터 브랜치로 이동합니다.
    더미 커밋을 추가합니다.

  2. and (기본값 변경 및 병합)
    기능 브랜치의 모든 커밋 이력을 마스터 브랜치 앞에 추가합니다.
    더미 커밋을 추가하지 않습니다.


  3. 모든 기능 브랜치커밋을 1개의 커밋으로 그룹화하여 마스터 브랜치 앞에 추가합니다.
    더미 커밋을 추가합니다.

마스터 브랜치가 각 브랜치를 어떻게 관리하는지 아래에서 확인할 수 있습니다.

여기에 이미지 설명 입력

든든: :
피처 브랜치를 안전하게 삭제할 수 있습니다.

merge squash는 트리(일련의 커밋)를 단일 커밋으로 병합합니다.즉, n개의 커밋에서 이루어진 모든 변경을 단일 커밋으로 압축합니다.

기본 재설정은 트리의 새로운 베이스(부모 커밋)를 선택하는 것입니다.아마도 이것을 수은이라고 하는 용어가 더 명확할지도 모릅니다.그것은 단지 나무의 새로운 땅(부모의 약속, 뿌리)을 고르는 것이기 때문입니다.

인터랙티브 기본 재배치 실행 시 기본 재배치할 커밋을 스쿼시, 선택, 편집 또는 건너뛸 수 있는 옵션이 제공됩니다.

그게 확실하길 바래!

언급URL : https://stackoverflow.com/questions/2427238/what-is-the-difference-between-merge-squash-and-rebase

반응형