현재 분기를 다른 분기로 병합하는 방법


182

master와 dev의 두 가지가 있습니다. 나는 항상 개발 작업을하고 코드가 프로덕션 용도로 승인되면 마스터 지점에서만 코드를 확인합니다. 그렇게 할 때 다음을 수행해야합니다.

git checkout master
git merge dev
git checkout dev

그것은 끔찍한 장황한 일이며, 자주하는 일을 최소화하고 싶습니다. 마스터 브랜치를 먼저 체크 아웃하지 않고 현재 브랜치 개발에서 다른 브랜치 마스터로 병합하는 데 사용할 수있는 하나의 git 명령이 있습니까? 다음과 같은 것이있을 수 있습니다.

git merge dev to master

대단 할 것입니다. 나는 자식 문서를 살펴 보았고 아무것도 보지 못했다.


1
이것을 위해 git push를 사용해 보셨습니까?
Jay Sullivan

11
푸시 제안과 함께 무엇입니까? 그것은 자신의 저장소 내에서 병합하지 않고 remotes 를 업데이트하기위한 것 입니다.
Cascabel

4
Jefromi는 옳습니다. 푸시는 여기서 유용하지 않습니다. 나는 원격 지점이 아닌 다른 지역 지점에 대해 이야기하고 있습니다.
Chris

2
당신이 커밋되지 않은 로컬 변경 사항이있을 때 더 나쁜이다 : git stash, git checkout master, git merge dev, git checkout dev, git stash pop.
Mu Mind

2
좋은 질문. 나는 현재 분기가 아닌 지점으로 끌어 오기를 원했기 때문에 이것을 원했습니다. 작업 트리의 파일이 변경되면 빌드를 시작하는 프로세스가 있기 때문에 분기 전환을 피하고 싶었습니다.
Kelvin

답변:


94

