git-svn dcommiting单个git提交

时间:2009-08-10 17:35:10

标签: git git-svn

如果有多个未提交的git提交,那么git-svn dcommit只能提交其中一个提交吗?

e.g。我已经提交了foo,bar和baz,但是现在我只想在svn repo中结束吧。这可能吗?

4 个答案:

答案 0 :(得分:27)

(以下假设您的工作在master。)

首先,重新排序最后三次提交,以便bar成为第一个。

git rebase -i HEAD~3

编辑器会弹出如下内容:

pick 498e4f4 foo
pick 71547ae bar
pick abf09c6 baz

# Rebase 4d3fe72..abf09c6 onto 4d3fe72
#
# ...

在弹出的编辑器中对它们重新排序,以便bar成为第一个。

pick 71547ae bar
pick 498e4f4 foo
pick abf09c6 baz

# Rebase 4d3fe72..abf09c6 onto 4d3fe72
#
# ...

Git会旋转几秒钟并打嗝确认:

Successfully rebased and updated refs/heads/master.

现在您可以暂时回滚到bar提交(HEAD~2表示从HEAD返回两次提交)并提交它:

git checkout HEAD~2
git svn dcommit

如果你像我一样偏执狂,你可以先git svn dcommit -n确保你只是犯下你想要的东西。

现在跳回master

git checkout master

最后一点是rebase,以便master与svn:

同步
git svn rebase

对我来说这有点模糊,为什么这是必需的,但我猜测在一个独立的HEAD状态下提交与它有关。

答案 1 :(得分:13)

git svn dcommit无法有选择地提交bar。如果你在主分支上直接提交了foo,bar和baz,那么你必须执行以下操作才能获得svn中的bar。

假设bar的提交类似于13abc ......

和git log master显示所有3个提交foo,bar和baz。

  • 您需要从主

    创建分支

    git branch wip

wip分支现在有foo,bar和baz

  • 在任何foo,bar或baz之前将主人的头重置为提交。您可以使用git reset执行此操作(阅读手册,硬,软和混合选项之间的差异会影响工作树中未提交的更改)

    git reset --hard(foo,bar,baz之前的COMMIT-ID)

    (或)

    git reset - hard HEAD~3(返回3个版本)

现在你的主分支没有foo,bar或baz。用git log验证。

  • 现在你可以只选择你想要从wip分支转换为svn的提交到master。所以得到酒吧

    git cherry-pick wip 13abc(bar commit sha)

主人只能单独获得吧提交。

  • 现在git svn dcommit应该单独推杆。

建议的未来用法

因此对于git-svn,最好不要直接在跟踪远程svn的master分支上进行提交。在dcommiting之前,你可以在本地分支上进行工作并选择性地合并到master。

答案 2 :(得分:4)

我有一种狡猾的答案。您可以在其中创建一个包含foo,bar和baz的新分支,然后cherry-pick bar到新分支,然后git-svn dcommit分支并在完成后将其删除。但这似乎并不优雅。

所以假设foo,bar和baz在分支x中,而master不包含任何一个。

  

git branch y master

     

git checkout y

     

git cherry-pick <sha1 of bar>

     

git svn dcommit

     

git checkout x

     

git svn rebase

     

git branch -d y

如果master确实有这些提交,你可以像Sizzler建议的那样重置头部。

答案 3 :(得分:2)

我有时只想提交我的分支的一些提交。 E.g。

A-----B-----C------D  
^                  ^
|                  |
svn/trunk          trunk

如果我想提交BC但不提交D我会创建一个新分支,执行svn dcommit,切换回trunk并删除分支。

当我在分支trunk时,我做

git checkout -b temp `C`
git svn info // just to check that branch temp is properly connected to svn
git svn dcommit
git checkout trunk
git branch -D temp

修改

像Stefan评论的那样:

  

使用额外的'git svn rebase'对我来说效果很好。

这是必要的,因为提交给svn的提交将被重写。 git-svngit-svn-id添加到提交消息中,因此即使提交的内容相同,提交哈希也会更改。但由于内容相同,因此rebase不会引起冲突。

PS:我经常省略新分支,只是结帐分离。 E.g。

git checkout --detach C
git svn dcommit
git checkout trunk
git svn rebase