2013-07-23 4 views
6

때로는 기능 브랜치를베이스 라인에 적용하고 어떤 상황에서는 끔찍하게 잘못 될 수 있으므로 다른 모든 커밋을 잃지 않고 되돌릴 필요가 있음을 발견 할 수 있습니다. 그러나 누군가는 원래 지점에서 계속 작업해야합니다.기능 지점에서 기본 회선으로 변경된 변경 사항을 취소하지만 지점을 최신 상태로 유지하는 방법은 무엇입니까?

I (즉 그 자체로 문제의 모든 종류를 일으킬 것 때문에) 역사를 변경하는 메인 라인에 git rebase를 사용하지 않는,하지만 난 다음 메인 라인에 git revert을 수행 할 때 가능한 한 빨리 git merge이 실행됩니다 지점에서 시스템에 수행 된 다른 모든 변경 사항을 선택하면 완료된 모든 작업이 사라집니다.

브랜치의 변경 사항을 그대로 유지하려면 어떻게해야합니까?

+0

~Mi의 복귀는,이 병합되어 당신이 복귀하고 커밋? 그렇다면 http://stackoverflow.com/questions/1078146/re-doing-a-reverted-merge-in-git을보십시오 – jszakmeister

+1

아, 문제가 보입니다. 메인 라인을 브랜치에 병합하는 것입니다. 위에서 제공 한 링크가 당신에게 트릭을 줄 것이라고 생각합니다. 브랜치에서 "되돌리기"를 되돌려 야합니다. – jszakmeister

+0

오. 좋아, 거기에 언급 된 것들 중 일부는 도움이 보입니다 –

답변

5

리베이스 및 리셋을 원하지 않는다고 가정합니다.이 방법은 병합 방식입니다.

두 개의 분기 masterfeature이 있다고 가정합니다. 지금

$ git merge feature 

을 당신은 마스터에 대한 모든 feature 변경 사항이 : 그래서, 당신은 결정했습니다 는 master로 기능을 병합합니다. 가장 어려운 시나리오를 가정합니다. 두 분기를 병합 한 후 커밋이 만들어집니다. 그러나 갑자기 아무것도 작동하지 않는 것을 볼 수 있습니다. feature, 모두 깨졌으며 되돌리기로 결정했습니다. 귀하의 역사는 (당신이 git log --graph feature master로 볼 수)입니다 :

* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8 
| 
|  f3 
|  
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6 
| | 
| |  m3 
| |  
| * commit afb600fe382befe095f9b8a6e9eef98be25c929b 
| |\ Merge: 5cddc52 8660a59 
| |/ 
|/| 
| |  Merge branch 'feature' 
| | 
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4 
| | 
| |  f2 
| | 
* | commit 6f76e2288d69808b97981340198fd8044ab47630 
| | 
| |  f1 
| | 
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7 
| | 
| |  m2 
| | 
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358 
|/ 
| 
|  m1 
| 
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e 

공지 사항 병합 이후 수행 된 커밋 F3 및 m3. 따라서 feature의 변경 사항 만 신중하게 삭제해야합니다 (master).

마스터베이스 (매개 변수 -m1)를 유지하면서 master에서 병합 완료를 되돌릴 수 있습니다. 그것을 달성하기 위해 내가 병합 점을 기준으로 새로운 지점을 만들고 그 안에 복귀 :

$ git checkout -b feature-revert afb600fe 
$ git revert -m1 HEAD 

지금, 우리는 지점 feature-revert에 되돌림 변화가있다. 지금은 간단 단지 병합하여 마스터에 넣어 :

$ git checkout master 
$ git merge feature-revert 

그래서, 순간에 masterfeature에서 아무것도하지 않습니다. 그러나 나중에 기능을 다시 병합하려는 경우 되돌려 진 모든 변경 사항은 병합되고 되돌아 와서 마스터에서 손실됩니다.나는 우리가 그것을 합병으로 우리는 더 이상 가지를 필요로하지 않는 가정

$ git checkout feature-revert 
$ git revert HEAD 
$ git checkout feature 
$ git merge feature-revert 

:

되돌리기을 되돌릴 (HE-그는)과 feature로 다시 병합해야하는 문제를 해결하기 위해 이미,하지만 당신은 당신이 원하는 경우를 유지할 수 :

$ git branch -d feature-revert 

당신은 그것을 다시 병합하는 feature 보통 일반 워크 플로우에 master로부터의 모든 변경을 가져 오는, 알고 있어야합니다.

이제 feature에서 수정 한 후 언제든지 평소와 같이 master에 다시 병합 할 수 있습니다. 변경 사항을 git revert

0

기능 분기에서 git revert을 수행 한 다음이를 다시 마스터로 병합 했습니까?

그런 방식으로 기준선을 그대로 유지하면 기능 지점에서 계속 작업 할 수 있습니다.

+0

내가 그랬다면 어떻게 변경을 유지합니까? 변경 사항을 제거하지 않겠습니까? 되돌리기를 즉시 되돌릴 경우 이후 병합이 효과가 있습니까? 아니면 변경 사항을 다시 삭제 하시겠습니까? –

1

, 누구의 나무 해당 변경 사항이없는, 새로운 커밋을 생성합니다.

변경 사항은 이 아니라으로 삭제되었지만 원래의 커밋이 여전히 존재합니다.

그래서, 단지 :

  • git revert 병합은 마스터 (올바른 부모를 선택하는 것을 잊지) 커밋합니다. 이제 마스터에 기능 분기에서 소개 된 깨진 코드가 없습니다.
  • 특징 분기를 수정하십시오.
  • 마스터에서 첫 번째 되돌리기를 되돌립니다. 당신이 here (또는 설치 한 경우 해당 지역의 자식 문서에 같은 파일)에 대한 참조

를 통해 기능을 가지 수정을 병합 원래

  • 을 합병 이것은 기능의 깨진 상태를 다시 소개합니다 자세한 내용은. , ~~Mi는 당신이 문제, fj .. fx이 기능 분기 이후 수정됩니다를 발견 할 때 Mi이 기능 지점에서 원래 병합입니다

    --- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx [master] 
         \  /     /
         f1 ... fi -- fj ........ x -- fx  [feature] 
    

    , ~Mi가 복귀입니다 :

    당신의 역사처럼 보이는 끝 등

  • +0

    하지만 일단 마스터를 되 돌리면 마스터를 기능 분기로 병합 할 수 없습니다. –

    +0

    예, 되돌릴 수 있습니다. 위의 글 머리 기호 목록의 세 번째 포인트는 그래프에서 '~~ Mi'로 표시되며 (아래 단락에서 설명 함) 링크 된 문서의 Linus의 견적 바로 아래에 표시됩니다. – Useless

    +0

    'git rebase --no-ff a'를 통해 링크 된 문서에 따라 분기를 재현 할 수 없었습니다. 여기서 a는 분기점입니까? – Hasturkun

    관련 문제