마스터와 개발 지점 병합


763

나는 두 가지, 즉이 masterdevelopmentGitHub의 저장소에서. 그림과 같이 개발 지점에서 모든 개발을 수행하고 있습니다.

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

이제 development지점의 모든 변경 사항을에 통합하려고 합니다 master. 내 현재 접근 방식은 다음과 같습니다

git checkout master 
git merge development
git push -u origin master 

내가 따르는 절차가 올바른지 알려주십시오.


7
git pull -u지점 (또는 둘 이상을 밀면 모든 지점)의 업스트림 추적을 설정합니다. 일단 설정되면 추적이 지속됩니다. 계속해서 사용할 이유가 없습니다.
David Culp

답변:


1164

나는 일반적으로 첫 번째 로 병합 master하여 development충돌이있는 경우 development지점 자체 에서 해결할 수 있으며 내 master상태는 깨끗합니다.

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

두 가지 접근 방식에는 큰 차이가 없지만 분기를 병합 한 master후 아직 병합하지 않으려는 경우 또는 병합하기 전에 더 많은 작업이 수행되는 경우가 있습니다. 그래서 나는 master마지막 물건까지 손대지 않는 경향이 있습니다.

편집 : 의견에서

병합 한 사람과시기를 추적하려면 병합 --no-ff하는 동안 플래그를 사용할 수 있습니다 . 이 병합 경우에만 일반적으로 유용 developmentmaster병합해야 할 수도 있기 때문에, (마지막 단계) masterdevelopment워크 플로우에 (첫 번째 단계)를 여러 번, 그리고 매우 유용하지 않을 수도 있습니다 이들에 대한 노드를 커밋 작성.

git merge --no-ff development

71
이 접근 방식에는 약간의 단점이 있습니다. 실제 마스터로의 병합은 아마도 빨리 감기 병합이므로 커밋 노드를 만들지 않습니다. 이것은 브랜치의 실제 코드에는 문제가 없지만 나중에 마스터와의 실제 병합을 수행 한 사람과 시간을 찾기가 어렵습니다. 이 --no-ff문제를 해결하려면 마스터와 병합해야합니다.
michas

11
그렇습니다 --no-ff. :)
michas

19
그것은 git merge --no-ff development단지 @elect의 사용법을 수정하는 것입니다.
jewbix.cube

2
@sailesh 의견에 동의하는 경우 git merge 플래그를 포함하도록 답변을 업데이트 할 수 있습니까?
웹 사용자

2
@Mars, 이전 변경 사항이 커밋의 직접적인 조상 인 경우 병합하면 파일이 재정의됩니다. 예를 들어, A->B->C마스터가되고 A->X->Y개발자 브랜치입니다. X의 변경 사항과 충돌이있을 수 있는 파일의 일부를 변경 하면의 조상 A이므로 충돌하지 않습니다 . 손실 된 변경 사항에 대해서는 stackoverflow.com/questions/7147680/… 을 확인하여 변경 사항을 복구하십시오. AX
Sailesh

103

개인적으로, 저의 접근 방식은 당신과 비슷합니다. 몇 가지 더 많은 지점과 마스터로 돌아갈 때 커밋이 스쿼시됩니다.

저의 동료 중 한 명이 브랜치를 너무 많이 바꾸는 것을 좋아하지 않고 개발 브랜치에서 실행 된 다음과 비슷한 것을 사용하여 개발 브랜치에 머물러 있습니다.

git fetch origin master

git merge master

git push origin development:master

첫 번째 줄은 마지막으로 로컬 리포지토리를 업데이트 한 이후에 마스터로 만든 업스트림 커밋이 있는지 확인합니다.

두 번째는 이러한 변경 사항을 마스터에서 개발로 가져옵니다.

세 번째는 개발 브랜치 (이제 마스터와 완전히 병합 됨)를 출발지 / 마스터로 푸시합니다.

나는 그의 기본 워크 플로우가 약간 잘못되었을 수도 있지만 그것이 주요 요점입니다.


감사! 이것은 나에게 더 직관적으로 이해됩니다.
Jamie Nicholl-Shelley

2
그렇습니다.이 글을 쓴 지 6 년이 채되지 않아서, 대신 브랜치 rebase를 업데이트하려고 했지만 저는 그것을 채택했습니다 . devmerge
David Culp

32

가지에 대한 지식없이 여기에 온 사람들을 위해 바닥에서 설명합니다.

기본 마스터 브랜치 개발 로직은 다음과 같습니다. 다른 브랜치에서만 작업하고 마스터 만 사용하여 다른 브랜치를 병합합니다.

이런 식으로 새 분기를 만들기 시작합니다.

1) 로컬 디렉토리에서 저장소를 복제하거나 새 저장소를 작성하십시오.

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2) 새로운 지점을 만듭니다. 마스터 브랜치 저장소의 최신 파일을 포함합니다.

$ git branch new_branch

3) 현재 자식 분기를 new_branch로 변경하십시오.

$ git checkout new_branch

4) 평소와 같이 코딩, 커밋…

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5)이 지점에서 작업이 완료되면 "마스터"지점과 병합하십시오.

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

