[英]A git-svn checkout peculiarity
我的 git-svn 工作流程如下:
生产代码进入 master,我做我的 git svn dcommits/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 -
此时,分支结帐保持为主。 我猜测某种操作正在从我工作的最后一个分支中弹出,但我不知道内部结构来确定这一点。
所以我的问题是,有人知道这是为什么吗?
这实际上似乎与 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 rebase
使用git checkout -q "$onto^0"
分离 HEAD。 如果您在运行上述命令后检查 .git/logs/HEAD,您将看到状态为“从 foo 移动到 876AF98”的条目,然后是“rebase 完成:返回到 refs/heads/foo”。
当您运行git checkout -
, git
查阅文件.git/logs/HEAD
以查找您检出的最后一个分支。
当您运行git svn rebase
,这会触发git-svn
命令中的cmd_rebase
函数,该函数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
手册页:
如果指定了 <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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.