program tip

지점 기반 변경

radiobox 2020. 8. 9. 10:17
반응형

지점 기반 변경


다음과 같은 나무가 있습니다.

(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.


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 current-branch

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

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

갈등이 없다면 훌륭합니다. 그렇게한다면 (대부분의 경우) 계속 읽으십시오.

충돌이 발생할 수 있으며 수동으로 해결해야합니다. Git은 이제 current-branch, current-base-branchnew-base-branch. 대략 이것은 git이 내부적으로 작동하는 방법입니다.

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


분기를 삭제하고 다시 만들지 않고 분기를 전환 할 필요가 없도록 재설정 및 숨김을 사용하는 약간 다른 접근 방식을 사용했습니다.

$ 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

커밋 기준으로 커밋에 대한 분기를 재설정하면 기본적으로 해당 분기 기록을 한 번에 커밋으로 되감습니다.

참고 URL : https://stackoverflow.com/questions/10853935/change-branch-base

반응형