개발관련/Git

체크 아웃을 사용하지 않고 Git 브랜치를 병합, 업데이트 및 가져 오기

Rateye 2021. 12. 29. 11:18
728x90
반응형
질문 : 체크 아웃을 사용하지 않고 Git 브랜치를 병합, 업데이트 및 가져 오기

저는 A와 B라는 두 개의 분기가있는 프로젝트에서 작업합니다. 저는 일반적으로 분기 A에서 작업하고 분기 B의 항목을 병합합니다. 병합을 위해 일반적으로 다음을 수행합니다.

git merge origin/branchB

그러나 분기 A와 먼저 병합하지 않고 때때로 분기를 체크 아웃 할 수 있으므로 분기 B의 로컬 복사본도 유지하고 싶습니다.이를 위해 다음을 수행합니다.

git checkout branchB
git pull
git checkout branchA

분기를 앞뒤로 전환하지 않고도 하나의 명령으로 위의 작업을 수행 할 수있는 방법이 있습니까? 이를 git update-ref 를 사용해야합니까? 어떻게?

답변

짧은 답변

빨리 감기 병합을 수행하는 한 간단히 다음을 사용할 수 있습니다.

git fetch <remote> <sourceBranch>:<destinationBranch>

예 :

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

Amber의 대답 은 빨리 감기의 경우에도 작동하지만 git fetch 를 사용하는 것이 분기 참조를 강제로 이동하는 것보다 조금 더 안전합니다. 왜냐하면 git fetch 는 실수로 빨리 감기가 아닌 경우 자동으로 방지하기 때문입니다. t refspec에서 +

 

긴 답변

빨리 감기가 아닌 병합이 발생하는 경우 먼저 A를 체크 아웃하지 않고 분기 B를 분기 A로 병합 할 수 없습니다. 잠재적 인 충돌을 해결하려면 작업 복사본이 필요하기 때문입니다.

그러나 빨리 감기 병합의 경우 정의에 따라 이러한 병합으로 인해 충돌이 발생하지 않기 때문에 가능합니다. 분기를 먼저 확인하지 않고이를 수행하려면 refspec과 함께 git fetch

feature 체크 아웃 한 master 를 업데이트하는 예입니다 (빨리 감기가 아닌 변경 허용 안 함).

git fetch upstream master:master

이 사용 사례는 매우 일반적이므로 다음과 같이 git 구성 파일에 별칭을 만들고 싶을 것입니다.

[alias]
    sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'

이 별칭의 기능은 다음과 같습니다.

  1. git checkout HEAD : 작업 복사본을 분리 된 헤드 상태로 만듭니다. 이것은 체크 아웃 한 동안 master 를 업데이트하려는 경우 유용합니다. master 대한 브랜치 참조가 움직이지 않을 것이기 때문에와 관련이 필요하다고 생각합니다. 그러나 그것이 정말로 내 머리 위에서 바로 벗어난 것인지 기억이 나지 않습니다.
  2. git fetch upstream master:master : 이것은 로컬 master upstream/master 와 같은 위치로 빨리 감습니다.
  3. git checkout - 이전에 체크 아웃 한 브랜치를 체크 아웃합니다 ( - 가 수행하는 작업입니다).

 

 

(non-)fast-forward 병합에 대한 git fetch 구문

fetch 명령이 실패하도록하려면 다음 형식의 refspec을 사용하면됩니다.

git fetch <remote> <remoteBranch>:<localBranch>

비 빨리 감기 업데이트를 허용하려면 refspec 앞에 +

git fetch <remote> +<remoteBranch>:<localBranch>

를 사용하여 로컬 저장소를 "원격"매개 변수로 전달할 수 있습니다 . :

git fetch . <sourceBranch>:<destinationBranch>

 

설명서

이 구문을 설명 하는 git fetch 문서에서 (강조 내) :

<refspec>

<refspec> 매개 변수의 형식은 + , 소스 참조 <src> , 콜론 : , 대상 참조 <dst> 순입니다.

<src> 와 일치하는 원격 참조를 가져오고 <dst> 가 빈 문자열이 아니면 일치하는 로컬 참조를 <src> 사용하여 빨리 감습니다. 선택적 더하기 + 를 사용하면 빨리 감기 업데이트가되지 않더라도 로컬 참조가 업데이트됩니다.

  1. 작업 트리를 건드리지 않고 Git 체크 아웃 및 병합
  2. 작업 디렉토리를 변경하지 않고 병합

 

 

출처 : https://stackoverflow.com/questions/3216360/merge-update-and-pull-git-branches-without-using-checkouts
728x90
반응형