업데이트 : 시각적 변경 사항을보고 모든 논리와 커밋을 더 잘 보려면 GitKraken을 사용하는 것이 좋습니다.


나는 마스터에서 일하지 않는 당신의 접근 방식이 마음에 들었습니다. 하지만 오늘 gitflow를 가지고 놀았을 때, release우리의 분기를 만들었습니다 develop. 그런 다음 릴리스 노트 파일을 추가하고 커밋했습니다. 그런 다음 두 버전으로 다시 병합되는 릴리스를 완료했습니다 master/develop. 그러나 내 마스터 브랜치에는 릴리스 노트 만 새로 추가되었습니다. 이전 개발 커밋 동안 다른 파일이 업데이트되지 않았습니다.
Amit Shah

마스터 이외의 다른 브랜치에서 작업하는 경우 해당 브랜치에 대한 변경 사항을 커밋하고 푸시했는지 확인하십시오. github.com 또는 bitbucket.com의 그래픽 인터페이스에서 파일의 모양을보고 웹 사이트에서 병합을 클릭하십시오. 브랜치에서 마스터까지 모든 것을 업데이트해야합니다. master에 최신 파일이 있으면 충돌이 발생하여 오류 메시지가 표시됩니다. 내가 충분히 잘 대답하지 못했다면, 나에게 메시지를 보내주세요. :)
Gediminas

소스 트리를 GUI 및 github 저장소로 사용하고 있습니다. 릴리스 테스트로 2 번 시도했습니다. 마스터는 최신 개발 브랜치로 업데이트되지 않았습니다.
Amit Shah

라이브 github.com 웹 사이트에서 작업중 인 지점의 파일을 사용하십시오. 그들이 밀렸습니까? 그렇다면 동일한 지점을 클릭하십시오-병합하면 어떤 일이 발생하는지 볼 수 있습니다. sourcetree에 대한 개인적인 경험은 매우 나쁩니다. 저는 지점에서도 무슨 일이 일어나고 있는지 완전히 이해할 수 없었습니다
Gediminas

자세한 설명은 @Gediminas에게 감사드립니다. 답변을 읽기 전에 git 키워드가 혼란 스러웠습니다 .. :)
Dinesh Suthar

21

Git Flow 워크 플로를 사용할 수 있다면 좋을 것 입니다. 개발 브랜치를 쉽게 마스터로 병합 할 수 있습니다.

당신이하고 싶은 것은 여기에 언급 된 git-flow 명령을 따르는 것입니다.

단계 :

  • git-flow 프로젝트 설정
  • 가지를 만들고 모든 것을 병합하여 개발
  • 명령을 실행 git flow release start <version_number>
  • 그런 다음 릴리스에 대한 의미있는 메시지 를 제공하십시오.
  • 명령을 실행 git flow release finish <version_number>
  • 모든 것을 master 로 병합 하고 브랜치를 master로 변경합니다 .
  • 명령 git push을 실행하여 변경 사항을 원격 마스터 에 공개하십시오 .

자세한 내용은 http://danielkummer.github.io/git-flow-cheatsheet/ 페이지를 방문 하십시오.


1
누군가가 git flow를 사용하는 경우의 해결책!
Csaba Toth

21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

9

예, 맞습니다. 그러나 매우 기본적인 워크 플로처럼 보입니다. 통합을 준비하기 전에 변경 사항을 버퍼링하는 것입니다. 자식이 지원하는 고급 워크 플로 를 살펴 봐야 합니다. 여러 기능을 동시에 작업 할 수 있는 주제 분기 접근 방식 또는 현재 워크 플로우를 약간 확장 하는 눈금 방식 을 원할 수 있습니다 .


6

Mac 또는 Ubuntu를 사용하는 경우 지점의 작업 폴더로 이동하십시오. 터미널에서

harisdev가 branchname이라고 가정하십시오.

git checkout master

추적되지 않거나 커밋되지 않은 파일이 있으면 오류가 발생하고 추적되지 않거나 커밋되지 않은 모든 파일을 커밋하거나 삭제해야합니다.

git merge harisdev 

git push origin master

분기를 삭제하는 마지막 명령입니다.

$ git branch -d harisdev

Mac 또는 Ubuntu에만 해당되는 것은 무엇입니까?
talonx 2019

죄송합니다. 다른 답변은 터미널에 명령을 제공하고 분기 삭제 명령을 제공해야한다고 언급하지 않았습니다. 실제로 개발자가 나중에 동일한 분기를 엉망으로 만들지 않도록 분기 삭제 명령을 추가하고 싶었습니다. Mac을 사용하고 있으므로 언급했습니다. 귀하의 질문은 유효하며 이러한 명령 중 어느 것도 Mac 또는 Ubuntu에만 해당되지 않습니다.
Haris Np

설명해 주셔서 감사합니다.
talonx

5

1 단계

로컬 "git"파일이 원격과 동기화되어 있지만 "dev"브랜치는 아직 존재하지 않는 새로운 "dev"브랜치를 만들고 전환하십시오.

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

2 단계

