강제 푸시없이 어떻게 git rebase를 사용할 수 있습니까?


93

git nirvana를 달성하기 위해 현재 병합하는 상황에서 리베이스를 활용하는 방법을 배우는 데 하루를 보내고 있습니다.

내가 git 101 플로우라고 생각하는 것을 실행할 때 (아래에서 설명합니다), push --force변경 사항을 원점으로 되돌릴 때해야합니다.

(참조 나는이 덮여 땅임을 알 - 난 안 유일한 사람 1 , 2 , 3 , 4 , 5 ), 나는 기술적 인 이유를 이해 힘이 필요하다. 내 문제가 있습니다 REBASE의 칭찬을 노래 많은 (많은) 블로그 항목이하고 (참조 자신의 삶을 변화 어떻게 --- 이것이다 1 , 2 , 3 , 4는 몇 가지를 나열),하지만 그들 중 누구도 그 언급하지 push --force의 일부입니다 그들의 흐름. 그러나 기존의 stackoverflow 질문에 대한 거의 모든 답변은 "예, 리베이스하려면 사용해야 push --force합니다." 와 같은 내용을 말합니다 .

리베이스 옹호자의 수와 종교성을 감안할 때 '푸시-포스'를 사용하는 것은 리베이스 흐름의 내재 된 부분이 아니며 종종 푸시를 강요해야하는 경우 뭔가 잘못하고 있다고 믿어야합니다 .

push --forceA는 나쁜 일 .

여기 내 흐름이 있습니다. 어떤 방식으로 힘없이 동일한 결과를 얻을 수 있습니까?

간단한 예

두 가지 :

  • v1.0- 릴리스 브랜치, 패치 만 포함
  • master- 다음 주요 릴리스를위한 모든 것.

다음 릴리스를 위해 몇 가지 패치 커밋과 몇 가지 커밋이 있습니다.

미리 병합

다음 릴리스에서 손실되지 않도록 패치를 마스터에 통합하고 싶습니다. 깨달음 전 저는 간단히 :

git checkout master
git merge v1.0

하지만 지금 노력하고 있어요

git checkout master
git rebase v1.0

그래서 지금 여기 있습니다.

여기에 이미지 설명 입력

시간 :

git push

주사위가 없습니다.

답변:


43

Rebasing은 훌륭한 도구이지만 마스터에 대한 토픽 분기에 대한 빨리 감기 병합을 만드는 데 사용할 때 가장 잘 작동합니다. 예를 들어, master에 대해 add-new-widget 브랜치를 리베이스 할 수 있습니다.

git checkout add-new-widget
git rebase -i master

분기를 마스터로 빨리 감기를 수행하기 전에 예를 들면 :

git checkout master
git merge --ff-only add-new-widget

이것의 이점은 모든 변경 사항이 병합 전에 마스터의 팁에 다시 기반하기 때문에 기록에 복잡한 병합 커밋이나 병합 충돌이 많지 않다는 것입니다. 두 번째 이점은 리베이스했지만 git push --force마스터 브랜치에서 히스토리를 방해하지 않기 때문에 사용할 필요가 없다는 것 입니다.

그것은 확실히 리베이스의 유일한 사용 사례 또는 유일한 워크 플로는 아니지만 내가 본 것보다 더 현명한 용도 중 하나입니다. YMMV.


4
감사합니다 CG, "빨리 감기 병합을 만드는 데 사용"이 핵심이라고 생각합니다. 두 개의 라이브 브랜치 (개발 브랜치와 릴리스 브랜치)가있는 위의 경우에는 적용되지 않지만 제한된 시간 동안 만 필요한 임시 토픽 브랜치에 매우 잘 적용되는 것 같습니다. 병합되면 삭제됩니다. 다시 한 번 감사드립니다.
Roy Truelove 2012-06-18

1
나는 이것을 이해하지만 원래의 질문은 남아 있습니다. 나는 실제 대답에 의해 주어진 하나라고 생각 @Fabien Quatravaux
IsmailS

