태그 보관물: rebase

rebase

Git 병합 커밋 재조정 이제 마스터로 다시 병합 할 준비가되었습니다. * eb3b733

다음과 같은 경우를 보자.

토픽 브랜치에 대한 작업이 있으며 이제 마스터로 다시 병합 할 준비가되었습니다.

* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/
* 38abeae 1

마스터에서 병합을 수행하고 충돌을 해결하면 다음과 같은 결과가 나타납니다.

*   8101fe3 Merge branch 'topic'  [master]
|\
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/
* 38abeae 1

이제 병합에 어느 정도 시간이 걸렸으므로 다른 가져 오기를 수행하고 원격 마스터 분기에 새로운 변경 사항이 있음을 알 수 있습니다.

*   8101fe3 Merge branch 'topic'  [master]
|\
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1

마스터에서 ‘git rebase origin / master’를 시도하면 모든 충돌을 다시 해결해야하며 병합 커밋도 손실됩니다.

* d4de423 2       [master]
* e7affba 4       [origin/master]
* eb3b733 3
| * b62cae6 2     [topic]
|/
* 38abeae 1

병합 커밋을 리베이스하는 깔끔한 방법이 있습니까? 그래서 아래에 표시된 것과 같은 히스토리로 끝납니다.

*   51984c7 Merge branch 'topic'  [master]
|\
| * b62cae6 2                     [topic]
* | e7affba 4                     [origin/master]
* | eb3b733 3
|/
* 38abeae 1


답변

여기에는 두 가지 옵션이 있습니다.

하나는 대화식 리베이스를 수행하고 병합 커밋을 편집하고 병합을 수동으로 다시 실행 한 후 리베이스를 계속하는 것입니다.

또 다른 방법은 --rebase-mergeson 옵션 을 사용하는 것입니다 git rebase. “기본적으로 리베이스는 단순히 todo 목록에서 병합 커밋을 삭제하고 리베이스 된 커밋을 단일 선형 브랜치에 넣습니다. –rebase- 리베이스는 병합 커밋을 재생성함으로써 리베이스 될 커밋 내에서 분기 구조를 보존하려고 시도한다. 이러한 병합 커밋에서 해결 된 병합 충돌 또는 수동 수정은 수동으로 해결 / 재 적용되어야한다. “


답변

좋아, 그것은 오래된 질문이며 이미의 답변을 수락 @siride했지만 내 경우에는 그 대답으로 충분하지 않았습니다 --preserve-merges. 모든 충돌을 두 번째로 해결해야합니다. 아이디어를 기반으로 @Tobi B하지만 정확한 단계별 명령으로 내 솔루션

따라서 우리는 질문의 예를 기반으로 그러한 상태에서 시작할 것입니다.

*   8101fe3 Merge branch 'topic'  [HEAD -> master]
|\
| * b62cae6 2                     [topic]
| |
| | * f5a7ca8 5                   [origin/master]
| | * e7affba 4
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1

