繁体   English   中英

一个 git-svn 结帐特性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM