如果有多个未提交的git
提交,那么git-svn dcommit
只能提交其中一个提交吗?
e.g。我已经提交了foo,bar和baz,但是现在我只想在svn repo中结束吧。这可能吗?
答案 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,最好不要直接在跟踪远程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
如果我想提交B
和C
但不提交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-svn
将git-svn-id
添加到提交消息中,因此即使提交的内容相同,提交哈希也会更改。但由于内容相同,因此rebase不会引起冲突。
PS:我经常省略新分支,只是结帐分离。 E.g。
git checkout --detach C
git svn dcommit
git checkout trunk
git svn rebase