2

我正在使用 git-svn;我通常创建一个主题分支,对其进行提交,然后是 checkout master、git svn rebase、git merge --squash topic_branch、git commit -m "summary comment",然后是 git svn dcommit。

这很好用,但 git 似乎不知道我将分支更改合并到 master 中。我在没有涉及 svn 的情况下尝试了这个:

# Make a repository, add a couple files
$ mkdir gittest
$ cd gittest
$ git init
$ touch foo bar
$ git add .
$ git commit -m "initial version"

# Make a branch, change a file, commit.
$ git checkout -b a_branch
$ vi foo # make a change
$ git commit -am "a change"

# Merge changes into master
$ git checkout master
$ git merge --squash a_branch
$ git commit -m "merged a_branch"

并且 gitk --all 显示了这一点,这表明这不是 git-svn 问题:

gitk 图片显示显然未合并的分支
(来源:selfamusementpark.com

在我的主要 (git-svn) 项目中,我看到早期的一些更改似乎已经被合并,但我不知道我现在在做什么不同,因为我当时没有这样做。(如果重要的话,这是 Ubuntu Jaunty 上的 git 1.6.0.4。)

4

4 回答 4

8

我想这是因为你使用了--squash. 我不确定你为什么这样做,但你不应该这样做。从--squashgit merge 的文档中:

生成工作树和索引状态,就好像发生了真正的合并一样,但实际上不进行提交或移动 HEAD,也不记录 $GIT_DIR/MERGE_HEAD 以使下一个 git commit 命令创建合并提交。这允许您在当前分支之上创建一个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。

基本上,您需要进行“适当的”合并。挤压似乎有一个相当具体的使用情况(我从未有过,所以我不能真正评论它为什么有用)。我这是因为如果您在分支中做了一些工作,但又决定将其合并到您正在做更多总体工作的不同分支中,那么您不希望分支树看起来凌乱。

于 2009-05-23T17:31:00.003 回答
3

只是不要使用git merge --squash:)

于 2009-05-23T17:31:40.923 回答
1

添加到彼得库珀的答案(评论不够长):

git rebase --interactive(虽然电锯很危险:请参阅http://tomayko.com/writings/the-thing-about-git了解更多信息和一些关于您为什么要使用它的背景)将让您在 dcommitting 之前压缩和重新排序单个提交他们到svn。我经常使用它来帮助将 10-12 个中间提交合并为 3-4 个补丁集,然后再提交回 repo。

尝试git rebase --interactive HEAD~10以交互方式对当前分支上的最后 10 次提交进行变基。一旦你学会了它就非常棒,我每天都在我的 git svn repo 上使用它。

于 2009-05-25T07:51:34.043 回答
1

在你完成壁球合并之后,你需要手动告诉 git 你的合并,因为在你 dcommit 之后 git 忘记了。手动告诉 git 合并的方法是使用 git 嫁接。 链接文本

于 2009-06-23T06:42:53.673 回答