git-svn和本地分支机构

LiK*_*Kao 5 svn git git-svn git-branch

我通常使用git进行版本控制,但是现在我在svn存储库中遇到了源代码,因此我使用git-svn来访问该存储库.然而,当我尝试使用本地分支时,这似乎会导致一些麻烦.

我通常每天只提交一次本地存储库,所以我可能会在我的本地主服务器上提交,我还没有上传.当我在此时创建分支,然后其他人提交到上游存储库时,当前的一个和上一个同步的提交之间的所有提交都会重复.

为了使这一点更加清晰:

A-B-C-D-E  
     \  
      \-F
Run Code Online (Sandbox Code Playgroud)

上游存储库位于A处,两个分支处分别位于E和F. 做一个git svn rebase会导致:

A-G-H-B-C-D-E
 \
  \-B-C-F
Run Code Online (Sandbox Code Playgroud)

其中G和H是从上游回购中提取的提交.我已经尝试通过切换到另一个git svn rebase来将两个提交到另一个分支.但这让我离开了:

A-G-H-B-C-D-E
 \
  \-G-H-B-C-F
Run Code Online (Sandbox Code Playgroud)

因此,这会导致更多的提交重复.有没有一种干净的方法来处理这种情况?

Mar*_*air 1

您可以将git rebase任何范围的提交重新应用到任何特定的提交上,这听起来就像您想要的那样。这种技术适用于移动任何范围的提交,但正如我在底部提到的,如果您的分支上确实只有一个提交F,那么选择樱桃会更容易。不过,首先我将描述如何使用 来做到这一点git rebase,因为这更普遍有用。

(注意,我将稍微重命名您的提交,因为这两个Bs、Cs 等在变基后将具有不同的提交 ID。)

第一个之后git svn rebase

因此,如果您想在第一次之后进行此变基,git svn rebase您将面临以下情况:

A-G-H-B'-C'-D'-E'
 \
  \-B-C-F
Run Code Online (Sandbox Code Playgroud)

此时,您可以这样做:

git rebase --onto C' C F
Run Code Online (Sandbox Code Playgroud)

...这会创建:

A-G-H-B'-C'-D'-E'
\          \
 \-B-C-F    \-F'''
Run Code Online (Sandbox Code Playgroud)

第二次之后git svn rebase

如果情况如您在第二个之后所描述的git svn rebase那样,则如下所示:

A-G-H-B'-C'-D'-E'
 \
  \-G'-H'-B''-C''-F''
Run Code Online (Sandbox Code Playgroud)

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

git rebase --onto C' C'' F''
Run Code Online (Sandbox Code Playgroud)

要创建图表:

A-G-H-B'-C'-D'-E'
 \         \
  \          \- F'''
   \
    \-G'-H'-B''-C''-F''
Run Code Online (Sandbox Code Playgroud)

...您可以忘记G'通过到F''


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

git checkout -b new-experiment C'
git cherry-pick F
Run Code Online (Sandbox Code Playgroud)

我希望这有一些用处。