다른 브랜치의 특정 커밋에서 브랜치를 만드는 방법


107

마스터 브랜치에서 여러 커밋을 만든 다음 dev 브랜치에 병합했습니다.

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

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

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

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

추신 : 여기 https://github.com/RolandXu/test_for_branch 에서 github에서 예제를 만들었습니다.

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

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

내가 기대하는 것은 테스트 분기에 aa.txt bb.txt cc.txt가 포함되어 있다는 것입니다. 그러나 테스트 분기에는 aa.txt 및 cc.txt 만 포함됩니다. 마스터 브랜치에서 브랜치를 생성했을 가능성이 높습니다.

답변:


152

이 형식의 branch명령 (시작점 포함)을 사용하는 경우 현재 위치 HEAD는 중요하지 않습니다 .

당신이하는 일 :

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • 먼저, 당신은 당신 HEAD의 지점 을 설정합니다 dev.

  • 둘째, commit시 새 분기를 시작합니다 07aeec98. 이 커밋에는 bb.txt가 없습니다 (github repo에 따라).

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

git branch test

또는 다른 사람들이 대답했듯이 한 번의 작업으로 분기 및 결제 :

git checkout -b test

07aeec98지점의 일부 라는 사실에 혼란 스러울 수 있다고 생각합니다 dev. 이 커밋이의 조상이라는 것은 사실이며 dev의 최신 커밋에 도달하려면 변경해야합니다 dev. 그러나 최신 버전에 도달하는 데 필요한 다른 커밋 dev이며 07aeec98.

8480e8ae(bb.txt를 추가 한 위치) 예를 들어 07aeec98. 에서 분기하는 경우에서 07aeec98도입 한 변경 사항을받지 못합니다 8480e8ae.

즉, 분기 A와 분기 B를 분기 C로 병합 한 다음 A의 커밋에 새 분기를 생성하면 B에 변경 사항이 도입되지 않습니다.

여기서도 마찬가지입니다. 두 개의 병렬 브랜치 master 및 dev가 있는데 dev에 병합했습니다. 마스터 커밋 (병합 이전)에서 분기하는 것은 dev의 변경 사항을 제공하지 않습니다.


마스터의 새로운 변경 사항을 기능 브랜치 에 영구적으로 통합하려면 병합 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 분기 모드를 이해하는 데 잘못되었습니다. 그리고 내 문제에 대한 제안이 있습니까? 나는 다른 사람들로부터 적시에 많은 커밋을 가진 마스터 브랜치를 가지고 있습니다 (perforce와 동기화). 개인 작업을하는 개발 브랜치가 있습니다. 마스터 브랜치와 개발 브랜치의 모든 커밋을 포함하는 브랜치를 원합니다. 그러면이 브랜치를 기반으로 브랜치를 쉽게 만든 다음 특정 작업을 시작할 수 있습니다.
RolandXu

댓글에 답할 수 없어서 제안 된 워크 플로우로 답변을 업데이트했습니다.
Gauthier

안녕하세요, 훌륭하고 철저한 답변에 감사드립니다! 호기심 : 결국 왜 하나가되어야 merge the feature branches (not dev!) into master합니까?
cassi.lup 2014 년

dev지점 에는 실제 새로운 개발이 없습니다 . 브랜치 기능을 구체적으로 유지해야합니다. dev병합 커밋 만 포함합니다. 기능을 master함께 병합 한 다음 결과를에 병합하는 것보다 모든 새로운 기능을에 직접 병합하는 것이 더 합리적 master입니다.
Gauthier 2014 년

@Gauthier 당신은 이유에 대한 질문을 다루지 않았습니다. 나에게 그것은 병합 같은 소리 dev단지 기능 A BC로 병합 master개별적으로 병합 동일 A BCmaster. 그렇지 않다면 git이 어떻게 작동하는지 이해하는 데 어려움을 겪고 그 이유에 대해 매우 궁금합니다!
Steven Lu

54

잘못된 순서의 인수가 있습니다.

git branch <branch-name> <commit>

이를 위해 어떤 브랜치가 체크 아웃되었는지는 중요하지 않습니다. 그것은 당신이 말하는 것을 할 것입니다. (커밋 인수를 생략하면 현재 분기와 동일한 위치에 분기를 만드는 것이 기본값입니다.)

새 브랜치를 생성하면서 체크 아웃하려면 :

git checkout -b <branch> <commit>

commit 인수를 생략하면 동일한 동작이 발생합니다.


22

모든 사람이 다음을 사용하여 언급했듯이 로컬에서 수행 할 수 있습니다.

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

또는 github 자체에서이 작업을 수행 할 수 있습니다. 다음 단계를 따르세요.

1- 저장소에서 Commits.

2- 분기하려는 커밋에서을 클릭 <>하여 기록의이 시점에서 저장소를 찾아보십시오.

역사를 저 지르다

3- tree: xxxxxx왼쪽 상단 의 를 클릭하십시오 . Create branch xxx아래 그림과 같이 새 분기 이름을 입력하십시오 .

새 분기 만들기

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


이것이 제가 필요로하는 것입니다 .. 웹 사이트에서 그것을하는 방법
eharo2

나는 그것을 몰랐다. 이거 야. GUI는 훌륭하고 CLI에서 벗어나고 싶었습니다.
Rohit Gupta

11

시험

git checkout <commit hash>
git checkout -b new_branch

커밋은 두 개의 개별 분기가 아닌 트리에 한 번만 존재해야합니다.

이를 통해 특정 커밋을 확인하고 원하는 이름을 지정할 수 있습니다.


안녕하세요 저는 git log dev 및 git log master를 사용해 봅니다. 커밋 해시 ID가 마스터 브랜치에서 dev 브랜치로 병합 한 커밋에 대해 동일하다는 것을 알았습니다
RolandXu

처럼 뭔가를 사용하는 것도 도움이 될 수 있습니다 gitk로그 시각화
ZMorek

github에 새로 예제를 추가합니다. 그리고 Gauthier는 이미 git 분기 모드를 오해한다는 내 질문에 대답했습니다. 감사합니다 :)
RolandXu 2011

이것은 내가 생각하는 단호한 대답입니다. 감사합니다
virusss8

9

너가해야되는:

git branch <branch_name> <commit>

(당신은 브랜치 이름과 커밋을 바꾸고있었습니다)

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

git checkout -b <branch_name> <commit>

대신 지점 이름을 사용하면 지점 끝에서 지점을 얻습니다.


그게 HEAD의미 가 아닙니다 . 대신 "가지의 끝"또는 "가지가 가리키는 커밋"이라고 말할 수 있습니다.
Cascabel 2011

@Jefromi-순수 주의자가 되려면 가지 자체가 가지의 끝을 가리키는 포인터이기 때문에 가지만 말할 수 있습니다.
manojlds dec.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.