2013-06-05 3 views
1

스쿼시와 유사한 결과를 얻으려면이 워크 플로에 문제가 있습니까?가짜 스쿼시

  • 체크 아웃은 마스터에서 새로운 지점은 커밋의 무리를 확인
  • draft_feature_a을했다. 일부는 중단 코드를 커밋합니다. 일부는 커밋 메시지를 잘못 처리합니다.
  • 체크 아웃 마스터, 마스터 체크 아웃에서 새로운 지점 지금 방금 최종 변경이 있고이있는 사람을 커밋 할 수 git checkout draft_feature_a $(git diff --name-only master draft_feature_a)

을 수행하여 초안 기능에서 최종 변경에 feature_a

  • 풀라고 꽤 커밋 메시지.

  • +1

    torek에서 언급 한 삭제 된 파일을 제외하고이 파일은 실제 파일입니다. – cforbish

    답변

    2

    그것은 예를 들어, 파일의 제거를 캡처하지 않습니다 :

    $ git checkout draft_feature_a $(git diff --name-only master draft_feature_a) 
    error: pathspec 'ttt.py' did not match any file(s) known to git. 
    

    당신은과 같은 일을 할 수있는 실제 REBASE -와 - 스쿼시 - 등 (I 꽤 많이, 아래의 "오류 복구"같은 사용 것은, 정말로, 원래의 커밋은 모두 여전히 볼 수 draft_feature_a에)있다 : 대부분의 시간에 난 그냥 초안 작업을 "자식이 -i을 리베이스"거야하지만

    $ git checkout -b draft_feature_a 
    [work, commit, etc - I made two commits: add newfile and rm ttt.py] 
    $ git checkout master 
    Switched to branch 'master' 
    $ git checkout -b feature_a 
    Switched to a new branch 'feature_a' 
    $ git merge draft_feature_a 
    Updating 523bacb..3a486fc 
    Fast-forward 
    newfile | 0 
    ttt.py | 14 -------------- 
    2 files changed, 14 deletions(-) 
    create mode 100644 newfile 
    delete mode 100644 ttt.py 
    git rebase -i master 
    [edit to make everything but the first a "fixup"] 
    ... 
    2 files changed, 14 deletions(-) 
    create mode 100644 newfile 
    delete mode 100644 ttt.py 
    Successfully rebased and updated refs/heads/feature_a. 
    $ git commit --amend 
    [edit commit message] 
    

    는 사실이 많은 것 워크 플로우를 사용합니다. 개별 "초안"분기를 만들지 여부에 상관없이 원래의 커밋을 사용할 수 있으며 이름을 잃어 버리고 reflog를 통해 커밋 ID를 찾아야합니다.

    $ git checkout master 
    Switched to branch 'master' 
    $ git branch -D draft_feature_a 
    Deleted branch draft_feature_a (was 3a486fc). 
    $ git branch -D feature_a 
    Deleted branch feature_a (was 0fc36f0). 
    

    (이제 새로운 예() 우선, 앞의 예를 정리하자) 대신 새로운 지점과 "자식 병합"-ing를 만드는 새 이름을 추가 할 수 있습니다

    $ git checkout -b feature_a 
    Switched to a new branch 'feature_a' 
    [work work work] 
    [time to clean up, let's stick a label on this version so I can find it easily:] 
    $ git branch messy_feature_a feature_a 
    $ git rebase -i master 
    

    일단 모든 것을 고치면 모든 "초안"(저품질/지저분한) 메시지가 편집되고, 수정 된 메시지, 수정 된 메시지, 작품은 "지저분한"이름으로 여전히 이름으로 이용 가능합니다. 만족스럽고 오래된 이름을 원하지 않으면 수동으로 삭제합니다 (git branch -D).

    이 속임수를 이해하려면 속임수를 쓸 때마다 에만 새로운 커밋을 추가하십시오.. 오래된 것들은 (결국) "가비지 수집"하기 위해 암시 적이거나 명백한 것을 할 때까지 당신의 저장소에 있습니다. 그들은 3a486fc 스타일 SHA1 이름 이외의 다른 이름으로 커밋을 가능하게하는 지점 레이블 이름 (또는 태그와 같은 다른 "보이는"이름)을 가지고있는 한 "영원히"지속됩니다. 분기를 삭제하면 레이블이 지워집니다. 1 ~ 3 개월 후, 레이블이없는 커밋은 결국 가비지 수집됩니다. 더 정확하게는 reflog에 이름이 있습니다. reflog 항목에 시간 제한이 있습니다. 매개 변수, 특히 --expire=<time> 매개 변수에 대한 설명서를 참조하십시오.

    마찬가지로 "rebase"는 새로운 시리즈를 만듭니다 모든 커밋을 거기에 남겨둔다.REBASE은 커밋의 새로운 시리즈의 마지막에 자식 껍질을 커밋 및 페이스트를의 이전 시리즈의 마지막 오프 라벨을 수행하는 경우 :

    A -- B -- C   [label: master] 
          \ 
          D -- E [label: feature_a] 
    
    [rebase feature_a on master, and squash or fixup to make commit DE which is D+E] 
    
    A -- B -- C   [label: master] 
          | \ 
          | D -- E [no label!] 
          \ 
          DE  [label: feature_a] 
    

    당신이 REBASE을하기 전에 별도의 레이블을 추가 할 경우, current-branch feature_a 레이블이 벗겨지고 새 커밋으로 이동되지만 다른 레이블 (messy_feature_a)이 붙어서 커밋 E와 전체 체인 (C에서 D 및 E 분기)에 쉽게 액세스 할 수 있습니다.

    1

    리눅스 맛을 낸 시스템에있는 것 같습니다 $(git.... 이 작업을해야합니다 및 삭제 된 파일 처리됩니다 :

    git checkout -b feature_a master 
    git diff draft_feature_a | patch -p1 -R 
    
    0

    이 나의 새로운 워크 플로우입니다 :

    • 체크 아웃 draft_feature_a
    • 라는 마스터에서 새로운 지점은 커밋의 무리를합니다. 일부는 중단 코드를 커밋합니다. 일부는 커밋 메시지를 잘못 처리합니다.
    • masterdraft_feature_a으로 병합하고 충돌을 해결하십시오. draft_feature_a 체크 아웃 새로운 지점 final_feature_a (git checkout -b final_feature_a)
    • git reset --soft master
    • 에서
    • 지금 당신은 단지 최종 변경이 있고 꽤 커밋 메시지들을 커밋 할 수 있습니다.

    나는이 모든 것을 git rebase -i master으로 처리 할 수 ​​있다는 것을 알고 있으며, 충돌이있을 때 그것은 복잡해진다.