git-svn结帐的特点

时间:2012-11-12 15:16:54

标签: git git-svn

我的git-svn工作流程如下:

生产代码进入master,我执行git svn dcommits / rebase。我在功能/主题分支上工作,并继续rebase -i来掌握和合并,直到我准备将它们带入master并随后使用dcommit推送到svn trunk。

我通常可以git checkout -查看我以前的分支。

出于某种原因,当我执行git svn rebase,然后尝试将gout checkout发送到我之前的分支时,它不起作用(它只是保留在master中)。也就是说,让我说:

(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 -

此时,分支机构结账仍然是主机。我猜测某种操作正在弹出我工作的最后一个分支,但我不知道内部人员肯定知道这一点。

所以我的问题是,有谁知道这是为什么?

2 个答案:

答案 0 :(得分:1)

这实际上似乎与git-svn没有任何关系,只是git中rebase的副作用。 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 finished:return to refs / heads / foo”。

答案 1 :(得分:1)

当您运行git checkout -时,git会查询文件.git/logs/HEAD以查找您签出的最后一个分支。

运行git svn rebase时,会触发cmd_rebase命令中的git-svn函数,该命令依次调用:

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手册页:

  

如果< branch>如果指定,git rebase将执行自动git checkout   在做任何事之前。否则它将保留在当前分支上。

由于rebase命令指定了分支名称,rebase执行结帐,即使您已经在该分支上,也会向.git/logs/HEAD 附加一个条目 。这就是为什么git checkout -的目标不是您在运行git svn rebase之后所期望的目标。

更新我可能错误为什么 rebase正在执行结帐,但如果您检查.git/logs/HEAD,您可以清楚地看到rebase 是< / em>执行(多个)结账。例如,如果我有一个分支master和一个分支b1(来自master),那么请执行以下操作:

git checkout master
git rebase b1

我最终在日志中得到以下内容:

6240c11... c4bfd14... Lars Kellogg-Stedman <lars@example.com> 
  1352952244 -0500  checkout: moving from b1 to master
c4bfd14... 6240c11... Lars Kellogg-Stedman <lars@example.com> 
  1352952260 -0500  checkout: moving from master to 6240c1154706c675d19d771ad36aebc2658a5df8^0
6240c11... 6240c11... Lars Kellogg-Stedman <lars@example.com> 
  1352952260 -0500  rebase finished: returning to refs/heads/master