2012-11-12 6 views
2

내 자식 - svn을 작업 흐름이다. 필자는 feature/topic 브랜치를 작업하고 master-merge하기 위해 rebase -i를 계속해서 수행한다. 마스터를 가져 와서 dcommit을 사용하여 svn 트렁크로 푸시 할 준비가 될 때까지 병합한다.자식 - svn을 체크 아웃 특색

나는 이전 분기를 체크 아웃하기 위해 보통 git checkout -을 수행 할 수 있습니다.

비록 내가 git svn rebase을 수행 한 다음 이전 분기로 체크 아웃하려고하면 어떤 이유로 마스터가 계속 작동하지 않습니다. 즉, 내가 말할 수 :

(master)$ git checkout -b my-feature-branch 

내가 그 분기에 몇 가지 작업을 수행 한 후 그때의 최신 변경 사항에 가지고 싶어

(my-feature-branch)$ git commit -am "Some work" 

를 저지하고 신속하게 내 지점으로 되돌아 :

(my-feature-branch)$ git checkout master 
(master)$ git svn rebase 

이것은 최신 svn 트렁크 변경 사항을 마스터로 가져옵니다. 이제 주제 분점으로 빠르게 되돌리려 고합니다.

(master)$ git checkout - 

이 시점에서 지점 체크 아웃은 마스터로 유지됩니다. 나는 일종의 작업이 내가 작업 한 마지막 분기를 터뜨리고 있다고 생각하지만 내부에 대해 확실히 알지 못합니다.

제 궁금한 점은 누구나 이것이 왜 있는지 압니까?

답변

1

git checkout -을 실행하면 git은 파일 .git/logs/HEAD을 참조하여 체크 아웃 한 마지막 분기를 찾습니다. 그래서

sub rebase_cmd { 
     my @cmd = qw/rebase/; 
     push @cmd, '-v' if $_verbose; 
     push @cmd, qw/--merge/ if $_merge; 
     push @cmd, "--strategy=$_strategy" if $_strategy; 
     push @cmd, "--preserve-merges" if $_preserve_merges; 
     @cmd; 
} 

git : 다음과 같습니다

command_noisy(rebase_cmd(), $gs->refname); 

rebase_cmd를 호출 : 당신이 git svn rebase을 실행하면

,이에 전화를 도는 git-svn 명령에 cmd_rebase 기능을 트리거 이 체인에 의해 만들어진 명령 행은 다음과 같습니다.

git rebase $gs->refname 

(여기서 $gs->refname은 분기 이름으로 대체됩니다.) 그리고 git-rebase 사람 페이지에서>가 지정

지점 < 경우, 자식 REBASE 다른 작업을 수행하기 전에 자동 자식 체크 아웃 을 수행합니다. 그렇지 않으면 현재 분기에 남아 있습니다.

rebase 명령이 지점 이름을 지정하기 때문에, rebase는 해당 분기에 이미있는 경우에도 .git/logs/HEAD에 항목을 추가합니다 체크 아웃을 수행합니다. 이 때문에 의 대상이 git svn rebase을 실행 한 후 예상 한 것과 다릅니다. REBASE이 체크 아웃을 수행하는 이유

UPDATE 나는 에 대해 잘못 될 수 있지만, 당신은 .git/logs/HEAD을 검사하는 경우는 은 (다중) 체크 아웃을 수행입니다 리베이스가 명확하게 볼 수 있습니다. 그때 지점 master 및 (master 후손) 지점 b1 있고, 예를 들어, 수행

git checkout master 
git rebase b1 

나는이 (가) 로그에 다음과 같이 끝 :

6240c11... c4bfd14... Lars Kellogg-Stedman <[email protected]> 
    1352952244 -0500 checkout: moving from b1 to master 
c4bfd14... 6240c11... Lars Kellogg-Stedman <[email protected]> 
    1352952260 -0500 checkout: moving from master to 6240c1154706c675d19d771ad36aebc2658a5df8^0 
6240c11... 6240c11... Lars Kellogg-Stedman <[email protected]> 
    1352952260 -0500 rebase finished: returning to refs/heads/master 
+0

사실, git rebase 명령은 을 제공하지 않고 단지 만을 제공하므로 맨 페이지의 일부는 적용되지 않습니다. –

+0

사실 나는 그게 사실인지 모르겠습니다. 'git rebase' man 페이지의 문구는'upstream'을 제공하지 않고'branch'를 지정할 수 있음을 암시하지만 어쩌면 잘못 읽었을 수도 있습니다. 당신이 정답을 알고 있다면, 나는 호기심이기 때문에 여기에 그것을 게시하십시오! – larsks

+0

이 경우 git-svn의 코드는 이 제공되고 있다고 강력히 믿습니다. 몇 줄 앞에서 git-svn이 $ gs-> refname을 "Remote Branch"로 참조하기 때문입니다. –

1

이것은 실제로 git-svn과 관련이없는 것으로 보이며 git에서 리베이스하는 부작용 일뿐입니다. git rebase은 현재 분기를 다시 체크 아웃하는 것을 의미합니다.

$ git checkout master 
$ git checkout HEAD~1 
# A bunch of stuff about being in detached HEAD mode. 
$ git checkout -b foo 
$ git rebase master 
$ git checkout - 
Already on 'foo' 

git rebasegit checkout -q "$onto^0"를 사용하여 헤드를 분리하기 때문입니다 : 자기에 이것을 증명하려면 다음 명령을 사용합니다. 위의 명령을 실행 한 후 .git/logs/HEAD를 확인하면 "foo에서 876AF98로 이동"하고 "rebase finished : refs/heads/foo로 돌아 가기"라는 항목이 표시됩니다.

관련 문제