git-svn和本地分支机构

时间:2011-03-22 11:05:17

标签: svn git git-svn git-branch

我通常使用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 个答案:

答案 0 :(得分:1)

你应该在'git svn dcommit'之前使用'git svn rebase'来避免这样的问题。这反映了在提交之前更新的常见svn用法。有关详细信息,请参阅http://git-scm.com/docs/git-svn中的“REBASE VS. PULL / MERGE”部分。

答案 1 :(得分:1)

您可以使用git rebase在任何特定提交上重新应用任何提交范围,这听起来像您想要的。这种技术适用于移动任何提交范围,但正如我在底部提到的,如果你的分支上只有一个提交F,那么它就更容易挑选。但是,首先我将介绍如何使用git rebase来完成此操作,因为它通常更有用。

(n.b。我将稍微重命名您的提交,因为两个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''


但是,在这两种情况下,您只需移动一次提交,因此可能更容易选择提交。换句话说,你可以这样做:

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

我希望有一些用处。