2010-07-21 3 views
7

프로젝트를 이해하려고하는데 gitk를 사용하여 진화를 관찰하는 것이 도움이됩니다. 내가하는 일은 첫 번째 커밋을 체크 아웃하고, 코드를 이해하고, 테스트를 실행하고, 다음 커밋으로 이동하고 반복하는 것입니다. 나의 현재 워크 플로우는 해시를 통해 커밋 체크 아웃하는 것입니다git 리포지토리를 단계별로 실행하는 방법은 무엇입니까?

git checkout 79cd6 

하지만 내가 원하는 것은 내가 내 자신의 변화를 수행 할 수있는 또 다른 지점이며, 나를 마스터 지점에서 커밋을 병합 할 수 있지만 필요없이 커밋 해시를 찾아라. 이상화 된 워크 플로우 :

git checkout -b <newbranch> <first commit id of master> 
git <command to move head of current branch to next commit of master> 

답변

1

당신은 작은 쉘 스크립트를 작성할 수 있습니다. 한 스크립트는 git log --pretty=oneline | awk '{print $1;}'을 실행합니다. 두 번째 스크립트 (step 또는 그 외 이름)는 head, tail, wc -l을 사용합니다. 그런 다음 파일의 마지막 줄을 tail으로 읽고 파일에있는 줄 수를 확인한 다음 파일에서 마지막 줄을 제거하십시오. 못 생겼어. 물론. :) (좀 더 추한 사람이되고 싶다면 truncate(1)을 사용하면 항상 새로운 임시 파일을 만드는 대신 파일의 마지막 줄을 잘라낼 수 있습니다.)

2

~/bin/git-next 또는 다른 위치에 저장하십시오. 경로 :

#!/bin/bash 
git co $(git rev-list --children --all | awk "/^$(git rev-parse @\{0})/ { print \$2; }") 

그러면 현재 개정판의 첫 번째 하위 항목이 체크 아웃됩니다.

큰 repo에서 느린 매우으로 느려지지만 작업을 수행 할 것입니다.

필요에 따라 분기를 처리하도록 수정할 수 있습니다.

+0

속도가 문제라면'git rev-list '의 결과를 저장하고 현재 HEAD가있는 행을 찾아서 전에 그 행을 체크 아웃 할 수 있습니다. – Cascabel

7

나는 이것이 약간의 오래된 질문이라는 것을 알고있다. 그러나 나는 똑같은 일을하고 싶었고 대답을 찾았고 그래서 나는 나눌 것이라고 생각했다.

for commit in $(git rev-list master --reverse) 
do 
    git checkout $commit 
    read 
done 

는 하나 개의 창에서이 작업을 수행. 초기 커밋부터 시작하여 입력 할 때마다 한 번씩 진행됩니다. 그런 다음 다른 쉘에서 테스트 등을하십시오.
선형 히스토리와 완벽하게 작동하지만 병합 등을 어떻게 처리 할 것인지 잘 모르겠습니다. 나는 그것이 합리적 일 것이라고 확신하지만, 당신의 마일리지는 조금 다를 수 있습니다.

+1

매력처럼 일했습니다! 또한 전체 히스토리를 체크 아웃하지 않으려면'git rev-list master^[checkout에 첫 번째 커밋의 해시]^--reverse' 명령을 사용할 수 있습니다. – CletusW

+0

'git checkout master'를 끝에 추가하면 올바른 브랜치로 돌아 가게됩니다. – CletusW

+0

내 결과 bash 파일은 다음과 같습니다. https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW

0

코드 검토/데모를 위해 분기에서 커밋을 쉽게 수행 할 수있는 방법이 필요했습니다. 이것은 자동화하기 위해 생각해 낸 작은 스크립트입니다. 말하자면, 파일에 git_step을 다음을 삭제하고과 같이 실행하십시오 gist here으로 git_step d17dacce8b13b2ad454003da7cbd670a06c41437

#!/bin/bash 

BASE_REV=${BASE_REV:-$1}; 
current_branch=$(git branch | grep '^*' | awk '{print $2}'); 

for rev in $(git rev-list ${BASE_REV}..HEAD | tail -r); do 
    git checkout $rev; 
    LESS='RSX' git show -p $rev; 
done; 

git checkout ${current_branch}; 

도 가능합니다.

관련 문제