2016-12-15 4 views
1

나는 다음과 같은 bash는 스크립트가 : 병합이 실패 할 경우,은 자식 재설정입니다 - 병합에 실패하면 필요합니까?

  1. 병합이 시작하기 전에이 상태로 돌아갈 자식 리셋을 어떻게해야합니까 :

    git merge --squash -Xtheirs dev -m "squashing" && 
    (./test/testsrc/shell/node-c.sh && echo "compiled successfully") || (git reset --hard; exit 1) 
    

    내가이 개 질문을 ?

  2. 1에 대한 대답이 "예"라고 가정하면, 위의 스크립트는 정확합니다. 즉, node-c.sh 스크립트가 0이 아닌 코드로 끝나면 git reset --hard가 호출되어 절대 종료됩니다 코드 = 1?

내가 자식 병합을 실행할 때 그 자식이 - 하드 리셋 때문에, 인덱스가 항상 상관없이 업데이트되지 않습니다 것을 생각하고 항상 옳은 일이다.

제쳐두고 병합이 작동하지 않는 나쁜 Git 버그가 나타나는 것을보고 있는데 .js 파일이 엉망이되어서 종종 "$ node -c"로 컴파일 할 수 없습니다. . 아무도 전에 이것을 보았는지 확신 할 수 없지만, Git에 버그 보고서를 제출했습니다.

+2

_I는 버그 신고서를 제출했습니다. : 그리고 본질적으로'-Xtheirs'는 마법의 총알이 아니며, 반대로, 충분한 밧줄입니다 ... ;-) – j6t

+0

@ j6t 당신은 절대적으로 옳습니다, 그것은 힘내 사람들이 나에게 말한 것입니다 :) 어쩌면 당신은 하하였습니다. TBH는 제가 본 실패율을 가지고 있습니다. -X는 내가 본 것보다 많이 경고해야합니다. 최소한 JavaScript 코드를 병합 할 때. –

+0

'git reset --hard'보다는'git merge --abort'를 사용해야합니다. (그들은 당신의 경우에 대해 똑같은 일을하기는하지만, '병합 - 항아리'는 더 명확하고, 미래 보장적이다.)그것은 실패한 병합 부분입니다. "병합 취소"를 위해서 당신이하고있는 것처럼'git reset --hard ORIG_HEAD'를 사용하십시오. – torek

답변

3

병합에 실패하면 분기와 충돌 상태가됩니다. 이에 대한 내 생각은 당신이 있기 때문에, git reset --hard보다는 git merge --abort을 사용으로을 안전 할 거라고이다

  • 그것은, 당신은 병합을 중단 있어 명령의 맥락에서 분명하고 때문에

당신은 지금까지 인간/수동 개입의 일종없이 지점을 하드 재설정하지 않는 병합 실패로 영원히 손실됩니다 망할 놈의 단계에자를 수

  • 것; 다시 설정하는 경우에도 가능성이 높습니다.은 안전합니다. 아직 플루토늄을 가지고 놀고 있습니다. 여러분 힘내 "버그"에 관해서는


    - 나는 힘내 비난하는 것입니다 진정으로 의심; 의도 한 병합이 계획대로 진행되지 않고 부작용이 될 수 있습니다. 스크립트에서

  • 1

    , 당신은이 작업을 수행 실제로해야

    git merge --squash -Xtheirs dev -m "squashing" && 
    (./test/testsrc/shell/node-c.sh && echo "compiled successfully") || 
    (git reset --hard ORIG_HEAD; exit 1) 
    

    병합을 통해 진행

    하지만 node-c.sh하지 않는, 당신은 병합이 원하지 않는 것을 커밋합니다. pseudo-ref ORIG_HEAD은 가장 최근의 병합이 시작되었을 때의 위치를 ​​가리 킵니다. 병합에 실패하면 HEAD과 같고 성공한 경우 HEAD^과 같습니다.

    +0

    당신은 그 지점을 잡을지도 모릅니다. –

    +0

    하나의'git reset --hard ORIG_HEAD'가 명확하게 작동하지만 미래의 검증을 위해서 병합 자체가 실패 할 경우 별도의'git merge --abort'를 제안 할 것입니다. (나는'git reset -hard'가 어떻게 작동하는지에 대한 어떠한 계획도 모르지만,'git merge --abort'의 존재를 고려할 때, 미래의'git reset '이 당신에게 "병합 진행 중, 오류가 발생했다면 오류를 먼저 중단합니다." – torek

    +0

    @torek 힘내라, 호환성을 잃지 않는 기록이있다. 그러므로,'git reset -hard'가 동작을 바꿀 가능성은 희박하므로, 논의중인 것과 같은 스크립트를 깨지 않도록하십시오. 새로운 재설정 모드가 나타날 수 있지만 기존 모드는 변경되지 않습니다. BTW,'git merge --abort'는 변장에 단지'git reset --merge'입니다. – j6t