git-svn和本地分支

5

我通常使用git进行版本控制,但现在我被困在一个svn仓库中,所以我使用git-svn来访问该仓库。然而,当我尝试使用本地分支时,似乎会出现一些问题。

通常情况下,我每天只提交一次本地仓库,因此我可能在本地主分支中有一些提交,但尚未上推到上游。当我在这个时候创建一个分支,然后其他人向上游仓库提交时,当前提交与最后一次上推之间的所有提交都会重复。

为了更清楚地说明这一点,这里有一张简短的图片:

A-B-C-D-E  
     \  
      \-F

上游仓库在A,两个分支分别在E和F。进行git svn rebase操作会出现以下情况:

A-G-H-B-C-D-E
 \
  \-B-C-F

G和H是从上游仓库中提取的提交记录。我已经尝试切换到另一个分支并进行另一次git svn rebase操作,以将这两个提交记录也带到那里。但结果是:

A-G-H-B-C-D-E
 \
  \-G-H-B-C-F

因此,这导致了更多的提交重复。有没有一种清洁的方法来处理这种情况?

2个回答

1

你可以使用 git rebase 命令将任何一段提交记录重新应用到特定的提交记录上,这听起来就像是你在这里想要的。这种技术适用于移动任何一段提交记录,但正如我在底部提到的那样,如果你的分支上真的只有一个单独的提交记录 F,那么最好使用 cherry-pick 命令。不过,首先我会描述一下如何使用 git rebase 命令进行操作,因为这更加通用。

(注意:由于两个 BC 等提交记录在变基后会有不同的提交 ID,所以我会稍微改变你的提交记录名称。)

在第一次 git svn rebase

所以,如果你想在第一次 git svn rebase 后进行这种变基操作,你会处于以下情况:

A-G-H-B'-C'-D'-E'
 \
  \-B-C-F

此时,你可以做:

git rebase --onto C' C F

... 这将会创建:

A-G-H-B'-C'-D'-E'
\          \
 \-B-C-F    \-F'''

第二个 git svn rebase 之后

如果您在第二个 git svn rebase 之后的情况如您所描述,那么它应该是这样的:

A-G-H-B'-C'-D'-E'
 \
  \-G'-H'-B''-C''-F''

在这种情况下,你可以类似地做:

git rebase --onto C' C'' F''

创建图表的方法如下:
A-G-H-B'-C'-D'-E'
 \         \
  \          \- F'''
   \
    \-G'-H'-B''-C''-F''

......并且你可以忘记关于G'F''的一切。


然而,在这两种情况下,您只是移动一个提交,因此最好使用cherry-pick命令。换句话说,您可以执行以下操作:

git checkout -b new-experiment C'
git cherry-pick F

希望这对你有所帮助。


这与我想的类似。所以我猜我只能在从上游获取额外提交后手动进行变基。幸运的是,我通常不会有多个额外分支,所以我可能可以自动完成这个过程。 - LiKao
我认为是正确的,是的。如果您经常需要执行此操作,编写一个自动化脚本并不是一个坏主意。即使您手动执行此操作,至少通过频繁参考“gitk --all”,您可以相当确信分支是您所期望的。 - Mark Longair

1

在执行 'git svn dcommit' 之前,应始终使用 'git svn rebase',以避免出现此类问题。这与常见的 svn 更新后提交用法相同。有关详细信息,请参阅 http://git-scm.com/docs/git-svn 中的“REBASE VS. PULL/MERGE”部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接