우리는 2 개의 커밋을 먼저 마스터하므로 cherry-pick은 작동하지 않습니다.

  1. 우선, 우리가 원하는 정확한 역사를 만들어 봅시다 :

    git checkout -b correct-history # create new branch to save master for future
    git rebase --strategy=ours --preserve-merges origin/master
    

    --preserve-merges병합 커밋을 기록에 저장 하는 데 사용 합니다. --strategy=ours해당 병합 커밋에 어떤 내용이 포함 될지 신경 쓰지 않으므로 모든 병합 충돌을 무시 하는 데 사용 합니다. 지금은 멋진 기록 만 필요합니다.

    역사는 다음과 같습니다 (마스터 무시).

    *   51984c7 Merge branch 'topic'  [HEAD -> correct-history]
    |\
    | * b62cae6 2                     [topic]
    * | f5a7ca8 5                     [origin/master]
    * | e7affba 4
    * | eb3b733 3
    |/
    * 38abeae 1
    
  2. 이제 정확한 색인을 얻으십시오.

    git checkout master # return to our master branch
    git merge origin/master # merge origin/master on top of our master
    

    여기에 몇 가지 추가 병합 충돌이 발생할 수 있지만 , 8101fe3와 사이에 변경된 파일의 충돌 일 뿐이며 f5a7ca8이미 해결 된 충돌은 포함하지 않습니다.topic

    역사는 다음과 같습니다 (올바른 역사는 무시).

    *   94f1484 Merge branch 'origin/master'  [HEAD -> master]
    |\
    * | f5a7ca8 5                   [origin/master]
    * | e7affba 4
    | *   8101fe3 Merge branch 'topic'
    | |\
    | | * b62cae6 2                     [topic]
    |/ /
    * / eb3b733 3
    |/
    * 38abeae 1
    
  3. 마지막 단계는 지점을 올바른 기록으로 결합하고 지점을 정확한 색인으로 결합하는 것입니다

    git reset --soft correct-history
    git commit --amend
    

    우리는 reset --soft분기 (및 기록)를 올바른 기록으로 재설정하지만 색인과 작업 트리는 그대로 둡니다. 그런 다음 commit --amend마스터의 올바른 인덱스로 잘못된 인덱스를 가진 병합 커밋을 다시 작성하는 데 사용합니다.

    결국 우리는 그러한 상태를 가질 것입니다 (또 다른 최고 커밋 ID를 주목하십시오) :

    *   13e6d03 Merge branch 'topic'  [HEAD -> master]
    |\
    | * b62cae6 2                     [topic]
    * | f5a7ca8 5                     [origin/master]
    * | e7affba 4
    * | eb3b733 3
    |/
    * 38abeae 1
    

답변

나는 이것을 알아 내려고 하루를 잃고 실제로 동료의 도움으로 해결책을 찾았다는 것을 감안할 때, 나는 차임해야한다고 생각했다.

우리는 큰 코드 기반을 가지고 있으며 동시에 2 개의 크게 수정되는 것을 처리해야합니다. 메인 브랜치와 보조 브랜치가 있습니다.

보조 브랜치를 메인 브랜치로 병합하는 동안 메인 브랜치에서 작업이 계속되고 완료 될 때까지 변경 사항이 호환되지 않기 때문에 변경 사항을 적용 할 수 없습니다.

따라서 “병합”을 “리베이스”해야합니다.

이것이 우리가 마침내 한 방법입니다.

1) SHA를 기록하십시오. 예 : c4a924d458ea0629c0d694f1b9e9576a3ecf506b

git log -1

2) 적절한 기록을 작성하지만 병합이 중단됩니다.

git rebase -s ours --preserve-merges origin/master

3) SHA를 기록하십시오. 예 : 29dd8101d78

git log -1

4) 이제 이전 위치로 재설정

git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard

5) 이제 현재 마스터를 작업 지점에 병합하십시오.

git merge origin/master
git mergetool
git commit -m"correct files

6) 이제 올바른 파일을 가지고 있지만 잘못된 기록은 다음과 같이 변경 사항 위에 올바른 기록을 가져옵니다.

git reset 29dd8101d78 --soft

7) 그런 다음 원래 병합 커밋의 결과를 수정하십시오.

git commit --amend

짜잔!


답변

첫 번째 병합을 제거하는 것 같습니다. 다음 절차를 따를 수 있습니다.

git checkout master      # Let's make sure we are on master branch
git reset --hard master~ # Let's get back to master before the merge
git pull                 # or git merge remote/master
git merge topic

그것은 당신이 원하는 것을 줄 것입니다.


답변

  • 병합 커밋에서
  • 쉬워야 할 새로운 변화를 체리 픽
  • 당신의 물건을 복사
  • 병합을 다시 실행하고 로컬 사본에서 파일을 복사하여 충돌을 해결하십시오.)

답변