1. 로컬 저장소에 대한 원격 별명을 추가하십시오 (예 :

git remote add self file:///path/to/your/repository

(또는 창문에서 git remote add self C:\path\to\your\repository)

2. 예를 들어, 자체 리모콘으로 밉니다.

git push self dev:master

2
서브 모듈! 이것은 질문의 문제를 해결할뿐만 아니라 서브 모듈 만있을 때 분기를 전환하는 문제를 해결합니다. 좋은 팁!
eddiemoya

2
+1 창의적이며 작업 트리를 전혀 건드리지 않습니다. 간단히 말하면 : 이것은 /path/to/your/repository작업 트리의 경로입니다. 즉, .git디렉토리를 포함하지 마십시오 . 또한, 이것은 말없이 진행되어야합니다. 리포지를 이동하면 리모컨을 업데이트해야합니다.
Kelvin

나는 이것이 창에서 작동하도록 운이 없다 ... git remote add self file:///c/projects그냥 사용법 메모와 함께 다시 온다
Maslow

2
@ JosephK.Strauss 먼저 현재 분기 ( dev)에 마스터를 병합 한 다음을 사용하여 병합 커밋을 푸시 할 수 있습니다 git push self dev:master.
Leonid Shvechikov에서

4
왜 원격 별명입니까? .나를 위해 잘 작동했습니다 : git push . head:master.
geon

60

@zerome에 의해 현재 가장 많이 투표 된 답변은 좋은 답변이지만 불필요하게 장황합니다.

git repo의 기초에서 당신은 이것을 할 수 있습니다 : git push . dev:master

트리의 어느 곳에서나 작동하는보다 일반적인 솔루션은 다음과 같습니다.

git push $(git rev-parse --show-toplevel) dev:master

3
git push . dev:master내 인생을 많이 단순화했습니다! 최고의 답변, 감사합니다
Jeremy Belolo

병합 된 마스터를 github와 같은 원격 저장소로 푸시합니까? 수행하여 단계 저장git push origin dev:master
알렉스 R을

1
merge --no-ff이것으로 동작 을 복제 할 수 있습니까?
exhuma

1
잘못된 원격 이름 "."을 받고 있습니다. Windows에서. 여전히해야합니까 git remote add self file:///myRepo?
kiewic

1
그러나 이것은 실제로 합병을하지 않습니다 ... 개발자가 마스터보다 앞서 있다면 작동하지만 그렇지 않으면 어떻게됩니까?
Thomas Levesque

44

가장 좋은 방법은 전역 gitconfig ( ~/.gitconfig) 에있는 별칭을 사용하는 것입니다 .

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

모든 저장소에서 다음과 같이 호출 할 수 있습니다.

git merge-to master dev

3
병합이 자동은 아니지만 병합 해결이 필요한 경우 어떻게됩니까? (이 경우에는 마스터에 대한 작업이 없다고 가정하므로 여전히 발생하지는 않습니다.) ...
Stein G. Strindhaug

@Stein : &&, not을 사용했기 때문에 ;병합에 실패하고 다시 전환하지 않습니다. 잘만되면 사용자는 "병합 실패"메시지를보고 처리 할 수있을만큼 똑똑합니다.
Cascabel

6
나는이 merge-to = "!f() { export tmp_branch=자식 분기를 선호 | grep '*'| tr -d '*' ; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f", 현재 내가있는 브랜치를 입력 할 필요가 없습니다. 그래서 내가 합치기 dev를 원 master하고 dev바로 지금 저는 입력합니다git merge-to master
Steve

2
올바른 백틱과 에코가없는 더 나은 버전 :merge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
Simon Epskamp

2
설정 해제 명령이 올바르지 않습니다. 고정은 다음과 같습니다 : merge-to = "! f () {export tmp_branch = git branch | grep '* ' | tr -d '* '; git checkout $ 1 && git merge --no-ff $ tmp_branch && git checkout $ tmp_branch; unset tmp_branch;}; f"
sassman

38

Jefromi 별칭을 약간 수정하면 현재 분기를 입력하지 않아도됩니다.

따라서 다음과 같이 사용하십시오 git merge-to dev.

dev분기로 전환 하고 CURRENT와 병합 한 다음 다시 전환합니다.

예를 들어, master지점 에 있다고 가정하면 마스터에 dev로 병합되고 여전히 마스터에있게됩니다.

확실히 내 dotfiles로 이동합니다 :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"

6

이건 낡았지만 ...

위의 @ kevin-lyda와 @ dmytrii-nagirniak의 솔루션을 결합합니다. 이 별명은 현재 분기를 지정된 분기로 병합합니다. 원격 메소드를 사용하고 git 명령을 사용하여 컨텍스트를 가져옵니다.

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

다음과 같이 사용하십시오 :

git merge-to other-branch-name

4

다른 분기를 체크 아웃하지 않고 현재 분기를 다른 분기로 병합하려면 다음을 수행하십시오.

빨리 감기 병합

정말 쉽습니다. 정의에 따르면 빨리 감기 병합은 단순히 분기 포인터가 커밋 트리에서 앞으로 이동 함을 의미합니다. 따라서 다음을 시뮬레이션하기 만하면됩니다 .

git branch -f master dev

주의 사항 : 이것은 분기 또는 다른 분기 master에있는 커밋 을 가리키는 것으로 가정합니다 dev. 그렇지 않으면 작업 손실이 발생할 위험이 있습니다! git merge빨리 감기가 불가능할 때 병합 커밋을 생성하거나 불평하는 것과 달리이 방법은 자동으로 강제 실행됩니다. 으로 분기 포인터가 다른 커밋을 가리 키도록합니다.

이것은 또한 당신이 repo에서 일하는 유일한 사람이고 / 또는 당신이하는 일을 알고 있다고 가정합니다.

팁 : 당신이를했다면 git fetch당신은 새로운 커밋이 origin/master당신이 이동할 수, master사용하여 확인하지 않고 지점 :

git branch -f master origin/master

병합 커밋을 통한 병합

항상 가능하지는 않습니다. 병합 커밋을 만들려면 병합 작업을 수행해야합니다. 병합 작업을 수행하려면 현재 분기에없는 다른 분기에 커밋이 있어야합니다.

master지점에 커밋이 있는 경우 하지dev, 당신이 할 수있는 지점 :

면책 조항 : 이것은 단지 개념 증명이며, 때로는 그것을 보여주는 것입니다. 입니다. 체크 아웃하지 않고 다른 지점으로 병합하는 것이 가능하다는 것을 위해서입니다. 매일 사용하고 싶다면 쉘 리디렉션을 사용하여 별칭을 만들거나 쉘 스크립트를 만들고 싶을 것입니다. 그런 다음 질문에 표시된 더 짧은 프로세스를위한 쉘 스크립트를 만들 수도 있습니다.

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

설명:

  1. 현재 브랜치와 동일한 커밋을 가리키는 임시 브랜치를 확인하십시오.
  2. master임시 브랜치로 병합 하고 커밋 메시지 편집기를 시작하십시오. 병합 커밋을 분기를에 병합 한 것처럼 보이게 하려면 다음에서 편집하십시오.devmaster

    Merge branch 'master' into temp
    

    이에:

    Merge branch 'dev'
    

    팁 :-m "Merge branch 'dev'" 대신 사용할 수 있습니다-e 더 빨리 .

  3. 업데이트 master병합 커밋을 가리 키도록 분기 포인터를 .
  4. 확인 dev지점을 .
  5. 임시 분기를 강제로 삭제하십시오.

이것은 여전히 ​​작업 트리에 닿지 만 최소한입니다. master개발 변경 사항을 다시 한 번 가져 오기 위해 트리를 원래 상태로 되돌릴 수는 없습니다 . 어떤 사람들은 신경 쓰지 않을 수도 있지만 다른 사람들에게는 중요 할 수도 있습니다.


1

지점에서 오는 경우가 많으며 현재 지점을 병합하고 싶습니다. 이 경우 다음을 수행 할 수 있습니다.

git co - && git merge @{-1}

예를 들면 다음과 같습니다.

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master

1

내 솔루션은 다른 답변과 비슷하지만 다음과 같은 차이점이 있습니다.

  • 이 기능은 가독성을 위해 여러 줄로 나뉩니다.
  • 함수가 호출 set -ex되어 각 명령이 인쇄되고 명령이 실패하면 함수가 즉시 종료됩니다.
  • alias는 첫 번째 (대상 분기)를 제외한 인수를 git merge
  • 이 함수에는 : git merge탭 완성이 일부 쉘 설정에서 작동하도록 하는 null 명령 이 포함되어 있습니다 (예 : gitfastoh-my-zsh)
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.