我通常使用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
因此,这会导致更多的提交重复。有没有一种干净的方法来处理这种情况?
答案 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。我将稍微重命名您的提交,因为两个B
,C
等等在重新定位后会有不同的提交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
我希望有一些用处。