지점 기본 변경 : (commit 1) – master

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

(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 모두 마스터에서 중단됩니다.



답변

--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이 내부적으로 작동하는 방식입니다.

  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되면 리베이스 프로세스 중에 언제든지 시작하고 다시 시작점으로 돌아갈 수 있습니다.


답변

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


답변

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

$ 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

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


답변