나는 Git을 처음 접했고 지금은이 상황에 처해있다.
- 나는 네 가지 지점 (master, b1, b2 및 b3)을 가지고 있습니다.
- b1-b3 작업을 한 후 지점 마스터에서 다른 모든 지점에 변경해야 할 사항이 있음을 깨달았습니다.
- 나는 내가 필요한 것을 바꾸었고
master
... 여기 내 문제가있다.
master
지점 코드로 다른 모든 지점을 어떻게 업데이트 합니까?
나는 Git을 처음 접했고 지금은이 상황에 처해있다.
master
... 여기 내 문제가있다.master
지점 코드로 다른 모든 지점을 어떻게 업데이트 합니까?
답변:
두 가지 옵션이 있습니다.
첫 번째는 병합이지만 병합에 대한 추가 커밋을 만듭니다.
각 지점을 점검하십시오.
git checkout b1
그런 다음 병합하십시오.
git merge origin/master
그런 다음
git push origin b1
또는 리베이스를 수행 할 수 있습니다.
git fetch
git rebase origin/master
got push origin master
... 이해가되지 않습니다. 마스터 브랜치를 변경하지 않습니다. 나는 그것이 119 upvote와의 실수라고 생각합니다 : /
git rebase master
정답을 사용 하십시오
기본적으로 두 가지 옵션이 있습니다.
당신은 합병합니다. 실제로는 매우 간단하고 완벽하게 로컬 작업입니다.
git checkout b1
git merge master
# repeat for b2 and b3
이렇게하면 역사가 그대로 유지됩니다. 마스터에서 분기하고 모든 지점을 변경 한 후 마지막으로 마스터에서 변경 한 내용을 세 지점 모두에 통합했습니다.
git
이 상황을 실제로 잘 처리 할 수 있으며 모든 방향에서 동시에 발생하는 병합을 위해 설계되었습니다. 모든 스레드를 올바르게 연결할 수 있다고 믿을 수 있습니다. 단지 병합 커밋이 분기 b1
병합 인지 master
또는 master
병합 인지는 신경 쓰지 않습니다 b1
. 유일한 차이점은 어떤 분기가이 병합 커밋을 가리키는 것입니다.
당신은 rebase. SVN 또는 이와 유사한 배경을 가진 사람들이 더 직관적입니다. 명령은 병합 사례와 유사합니다.
git checkout b1
git rebase master
# repeat for b2 and b3
이 방법은 모든 지점에서 선형 이력을 유지하기 때문에이 방법을 좋아합니다. 그러나이 선형 이력은 거짓말이며 그 사실을 알고 있어야합니다. 이 커밋 그래프를 고려하십시오.
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
이 합병으로 실제 이력이 나타납니다.
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
그러나 rebase는 다음과 같은 이력을 제공합니다.
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
요점은 커밋이 있다는 것입니다 E'
, F'
그리고 G'
진정으로 존재하지 않았던, 가능성 테스트 적이있다. 컴파일조차 할 수 없습니다. 실제로 변경 사항이에서 master
개발에 중요 할 때 리베이스를 통해 무의미한 커밋을 만드는 것은 실제로 쉽습니다 b1
.
이것의 결과는 세 개의 커밋의 어떤 구별 할 수없는, 할 수있다 E
, F
그리고 G
실제의 값을 감소, 회귀를 소개 git bisect
.
나는 당신이 사용해서는 안된다고 말하는 것이 아닙니다 git rebase
. 용도가 있습니다. 그러나 그것을 사용할 때마다, 당신은 역사에 대해 거짓말하고 있다는 사실을 알아야합니다. 그리고 적어도 새로운 커밋을 컴파일 테스트해야합니다.
git checkout <source branch>
git pull
. 그런 다음 위와 같이 계속하십시오 : git checkout b1
...
git merge
와 git rebase
. 그것들을 피하는 것은 없습니다. git rebase
여러 가지 rebasing 단계를 숨길 수 있다는 장점이 있습니다 (즉, 동일한 분기를 여러 가지 다른 커밋에 순서대로 재배치하여 각 단계의 충돌 정도를 줄입니다). 그럼에도 불구하고, rebase가 역사에 대해 거짓말한다는 사실은 그러한 다단계 rebase에서 좋은 섹스를 훨씬 쉽게 만들어줍니다. .
git rebase master
이 작업을 수행하는 올바른 방법입니다. 병합한다는 것은 병합을 위해 커밋이 생성되는 반면 rebasing은 커밋되지 않음을 의미합니다.
지점에서 온 / 오프 작업을했거나 다른 지점에서 작업을하던 중에 다른 지점에서 많은 일이 발생한 경우 지점을 마스터로 리베이스하는 것이 가장 좋습니다. 이것은 역사를 깔끔하게 유지하고 일을 훨씬 더 쉽게 만들어줍니다.
git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed
노트:
http://git-scm.com/book/ch3-6.html 에 rebasing에 대한 장이 있으며 웹에 많은 다른 리소스가 있습니다.
마스터 분기 복사본으로 (백업)과 같은 다른 분기를 업데이트합니다. 어느 쪽이든 따라갈 수 있습니다 (리베이스 또는 병합) ...
브랜치 병합 (백업 브랜치에 자동으로 추가 커밋이 있음)
참고 : Rebase는 새로운 기반 (새로운 사본)을 설정하는 것입니다.
git checkout backup git merge master git push
(backup2 등과 같은 다른 지점에서는 반복하십시오.)
git checkout backup git rebase master git push
(backup2 등과 같은 다른 지점에서는 반복하십시오.)
git cherry-pick 을 사용하여 병합하거나 여러 지점에 개별 커밋을 적용 할 수 있습니다 .