4
글쎄, 당신은 여전히 ​​1.0 브랜치를 강제 푸시해야 할 것입니다. 적어도 그것이 항상 나를 위해 일이 일어나는 경향이 있습니다. Fabiens 방법은 그런 일이 발생하는 것을 막을 것입니다.
joerx

23

@CodeGnome이 맞습니다. 마스터를 v1.0 브랜치에서 리베이스하지 말고 마스터에서 v1.0 브랜치를 리베이스하면 모든 차이를 만들 수 있습니다.

git checkout -b integrate_patches v1.0
git rebase master
git checkout master
git merge integrate_patches

v1.0을 가리키는 새 브랜치를 생성하고 해당 새 브랜치를 마스터 위로 이동 한 다음 새 버전의 V1.0 패치를 마스터 브랜치에 통합합니다. 다음과 같은 결과를 얻게됩니다.

o [master] [integrate_patches] Another patch on v1.0
o A patch on v1.0
o Another change for the next major release
o Working on the next major release
|  o [v1.0] Another path on v1.0
|  o A patch on v1.0
| /
o Time for the release

rebase를 사용하는이 방법 은 공식 git 문서에서 권장 합니다 .

나는 당신이 옳다고 생각합니다 git push --force: 당신이 실수하고 원하지 않는 것을 밀 때만 사용해야합니다.


OP의 특정 문제에 대한 최선의 답변이라고 생각합니다. 임시 병합 브랜치를 생성하고이를 기반으로 리베이스 한 다음 마스터에 병합하고 오리진에 푸시합니다. 임시 브랜치는 원점으로 푸시 할 필요가 없습니다. 내가 줄 유일한 추가 조언은 병합 / 재 기반 코드를 검증 할 수있는 개발 또는 qa 분기를 갖는 것입니다. 인증 후이 코드는 ff 전용 마스터로 병합됩니다. 이렇게하면 검증 프로세스가 너무 오래 걸리는 경우 쉽게 핫픽스를 적용 할 수 있습니다. 이것은 기본적으로 "git flow"프로세스입니다.
Javid Jamae

감사합니다 Fabien, 훌륭한 답변. 변경 사항을 master통합하고 기능 브랜치 자체를 병합하는 데 신경 쓰지 않는 우리 git checkout my-branch; git rebase master; git checkout master; git merge my-branch
중에는

17

당신이 리베이스 경우 강제로 밀어가, 그리고 당신은 이미 변경, 권리를 게시 한?

나는 전체적으로 리베이스를 사용하지만 강제 푸시가 중요하지 않은 비공개 항목에 게시하거나 (예 : 풀 요청의 일부로 GitHub의 내 자신의 복제본) 처음 푸시하기 전에 리베이스합니다.

이것은 리베이스를 사용하는 워크 플로의 핵심이지만 많은 푸시를 강요하지 마십시오. 준비 될 때까지 게시하지 말고 푸시 한 후에 리베이스하지 마십시오.


고마워 댄. 위의 사항을 어떻게 달성해야하는지 알려주시겠습니까? 이것은 rebase가 적용되는 시나리오가 아닙니까?
Roy Truelove 2012-06-15

2
모든 작업을 토픽 브랜치로 분리하면 리베이스를위한 좋은 시나리오가 설정됩니다. 당신은 rebase새 토픽 브랜치에 변화를 가져온,하지만 당신은 해당 분기의 변경, 당신이 완료되면 merge주요 개발 분기에 분기 다시.
redhotvengeance

1
문제는 브랜치를 게시했기 때문에 저장소에 강제로 푸시해야한다는 것입니다. 두 가지 중 하나를 포기해야합니다. 자신이하는 방식으로 게시하거나 리베이스합니다. 죄송합니다.
Daniel Pittman

