지점 기본 변경


145

나는 이와 같은 나무를 가지고있다 :

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

PRO 브랜치를 마스터로 옮겨야합니다

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

git rebase masterPRO 지점에서 시도 했지만 아무 일도 일어나지 않습니다.

명확히하기 위해 : 나는 마스터에서 일하고 있었고 제품 데모 ( git checkout -b demo및 일부 커밋) 를 만들어야했습니다 . 그런 다음 실수로 데모 ( git checkout -b PRO및 일부 커밋) 에서 다른 분기를 만들고 이제 PRO 분기를 마스터로 이동하고 데모를 그대로 두어야합니다. 결국 데모와 PRO 모두 마스터에서 중단됩니다.


답변:


282

--onto그것을 위해 사용하십시오 :

git rebase --onto newBase oldBase feature/branch

주어진 경우 :

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

기본적으로 모든 커밋을 demo~까지 수행 PRO하고 master커밋에 리베이스합니다 .


상황이 반대 인 경우에도 갈 수있는 방법입니까? == 두 번째 분기 마스터에서 -b를 체크 아웃했지만 첫 번째 분기에서 수행하려고했습니다. 그래서 나는 git rebase --onto first-branch second-branch second-branch했지만 구문을 얻지 못했습니다
Fla

1
이 경우 @Fla는 다음과 같습니다git rebase --onto first-branch master second-branch
nVitius

9
나는이 안내서 를 읽었 으며 --onto, 그들이 어떻게 작성했는지는 도움이되었다.git rebase --onto newBase oldBase feature/branch
gabe

@PhilipRego 맞지 않습니다. 예 origin/newBase와 같이 지점의 이름입니다 newBase. 로컬 리포지토리 ( newBase) 에있는 브랜치 또는 원격 ( origin/newBase) 에있는 브랜치에 기반을두고 있는지에 따라 다릅니다 .
loganfsmyth

@PhilipRego 그것들은 독립적이지 않습니다. newBase로컬 지점 origin/newBase의 이름이며 원격 지점의 이름입니다. 당신이 원하는 것은 당신이 기초를 두는 것에 달려 있습니다. 하나는 효과가없고, 다른 하나는 그렇지 않다는 것입니다. 원래 질문에는 리모컨이 언급되어 있지 않으므로 예제에서 리모컨을 사용하면 요청한 질문과 일치하지 않습니다.
loganfsmyth

22

나는 가능한 한 제네릭이 되려고 노력할 것이다. 먼저 원하는 지점에 있는지 확인하십시오.

git checkout current-branch

그런 다음 다음 명령을 사용하십시오 (여기서 new-base-branch새베이스 current-base-branch가 될 지점이고 현재베이스 인 지점).

git rebase --onto new-base-branch current-base-branch

갈등이 없다면 위대합니다. 당신이 (대부분의 경우), 그렇다면 계속 읽으십시오.

충돌이 발생할 수 있으므로 수동으로 해결해야합니다. 힘내 이제 사이에 "3 방향 병합"을 수행하려고 current-branch, current-base-branch하고 new-base-branch. 대략 이것은 git이 내부적으로 작동하는 방식입니다.

  1. Git은 먼저의 current-base-branch상단을 리베이스 합니다 new-base-branch. 충돌이있을 수 있습니다. 수동으로 해결해야합니다. 이 작업이 완료되면 당신은 일반적으로 수행 git add .하고 git rebase --continue. 이를 위해 새로운 임시 커밋 temp-commit-hash을 만듭니다 .

  2. 이 후, 힘내 이제 리베이스됩니다 current-branch의에 정상을 temp-commit-hash. 추가 충돌이있을 수 있으며 다시 수동으로 해결해야합니다. 완료되면 git add .및으로 다시 계속 진행 git rebase --continue한 후을 (를) 성공적으로 리베이스 current-branch했습니다 new-base-branch.


참고 : 엉망이 git rebase --abort되면 리베이스 프로세스 중에 언제든지 시작하고 다시 시작점으로 돌아갈 수 있습니다.


rebase게시 된 명령은 "치명적 : 잘못된 업스트림 'current-base-branch'"를 나타냅니다. 또한 현재 분기의 현재 상위 분기가 무엇인지 GIT에 알려 주어야하는 이유는 무엇입니까?
매트 아놀드

21

PRO분기 체크 아웃,이 분기의 가장 오래된 ( commit4 ) 및 최신 ( commit5 ) 커밋 해시를 복사하고 다른 곳에 붙여 넣습니다.

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

PRO분기를 삭제하십시오 (안전을 위해 백업을 보관하십시오). 다음에서 새 PRO분기를 만들고 체크 아웃하십시오 master.

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'

이전 브랜치 의 커밋 범위를 새 브랜치 로 가져갑니다 ( cherry-pick ) .PROPRO

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

이제 모든 것이 정상이면 (-f) 푸시를 remote PRO분기로 푸시하고 로컬 PRO.bac분기를 삭제하십시오 .

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch

1

브랜치를 삭제하거나 다시 만들지 않고 브랜치를 전환 할 필요가없는 재설정 및 숨김을 사용하는 약간 다른 접근 방식이 있습니다.

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit 3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

커밋 기준으로 커밋에서 브랜치를 재설정하면 기본적으로 해당 브랜치 기록을 한 번에 한 번에 다시 감습니다.


네 번째 줄에서 "커밋"과 "3"사이의 공백을 제거해야합니까?
Alexis Wilke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.