나는 이와 같은 나무를 가지고있다 :
(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 master
PRO 지점에서 시도 했지만 아무 일도 일어나지 않습니다.
명확히하기 위해 : 나는 마스터에서 일하고 있었고 제품 데모 ( git checkout -b demo
및 일부 커밋) 를 만들어야했습니다 . 그런 다음 실수로 데모 ( git checkout -b PRO
및 일부 커밋) 에서 다른 분기를 만들고 이제 PRO 분기를 마스터로 이동하고 데모를 그대로 두어야합니다. 결국 데모와 PRO 모두 마스터에서 중단됩니다.
답변
--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
커밋에 리베이스합니다 .
답변
나는 가능한 한 제네릭이 되려고 노력할 것이다. 먼저 원하는 지점에 있는지 확인하십시오.
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이 내부적으로 작동하는 방식입니다.
-
Git은 먼저의
current-base-branch
상단을 리베이스 합니다new-base-branch
. 충돌이있을 수 있습니다. 수동으로 해결해야합니다. 이 작업이 완료되면 당신은 일반적으로 수행git add .
하고git rebase --continue
. 이를 위해 새로운 임시 커밋temp-commit-hash
을 만듭니다 . -
이 후, 힘내 이제 리베이스됩니다
current-branch
의에 정상을temp-commit-hash
. 추가 충돌이있을 수 있으며 다시 수동으로 해결해야합니다. 완료되면git add .
및으로 다시 계속 진행git rebase --continue
한 후을 (를) 성공적으로 리베이스current-branch
했습니다new-base-branch
.
참고 : 엉망이 git rebase --abort
되면 리베이스 프로세스 중에 언제든지 시작하고 다시 시작점으로 돌아갈 수 있습니다.
답변
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 ) .PRO
PRO
$ 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
답변
브랜치를 삭제하거나 다시 만들지 않고 브랜치를 전환 할 필요가없는 재설정 및 숨김을 사용하는 약간 다른 접근 방식이 있습니다.
$ 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
커밋 기준으로 커밋에서 브랜치를 재설정하면 기본적으로 해당 브랜치 기록을 한 번에 한 번에 다시 감습니다.