2

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

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

我通常git checkout -可以检查我所在的上一个分支。

但是由于某种原因,当我这样做时git svn rebase,然后尝试 git 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 -

此时,分支结帐保持为主。我猜某种操作正在从我工作的最后一个分支中弹出,但我不知道内部结构以确定这一点。

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

4

2 回答 2

1

这实际上似乎与 git-svn 没有任何关系,只是在 git 中变基的副作用。Agit 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分离 HEAD 使用git checkout -q "$onto^0". 如果您在运行上述命令后检查 .git/logs/HEAD,您将看到状态为“从 foo 移动到 876AF98”的条目,然后是“rebase 完成:返回到 refs/heads/foo”。

于 2012-11-15T03:25:13.213 回答
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正在执行(多个)结帐。例如,如果我有一个分支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
于 2012-11-15T03:29:26.130 回答