我的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 -
此时,分支机构结账仍然是主机。我猜测某种操作正在弹出我工作的最后一个分支,但我不知道内部人员肯定知道这一点。
所以我的问题是,有谁知道这是为什么?
答案 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