"dev"브랜치 (1 단계를 따르는 경우 현재)를 변경하고 커밋 한 다음 원격 "dev"브랜치로 푸시하십시오.

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

3 단계

"dev"브랜치를 "master"로 병합하십시오.

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

4

이것이 내가 보통하는 방법입니다. 먼저 변경 사항을 마스터에 병합 할 준비가되었는지 확인하십시오.

  1. 원격 서버에서 최신 변경 사항을 사용하여 개발이 최신인지 확인하십시오. git fetch
  2. 가져 오기가 완료되면 git checkout master.
  3. 다음을 실행하여 마스터 분기에 최신 업데이트가 있는지 확인하십시오. git pull
  4. 준비가 완료되면 다음과 같이 병합을 시작할 수 있습니다 git merge development
  5. 변경 사항을 적용 git push -u origin master하면 완료됩니다.

기사에서 git merging 에 대해 더 자세히 알 수 있습니다 .


3

1) 지점 개발에서 다음 명령을 사용하여 자식 상태를 확인하십시오.

git status

커밋되지 않은 코드가 없어야합니다. 그렇다면 개발 지점에서 코드를 푸시하십시오.

git add *

git commit -m "My initial commit message"

git push origin Development

2) 개발 브랜치에서 다음 두 명령을 실행하십시오.

git branch -f master HEAD

git push -f origin master

개발 브랜치 코드를 마스터 브랜치로 푸시합니다.


이것은 모든 개발 커밋을 마스터로 푸시하거나 단순히 새로운 단일 커밋을 마스터에 추가합니까?

1
이것은 실제로 어떻게 작동합니까? 개발할 때 특히 "git branch master"는 광기처럼 보입니다. master라는 분기가 이미있는 경우 master라는 새 분기를 어떻게 만들 수 있습니까? 문서에서 -f는 다음과 같이 말합니다. <branchname>을 <startpoint>로 재설정합니다. 이것은 무엇을 의미 하는가?
John Little

이 힘이 로컬 마스터를 원격 마스터로 푸시하지 않습니까? 팀에서 일하고 있다면 이것은 나쁜 생각처럼 보입니다.
Nick

-f권장하지 않습니다.
DawnSong

2

@Sailesh 및 @DavidCulp를 기반으로 :

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

첫 번째 명령은 원격 마스터에 대한 모든 업스트림 커밋을 수행하며 Sailesh 응답은 발생하지 않습니다.

두 번째는 병합을 수행 한 다음 해결할 수있는 충돌을 만듭니다.

이렇게 한 후 마지막으로 마스터를 체크 아웃하여 마스터로 전환 할 수 있습니다.

그런 다음 개발 지점을 로컬 마스터에 병합합니다. no-ff 플래그는 전체 병합을 추적 할 수 있도록 커밋 노드를 마스터에 만듭니다.

그런 다음 병합을 커밋하고 푸시 할 수 있습니다.

이 절차를 통해 사람들이 볼 수있는 개발에서 마스터로의 병합 커밋이 있는지 확인한 다음 개발 지점을 살펴보면 개발 과정에서 해당 지점에 대해 수행 한 개별 커밋을 볼 수 있습니다.

선택적으로 개발 브랜치에서 수행 된 작업에 대한 요약을 추가하려는 경우 병합 커밋을 푸시하기 전에 수정할 수 있습니다.

편집 : 내 원래의 대답 git merge master은 아무것도하지 않은 제안 git merge FETCH_HEAD했으므로 출발지 / 마스터를 가져온 후하는 것이 좋습니다.


2

개발 지점을 '체크 아웃'하면 ...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

1

gerrit를 사용하는 경우 다음 명령이 완벽하게 작동합니다.

git checkout master
git merge --no-ff development

기본 커밋 메시지로 저장할 수 있습니다. 변경 ID가 생성되었는지 확인하십시오. 다음 명령을 사용하여 확인할 수 있습니다.

git commit --amend

그런 다음 다음 명령으로 푸시하십시오.

git push origin HEAD:refs/for/refs/heads/master

아래와 같은 오류 메시지가 나타날 수 있습니다.

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

이 문제를 해결하기 위해 gerrit 프로젝트 관리자는 gerrit에서 'refs / for / refs / heads / master'또는 'refs / for / refs / heads / *'라는 이름의 다른 참조를 작성해야합니다. 그런 다음이 참조에 'Push Merge Commit'권한을 부여하고 GCR 제출에 필요한 경우 'Submit'권한을 부여하십시오.

이제 위의 push 명령을 다시 시도하면 작동합니다.

크레딧 :

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


1

가장 쉬운 해결책은

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

이것은 또한 사용중인 모든 가지의 역사를 보존합니다


-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

1
로컬 브랜치에 원격 브랜치에서 커밋이 누락 된 이유를 확실히 알지 못하는 경우 오류가 발생하는 경우 거의 강제로 푸시하지 않습니다. 일반적으로 3 단계로 다시 돌아가는 것이 훨씬 좋습니다 pull. 또한 기존 답변과 비교하여이 답변이 어떤 가치를 더하는지 명확하지 않습니다.
Kyle Strand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.