에서 새로운 지점 master
이 생성됩니다 test
.
master
다른 브랜치를 만들거나 다른 브랜치를 만들거나 나중에 병합 하는 여러 개발자가 있습니다 master
.
작업에 test
며칠이 걸리고 test
내부 커밋 으로 지속적으로 업데이트 하고 싶다고 가정 해 봅시다 master
.
내가 할 것이라고 git pull origin master
에서 test
.
질문 1 : 이것이 올바른 접근입니까? 다른 개발자는 내가 btw와 같은 파일을 쉽게 작업 할 수있었습니다.
작업 test
이 완료되었으며에 다시 병합 할 준비가되었습니다 master
. 내가 생각할 수있는 두 가지 방법은 다음과 같습니다.
ㅏ:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
비:
git checkout test
git pull origin master
git checkout master
git merge test
--rebase
이해 하지 못 하기 때문에 rebase는 변경 사항을 가져 와서 그 master
위에 쌓을 수 있으므로 다른 사람들이 변경 한 내용을 덮어 쓸 수 있기 때문에 사용하지 않습니다 .
질문 2 : 이 두 가지 방법 중 어느 것이 옳습니까? 차이점은 무엇입니까?
이 모든 것의 목표는 내 test
지점을 최신 상태로 업데이트 master
하고 나중에 master
타임 라인을 최대한 선형으로 유지하기 위해 다시 병합 할 수 있도록하는 것입니다.
답변
내가 어떻게 할까
git checkout master
git pull origin master
git merge test
git push origin master
원격 지점의 로컬 지점이 있으면 다른 지점을 원격 지점과 병합하는 것이 불편합니다. 또한 푸시하려는 내용이 마음에들 때까지 변경 사항을 푸시하지 않으며 또한 나와 내 로컬 저장소에만 해당하는 사항을 전혀 푸시하지 않습니다. 당신의 설명에서 그것은 test
당신만을위한 것입니까? 따라서 게시 할 이유가 없습니다.
git은 항상 당신과 다른 사람들의 변화를 존중하려고 노력합니다 --rebase
. 나는 그것을 적절하게 설명 할 수 없다고 생각 하므로 Git 책-Rebasing 또는 git-ready : 약간의 설명을 위해 rebasing 에 소개하십시오 . 아주 멋진 기능입니다
답변
이것은 매우 실용적인 질문이지만 위의 모든 답변이 실용적이지는 않습니다.
처럼
git checkout master
git pull origin master
git merge test
git push origin master
이 방법에는 두 가지 문제 가 있습니다 .
-
테스트 브랜치와 마스터 브랜치간에 충돌이 있는지 여부를 알 수 없기 때문에 안전하지 않습니다.
-
마스터에서 모든 테스트 커밋을 하나의 병합 커밋으로 “압착”합니다. 즉, 마스터 브랜치에서 테스트 브랜치의 모든 변경 로그를 볼 수는 없습니다.
따라서 충돌이 있다고 생각되면 다음과 같은 git 작업을 수행 할 수 있습니다.
git checkout test
git pull
git checkout master
git pull
git merge --no-ff --no-commit test
merge
전에 테스트 commit
하고 다음으로 빨리 커밋을 피하십시오 --no-ff
.
충돌이 발생하면 충돌에 git status
대한 세부 정보를 확인하고 해결을 시도 할 수 있습니다.
git status
우리가 갈등을 해결하거나 갈등이 없다면, 우리 commit
와 push
그들
git commit -m 'merge test branch'
git push
그러나이 방법으로 테스트 브랜치에 기록 된 변경 히스토리를 잃게되므로 다른 개발자가 프로젝트 히스토리를 이해하기 어려운 마스터 브랜치를 만들게됩니다.
따라서 가장 좋은 방법은 rebase
대신에 사용해야 합니다 merge
(이 시점에서 지점 충돌을 해결했다고 가정하십시오).
다음은 고급 작업을위한 간단한 샘플입니다. http://git-scm.com/book/en/v2/Git-Branching-Rebasing
git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test
그러나, 당신이 상위를 완료하면 모든 테스트 브랜치의 커밋이 마스터 브랜치의 헤드로 이동됩니다. 리베이스의 주요 이점은 선형적이고 훨씬 깨끗한 프로젝트 기록을 얻는 것입니다.
피해야 할 것은 rebase
마스터 브랜치와 같은 퍼블릭 브랜치에서 절대 사용하지 않는 것 입니다.
다음과 같은 작업을 수행하지 마십시오 .
git checkout master
git rebase -i test
https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing에 대한 세부 사항
부록:
- 리베이스 작업에 대해 잘 모르는 경우 https://git-scm.com/book/en/v2/Git-Branching-Rebasing을 참조하십시오.
답변
리베이스 나 합병으로 인해 누군가의 변경 사항을 덮어 쓰면 안됩니다 (충돌을 해결할 때 선택하지 않는 한).
개발하는 동안 일반적인 접근 방식은
git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier
마스터로 다시 병합 할 준비가되면
git checkout master
git log ..test # if you're curious
git merge test
git push
당신이 합병에서 무언가를 깨뜨리는 것에 대해 걱정한다면, 당신을 git merge --abort
위한 것입니다.
병합 수단으로 푸시 앤 풀을 사용하는 것은 어리석은 일입니다. 또한 왜 테스트를 원점으로 진행하는지 잘 모르겠습니다.
답변
먼저 병합 할 지점을 최대한 깨끗하게 만듭니다. 테스트를 실행하고 원하는 상태인지 확인하십시오. git squash로 새로운 커밋을 정리하십시오 .
KingCrunches 답변 외에도 사용하는 것이 좋습니다.
git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master
다른 브랜치에서 많은 커밋을 만들었을 수 있습니다. 마스터 브랜치는 한 번의 커밋이어야합니다. 커밋 히스토리를 가능한 한 깨끗하게 유지하기 위해 테스트 브랜치의 모든 커밋을 마스터 브랜치에서 하나의 커밋으로 스쿼시하고 싶을 수도 있습니다 ( Git : 스쿼시 또는 스쿼시? ). 그런 다음 커밋 메시지를 매우 표현적인 것으로 다시 작성할 수도 있습니다. 코드를 파지 않고 읽고 이해하기 쉬운 것.
편집 : 당신은에 관심이있을 수 있습니다
따라서 GitHub에서 기능 분기에 대해 다음을 수행합니다 mybranch
.
원산지에서 최신을 얻으십시오
$ git checkout master
$ git pull origin master
병합 기본 해시를 찾으십시오.
$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f
$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f
이제 첫 번째 만 확인 pick
하고 나머지는 s
다음과 같습니다.
pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better
다음으로 매우 좋은 커밋 메시지를 선택하고 GitHub로 푸시하십시오. 그런 다음 풀 요청을하십시오.
풀 요청을 병합 한 후 로컬로 삭제할 수 있습니다.
$ git branch -d mybranch
그리고 GitHub에서
$ git push origin :mybranch
답변
오래된 실이지만, 나는 그것을하는 방법 을 찾지 못했습니다 . rebase로 작업하고 마스터의 (기능) 브랜치에서 모든 커밋을 병합하려는 사람에게 유용 할 수 있습니다. 도중에 충돌이있는 경우 모든 커밋마다 충돌을 해결할 수 있습니다. 프로세스 중에는 모든 권한을 유지하며 언제든지 중단 할 수 있습니다.
마스터 및 지점을 최신 상태로 유지하십시오.
git checkout master
git pull --rebase origin master
git checkout <branch_name>
git pull --rebase origin <branch_name>
마스터 위에 지점 병합 :
git checkout <branch_name>
git rebase master
선택 사항 : 리베이스 중에 충돌이 발생하는 경우 :
먼저 파일 충돌을 해결하십시오. 그때:
git add .
git rebase --continue
당신의 리베이스 지점을 밀어 :
git push origin <branch_name>
이제 두 가지 옵션이 있습니다.
- A) PR을 생성하고 (예 : GitHub에서) UI를 통해 병합합니다.
- B) 커맨드 라인으로 돌아가서 브랜치를 마스터로 병합하십시오.
git checkout master
git merge --no-ff <branch_name>
git push origin master
끝난.
답변
이것은 팀과 함께 일할 때 사용하는 워크 플로입니다. 시나리오는 설명한대로입니다. 먼저, 작업을 test
마치면 test
지점 에서 작업하는 동안 마스터에 추가 된 내용을 가져 오기 위해 master와 rebase합니다 .
git pull -r upstream master
test
분기 를 분기 한 후 변경 사항을 마스터로 가져 와서 적용한 다음 현재 변경 사항을 “마스터”상태로 테스트하기 위해 변경 한 내용을 적용합니다. 다른 사람들이 테스트에서 편집 한 것과 동일한 파일을 변경 한 경우 여기에 충돌이있을 수 있습니다. 있으면 수동으로 수정하고 커밋해야합니다. 그렇게 한 후에는 마스터 브랜치로 전환하여 test
문제없이 통합하는 것이 좋습니다 .
답변
git checkout master
git pull origin master
# Merge branch test into master
git merge test
병합 후 파일이 변경되면 병합 할 때 “충돌 해결”오류가 발생합니다.
따라서 모든 충돌을 해결 한 다음 모든 변경 사항을 다시 커밋 한 다음
git push origin master
테스트 브랜치에서 누가 변경을했는지 알고 있기 때문에 누가 테스트 브랜치에서 변경을 수행했는지가 더 좋습니다.