2014-06-07 4 views
1

새 분기에서 여러 커밋을 되돌리고 기존 분기 중 하나와 결과를 병합하려면 쉘 스크립트와 함께 도움이 필요합니다. 저는 프로젝트에 dev, live, stage라는 3 개의 브랜치가 있습니다. 무대 분기는 무대 웹 사이트에서 테스트하는 변경 사항을위한 것이며, 클라이언트의 승인 후에 라이브 지점으로 이동해야합니다.git 자동 되돌리기 커밋 세트

문제는 클라이언트가 배포를 위해 모든 단계 변경 사항을 승인하지 않을 수 있다는 것입니다 (예를 들어, 각 스테이지 분기에서 커밋 된 1,2,3,4,5 티켓을 완료했지만 클라이언트가 1, 3,4 즉시 배포해야 함). 따라서 작업은 스테이지 브랜치의 특정 커밋을 라이브와 병합하는 것입니다. 내 솔루션은 다음과 같습니다

  • 체크 아웃 새로운 지점은
  • 되돌리기 내가 배포 지점에서 라이브

지금까지 내가 복귀있어 변경

  • 병합 배포 지점이 필요하지 않습니다 커밋 (배포) in 지점을 수동으로 배포합니다. 이제이 프로세스를 자동화하고 2 단계 (배포 분기에서 특정 커밋을 되 돌리는) 용 스크립트를 만들려고합니다. 내 스크립트입니다 : 내가 복귀해야 모든 커밋을 나열 절 경우에

    git filter-branch -f --commit-filter ' 
    if [ "$GIT_COMMIT" = "8f3859d5f1a5bb75d50f933a0277ba4bca4f2abc" ]; 
    then 
        git revert $GIT_COMMIT --no-edit 
        git commit -m "Cleaning up revision: $GIT_COMMIT" 
    fi' HEAD 
    

    . 그러나이 스크립트를 적용한 후 난 항상 메시지를

    Rewrite 8f3859d5f1a5bb75d50f933a0277ba4bca4f2abc (6/13)error: Your local changes would be overwritten by revert. 
    

    힌트가 나타납니다 변경 사항을 커밋 또는 진행을 숨기고.

    그러나 git status 명령은 커밋 변경 사항이 없음을 보여줍니다. 그래서, 주요 질문은 수동으로 명령을 실행할 때 왜 작동합니까? 스크립트 내에서 명령을 격리 할 때가 아닙니다. 오후 8시 30 분 P.S. 내가 사용하고있다 Git for Windows

  • +0

    http://stackoverflow.com/questions/11753533/need-to-go-back-to-prev-commit-in-git-how#comment15603638_11753734 도움이 될까요? – VonC

    +0

    각 티켓마다 별도의 기능 분기를 사용하는 것을 고려해야합니다. 그러면 클라이언트가 승인 한 것을 병합하고 되돌릴 때의 혼란을 피할 수 있습니다. –

    답변

    2

    되돌리기가 엉망이 아닌, 나는 클라이언트가 원하는대로 커밋을 풀기 위해 cherry-pick을 사용한다. 그런 다음 단계를 동기화 상태로 유지하기 위해 무대를 재설정합니다. 승인되지 않은 무대 위의 커밋을 유지하려면 리셋 전에 태그를 지정해야합니다.

    클라이언트가 분기 단계에서 커밋 a 만 승인한다고 가정합니다. 이 그림입니다.

     / \ 
         x  a 
         |  | 
    live-> x  b 
           | 
           c <-stage 
    
        git checkout live 
        git cherry-pick a 
    
         / \ 
         x  a 
         |  | 
         x  b 
         |  | 
    live-> a  c <-stage 
    
        git checkout stage 
        git tag stage "client_submission_yyyy_mm_dd" 
        git reset live 
    
          / \ 
          x  a 
          |  | 
          x  b 
          |  | 
    live,stage-> a  c <-client_submission_yyyy_mm_dd 
    

    이제 라이브 및 스테이지에는 클라이언트가 승인 한 커밋이 있습니다. 클라이언트가 승인하지 않은 커밋은 태그에서 도달 할 수 있기 때문에 유지됩니다. 클라이언트가 나중에 마음이 바뀌고 "당신이 날 xxxx에 나에게 보여 줬던 그 특징"을 원한다면, 태그에서 그것을 찾아서 그 사람을 대신해서 살 수 있습니다.

    유일한 문제는 dev 브랜치에 여전히 거부 된 커밋이 포함되어 있다는 것입니다. 그들에게는 몇 가지 옵션이 있습니다. 한 가지 옵션은 거부 된 커밋을 분기에서 삭제하려는 경우 dev를 다시 살려 놓는 것입니다. 그들이 거부 된 커밋을 완성 된 상태로 만들기 위해 계속해서 작업하고 싶다면, 커밋 된 상태의 커밋을 리셋 후에 개발자에게 넘길 수 있습니다.