이 시나리오에서는 리베이스가 작동하지 않는 것 같습니다. v1.0은 토픽 브랜치가 아니며 릴리스 브랜치이므로 절대 죽지 않고 게시해야합니다.
Roy Truelove 2012-06-15

5

잘못된 푸시의 결과가 아닌이 rebase-then-force-push 패턴에 대한 좋은 사용 사례가 있다고 생각합니다. 여러 위치 (컴퓨터)에서 직접 기능 브랜치를 작업하는 것입니다. 나는 가끔 사무실에서 데스크탑으로 일하고 때로는 가정 / 고객 현장에서 랩탑으로 일하기 때문에이 작업을 자주 수행합니다. 메인 브랜치를 따라 잡거나 더 깔끔하게 병합하기 위해 가끔 리베이스를해야하지만, 다른 머신에서 작업하기 위해 한 머신을 떠날 때도 강제 푸시해야합니다. 내가 유일한 지점에서 일하는 한 매력처럼 작동합니다.


2
동일한 워크 플로가 있습니다 (여러 컴퓨터 / 위치에서 작업). 따라서 'mytopic'이라는 주제 브랜치에서 작업한다고 가정 해 보겠습니다. 항상 로컬 일회용 브랜치 (단지 mytopic의 브랜치)를 "master"로 리베이스 한 다음이를 다시 mytopic에 병합하는 한 강제로 푸시 할 필요가 없습니다. OP에는 약간 다른 시나리오가 있으므로 이러한 경우 강제 푸시가 필요할 수 있습니다. 그러나 나는 OP가 잘못된 방식으로 리베이스하고 있다고 생각합니다.
bwv549 2015 년

3

내가 사용하는 것은 다음과 같습니다 (분기 이름이 foobar 라고 가정 ).

git checkout master              # switch to master
git rebase   foobar              # rebase with branch
git merge -s ours origin/master  # do a basic merge -- but this should be empty
git push origin master           # aaand this should work

2
리베이스 마스터가 이상해 보입니다.
에밀 Vikström

2
git개성이없는 것은 아닙니다
2017

1
git merge -s ours origin/<branch>우리를 위해 수정 한 것이 었습니다
Max

0

tl; dr은 공유 브랜치와 병합하고 개별 브랜치로 리베이스합니다. --force-with-lease힘에 대한 더 안전한 대안이며, 파괴적인 힘 없이도 git nirvana를 달성하는 데 도움이 될 것입니다.

다양한 팀의 워크 플로에서 작업 한 일반적인 경험 규칙은 merge공유 브랜치 (즉, 마스터 또는 개발)에 사용 rebase하고 자체 기능 브랜치에서 작업 할 때 사용하는 것입니다. 다음은 기능 분기의 일반적인 수명주기입니다.

git checkout master
git checkout -b new-feature
git commit -am "commit new work"
git push -u origin new-feature
# have code reviewed, run CI, etc.,
# meanwhile master has new commits
git checkout master
git pull
git rebase -i master # -i for interactive rebase allows you to squash intermediate commits
git push --force-with-lease
git merge master

우리가 여기서 한 일의 평범한 영어 버전 :

  1. 마스터에서 새 분기를 만들었습니다.
  2. 지점에서 작업을 완료하고 원격으로 푸시
  3. 마스터를 기반으로
  4. 원격으로 작업 푸시 force-with-lease
  5. 매우 깨끗한 git 로그를 사용하여 마스터에 병합하여 공유 브랜치에서 여러 병합으로 인한 혼란을 줄여 최신 마스터 (공유 브랜치)로 브랜치를 "추적"합니다.

네 번째 단계는 정말 중요하며 리베이스 사용을 옹호하기 시작한 주된 이유 중 하나입니다. force-with-lease원격을 확인하여 새 커밋이 추가되었는지 확인합니다. git push파괴적인 것으로 입증 된 경우 밀지 않습니다!

나는 이것이 누군가에게 rebase를 사용하는 데 더 많은 자신감을주기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.