2017-09-08 16 views
0

병합을 취소하는 방법에 대한 정보가 많이 있습니다. 그러나 특정 상황에서이를 수행하는 방법에 대한 결과를 찾을 수 없습니다.bitbucket pull 요청에 의해 생성 된 자식 병합을 실행 취소합니다.

누가 본질적으로 우리의 master 브랜치에 우리의 develop 브랜치를 bitbucket의 풀 요청을 통해 병합했습니다. 이것은 지금 막 일어 났으므로 마스터 브랜치에서 마지막으로 수행 된 작업입니다 (병합 커밋의 맨 위에있는 다른 커밋에 대해 걱정할 필요가 없습니다).

참고 : 우리는 우리 자신을의 Bitbucket 호스트, 그래서 우리의 bitbucket의 이전 버전을 가지고있다. 되 돌리는 요청 요청은 없습니다.

  1. git reset --hard *<SHA of commit before the merge>*

    • 이 병합이 일어나지 않을 것처럼 커밋 제거 : 내가 읽은 바로는

은 기본적으로 자식이 처리의 두 가지 방법이있다.

  • 어디에서나 "역사를 다시 쓰는 것은 나쁜 습관입니다"또는 "공개적으로 공유 된 레포에서 결코하지 마십시오"라고 읽었지 만 실제로 그렇게하지 않는 이유는 절대로 설명하지 않습니다. 문제가 해결 될 것 같습니다.이 병합을 다시 실행하고 싶다면 6 개월 후 문제가되지 않습니다. develop에서 master
  • 이것이 최선의 방법 일 경우 그것, bitbucket에서 끌어 오기 요청은 어떻게됩니까? 그 풀 요청은 여전히 ​​bitbucket에 존재하지만, 우리가 만든 병합 커밋을 제거하고 있습니다. 그래서 어떤 식 으로든 bitbucket을 망칠 것입니까?
  • git revert -m 1 *<SHA of the merge commit>*

    • 이 새로운 그 커밋이 만들어집니다 병합에 의해 수행 된 변경 우리가 나중에에 masterdevelop을 병합 할 계획입니까 제외
    • 이 괜찮을 것을 취소합니다 날짜 (다음 릴리스)를 읽었을 때부터 내가 읽은 바에 따르면 developmaster에 병합 할 때 오늘 되돌릴 변경 내용이 포함되지 않기 때문에 되돌리기 커밋을 되돌릴 것을 기억해야합니다. 아무도이 되돌리기를 기억하지 못하면서 지금부터 6 개월 후에 이것이 문제가되고 싶지 않습니다.
  • TL; DR : 나는 우리가 다시 병합을하고 싶지 않을 때 지금부터 6 개월이 발생할 수 있기 때문에 문제의 git revert 일에 주저입니다. 또한 모두가 경고를하는 것처럼 보이기 때문에 git reset을 주저합니다. 그리고 bitbucket에서 끌어 오기 요청과 관련된 문제를 일으킬 수 있습니다.

    답변

    1

    둘 중 하나를 수행 할 수 있습니다. 당신이해야 할 일을 지시 할 결정적 기술적 이유는 없습니다.

    1. 예외적 인 경우 비 전달으로 업데이트하는 것이 좋습니다. 각각에게 설명하고, 잘못된 주인을 끌어 낸 팀에게 물어보고, 회복하도록 도와주십시오.

    2. 브랜치를 되돌리기 위해 development 브랜치를 전달한 다음 revert the revert 브랜치를 전달하여 내용으로 되돌릴 수 있습니다. 경우 2

    PS :

    정품 케이스

    * 73d5415 (HEAD -> master) master3 
    | * e660100 (development) development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    를 들어 당신은 masterdevelopment를 병합하고 복귀. 이제

    * 7a4f94a (HEAD -> master) Revert "Merge branch 'development'" 
    * 75e1e34 Merge branch 'development' 
    |\ 
    | * e660100 (development) development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    * | 73d5415 master3 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    당신이 할 갈까요, 그것을 해결하기 위해

    $ git checkout development 
    $ git merge --ff-only master 
    $ git revert 7a4f94a (the "Revert" commit) 
    

    결과 :

    e7b511a (HEAD -> development) Revert "Revert "Merge branch 'development'"" 
    * 7a4f94a (master) Revert "Merge branch 'development'" 
    * 75e1e34 Merge branch 'development' 
    |\ 
    | * e660100 development3 
    | * 0356d3a development2 
    | * 6cefad0 development1 
    * | 73d5415 master3 
    |/ 
    * 209d967 master2 
    * dc25505 master1 
    

    e7b511a하지 마스터로 사용하고 나중에 마스터 병합 할 수있는 모든 개발을 포함 . 단점은 있지만 모든 것이 단일 커밋으로 표시되므로 somethig를 비난한다는 의미라면 e660100에 한 번 더 전화해야합니다.

    +0

    2 번에 대해 자세히 설명해 주시겠습니까? 나는 따라하지 않는다. 특히 "앞으로"사용하는 경우. 6 개월 만에 '개발'에서 '마스터'로 병합 할 때 되돌리기를 고려할 수 있도록 '개발'을 변경할 수있는 방법이 있다는 말입니까? –

    +0

    그래프가있는 예제 추가 – max630

    +0

    자세한 답변을 주셔서 감사합니다. 나는 이것을 받아 들인 대답으로 분명히 표시 할 것이지만, 한가지 더. 우리는 마스터에서 되돌리기를 한 이래 개발에 대한 다른 커밋이 있었기 때문에 마스터에서 개발로의 빠른 결합을 할 수 없다. 그게 아무것도 바뀌 었습니까? 빨리 감기 병합 대신 병합 커밋을 수행하여이 작업을 계속 수행 할 수 있습니까? –

    0

    [내가 충분히 명성을 얻기 위해 아직이다, 나는 이렇게 답변으로 내 의견을 추가, 귀하의 질문에 의견을 세울 수 없을]

    나는 마스터의 오래된 해시로 되돌아 알고있는 유일한 방법 (없이 병합 커밋과 커밋의 역전을 보여주는)은 force-push입니다. 예제 및 옵션은 git force-push을 참조하십시오.

    반대 의견이 많아서 논쟁의 여지가있는 답변입니다. 하지만 bitbucket을 사용하는 경우 force-push을 제어 할 수 있습니다. 즉, 사용자가 조작 할 수 있도록 설정하고 마스터에 대해 force-push을 사용 중지 할 수 있습니다.

    참고 : rebasesquash과 같은 최신 플러그인은 --force-with-lease입니다.

    +0

    답변을 주셔서 감사합니다, 그러나 나는 당신이 내가 묻는 것을 오해하고 있다고 생각합니다. git reset -hard를 사용하면 마스터하기 위해 강제로 밀어 넣어야 할 것입니다. 그러나 제 질문은 그것이 최선일 것인가 아니면 대신'git revert'를해야하는지입니다. 그것은 역사를 다시 쓰지 않을 것이므로 강제 추방을 일으키지 않을 것이다. 내 질문을 다시 읽으면 두 가지 접근법을 모두 사용하는 것을 왜 망설이는지 이해할 수 있습니다. –

    +0

    'git reset'과'force push'는 히스토리를 재 작성하여 사람들이 사용하지 말 것을 제안하지만, 만약 당신이 컨트롤을 가지고 있다면 (bitbucket이 제공합니다) 그런 상황에서 사용될 수 있습니다. 정확한 답변을 제공하는 제안이 없으므로 더미 파일과 분기가있는 더미 저장소를 만드는 것이 좋습니다. 그것에 상황을 재현하고 어떤 솔루션이 당신을 위해 작동하는지보십시오. 이렇게하면 주인을 방해하지 않고 안전하게 많은 것을 시험 할 수 있습니다. – RuSh