2012-11-12 43 views
2

我的git - svn的工作流程如下:一個git-svn的結賬特點

生產代碼放在主,客,我做我的git的svn dcommits /變基。我在特性/主題分支上工作,並繼續重新分配-i來掌握和合並,直到我準備好將這些分配給master,然後使用dcommit將其推送到svn trunk。

我通常可以做git checkout -來檢出我以前的分支。

由於某種原因,但當我做git svn rebase,然後嘗試將git結帳到我以前的分支,它不起作用(它只是停留在主)。也就是說,可以說我做的事:

(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 trunk變更帶入master。現在我只想快速切換回我的主題分支。

(master)$ git checkout - 

此時,分支結賬保持爲主。我猜測某種操作正在從我工作的最後一個分支中彈出,但我不知道內部知道這個肯定。

所以我的問題是,有誰知道這是爲什麼?

回答

1

當您運行git checkout -時,git會查詢文件.git/logs/HEAD以查找您簽出的最後一個分支。

當您運行git svn rebase,這觸發了git-svn命令cmd_rebase功能,這在原來電話:

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

這就要求rebase_cmd,它看起來像這樣:

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由此鏈構建的命令行看起來像這樣:

git rebase $gs->refname 

(其中$gs->refname將替換爲分支名稱。),並從git-rebase手冊頁:

如果<分公司指定>是,git的變基會做任何事情之前執行自動混帳結賬 。否則它將保留在當前分支上。

由於rebase命令指定分支名稱,rebase執行結賬,其中追加即使你已經在該分支到.git/logs/HEAD的條目。這就是爲什麼git checkout -的目標不是你在運行git svn rebase之後所期望的。

UPDATE我可能是錯的爲什麼底墊被執行檢查,但如果檢查.git/logs/HEAD你可以清楚地看到,底墊執行(多個)簽出。舉例來說,如果我有一個分支master和分支b1(從master下降),然後執行:

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'手冊頁中的措辭表明你可以在不提供'upstream'的情況下指定'branch',但也許我會誤解它。如果你知道正確的答案,請在這裏發佈,因爲我很好奇! – larsks

+0

在這種情況下,git-svn中的代碼讓我堅信提供了,因爲之前的幾行git-svn將$ gs-> refname稱爲「遠程分支」。 –

1

這實際上似乎與git-svn沒有任何關係,只是git中rebasing的副作用。 A 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 rebase使用git checkout -q "$onto^0"分離HEAD。如果在運行上述命令後檢查.git/logs/HEAD,則會看到狀態爲「從foo移動到876AF98」的條目,然後是「rebase完成:返回到refs/heads/foo」。