source

다른 분기의 특정 커밋에서 분기를 생성하는 방법

ittop 2023. 8. 20. 12:39
반응형

다른 분기의 특정 커밋에서 분기를 생성하는 방법

저는 마스터 브랜치에서 여러 커밋을 수행한 후 개발 브랜치에 병합했습니다.

마스터 브랜치에서 처음 커밋된 dev 브랜치의 특정 커밋에서 브랜치를 만들고 싶습니다.

다음 명령을 사용했습니다.

git checkout dev
git branch  <branch name> <commit id>

그러나 이것은 내가 예상했던 개발 브랜치가 아닌 마스터 브랜치에서 브랜치를 생성합니다.커밋 ID가 마스터 분기와 dev 분기에서 동일합니다.그렇다면 다른 분기에서 동일한 커밋 ID를 어떻게 구별할 수 있을까요?

PS: 는 GitHub에서 예시를 만들었습니다.

다음 명령을 사용했습니다.

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

테스트 브랜치에 aa.txt, bb.txt, cc.txt포함되어 있을 것으로 예상됩니다.그러나 테스트 분기에는 aa만 포함됩니다.txt 및 cc.txt.마스터 분기에서 분기를 만들었을 가능성이 높습니다.

이 이 형태의 사경우는하용을 한다면,branch는에 있든 .HEAD사실은.

수행할 작업:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • 먼설정다니를 합니다.HEADdev,

  • 는 commit ▁on▁▁new▁a다에 새로운 분기를 시작합니다.07aeec98() 커밋에서 BB는 .입니다.github repo 따라이 서에커 txt.

체크아웃한 위치에서 분기를 시작하려면 시작점 없이 분기를 실행할 수 있습니다.

git branch test

또는 다른 사용자가 답변했듯이, 한 번의 작업으로 지점 및 체크아웃:

git checkout -b test

제 생각에 당신은 그 사실로 인해 혼란스러울 수도 있습니다.07aeec98입니다.dev은 커이밋다조것사다실니입의 입니다.dev그것의 변화는 최근의 약속에 도달하기 위해 필요합니다.devdev꼭 그고이반역있것아는다닙니은의 에 있는 .07aeec98.

8480e8ae(는를 들어 (bb)의 기록에 txt를 추가한 위치)는 예를 들어 의 기록에 없습니다.07aeec98에서 는경우하에서 하면.07aeec98에 의해 도입된 변경 사항을 받지 못할 것입니다.8480e8ae.

즉, 지점 A와 지점 B를 지점 C로 병합한 다음, A의 커밋으로 새 지점을 만들면 B에 도입된 변경 사항을 얻을 수 없습니다.

여기서도 마찬가지로, 당신은 두 개의 병렬 분기 마스터와 개발을 가지고 있었고, 당신은 그것을 개발에 병합했습니다.병합보다 오래된 마스터 커밋에서 분기하는 것은 개발 변경 사항을 제공하지 않습니다.


마스터의 새 변경사항을 피쳐 분기에 영구적으로 통합하려면 병합해야 합니다.master그들 속으로 들어가서 계속합니다.이렇게 하면 피쳐 분기에 병합 커밋이 생성됩니다.

피쳐 분기를 게시하지 않은 경우 업데이트된 마스터를 기준으로 변경할 수도 있습니다.git rebase master featureA발생할 수 있는 충돌을 해결할 준비를 합니다.

병합 커밋 없이 피쳐 분기에서 작업할 수 있고 마스터의 새로운 변경 사항과 통합할 수 있는 워크플로우를 원하는 경우 다음을 권장합니다.

  • 모든 새 피쳐 분기를 마스터의 커밋을 기반으로 합니다.
  • 을 생성합니다.dev주인의 약속에 따라 분점.
  • 피쳐 분기가 마스터의 새 변경사항과 통합되는 방법을 확인해야 할 경우 마스터 및 피쳐 분기를 모두 에 병합합니다.dev.

에 커밋하지 않음dev직접 다른 분기를 병합하는 경우에만 사용합니다.

예를 들어, 기능 A와 B를 작업하는 경우:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

분기를 에 병합dev브랜치를 사용하여 새 마스터와 잘 작동하는지 확인합니다.

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

피쳐 분기에서 작업을 계속할 수 있으며 마스터 및 피쳐 분기 모두에서 새로운 변경사항으로 계속 병합할 수 있습니다.dev정기적으로.

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

새 기능을 통합할 때가 되면 기능 분기를 병합합니다.dev!) 마스터로 전환합니다.

인수의 순서가 잘못되었습니다.

git branch <branch-name> <commit>

그리고 이를 위해 체크아웃된 브랜치는 중요하지 않습니다. 사용자가 말한 대로 합니다. (commit 인수를 생략하면 기본적으로 현재 브랜치와 동일한 위치에 브랜치를 만듭니다.)

새 분기를 생성할 때 체크아웃하려면 다음을 수행합니다.

git checkout -b <branch> <commit>

commit 인수를 생략할 경우 동일한 동작을 수행합니다.

모든 사용자가 언급한 대로 로컬에서 이 작업을 수행할 수 있습니다.

git checkout -b <branch-name> <sha1-of-commit>

또는 GitHub 자체에서 다음 단계를 수행할 수 있습니다.

  1. 리포지토리에서 을 클릭합니다.

  2. 분기할 커밋에서 을 클릭하여 기록의 이 지점에서 리포지토리를 탐색합니다.

    Commits history

  3. 왼쪽 위에 있는 을 클릭합니다.거기에 새 지점 이름을 입력하면 됩니다.아래 그림과 같이 클릭합니다.

    Create a new branch

이제 해당 분기에서 변경 내용을 로컬로 가져와 계속할 수 있습니다.

해라

git checkout <commit hash>
git checkout -b new_branch

커밋은 트리에 한 번만 존재해야 하며, 두 개의 개별 분기에 존재해서는 안 됩니다.

이렇게 하면 특정 커밋을 체크아웃하고 원하는 이름을 지정할 수 있습니다.

다음 작업을 수행해야 합니다.

git branch <branch_name> <commit>

(지점 이름과 커밋을 교환하고 있었습니다.)

또는 다음을 수행할 수 있습니다.

git checkout -b <branch_name> <commit>

지점 이름을 대신 사용하면 지점 팁에서 지점이 나옵니다.

언급URL : https://stackoverflow.com/questions/8483983/how-to-create-the-branch-from-a-specific-commit-in-a-different-branch

반응형