git-svn dcommiting单个git提交

bau*_*ack 26 git git-svn

给定多次未git提交的提交,是否可以git-svn dcommit只提交其中一个提交?

例如,我已经提交了foo,bar和baz,但是现在我只希望在svn repo中结束吧.这可能吗?

Mar*_*ser 27

(以下假设您的工作正在进行中master.)

首先,重新排序最后三次提交,这bar是第一次.

git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)

编辑器会弹出如下内容:

pick 498e4f4 foo
pick 71547ae bar
pick abf09c6 baz

# Rebase 4d3fe72..abf09c6 onto 4d3fe72
#
# ...
Run Code Online (Sandbox Code Playgroud)

在弹出的编辑器中对它们重新排序,以便bar首先进行.

pick 71547ae bar
pick 498e4f4 foo
pick abf09c6 baz

# Rebase 4d3fe72..abf09c6 onto 4d3fe72
#
# ...
Run Code Online (Sandbox Code Playgroud)

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

Successfully rebased and updated refs/heads/master.
Run Code Online (Sandbox Code Playgroud)

现在,您可以暂时回滚到bar提交(HEAD~2意味着两次提交HEAD),并提交它:

git checkout HEAD~2
git svn dcommit
Run Code Online (Sandbox Code Playgroud)

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

现在跳回master:

git checkout master
Run Code Online (Sandbox Code Playgroud)

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

git svn rebase
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*eep 13

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

假设bar的commit sha就像是13abc ...

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

  • 你需要从master创建一个分支

    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分支转换为master的svn提交.得到吧

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

主人只能单独获得酒吧提交.

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

建议的未来用法

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


bau*_*ack 4

我有一种严厉的回答。您可以创建一个不包含 foo、bar 和 baz 的新分支,然后将cherry-pickbar 添加到新分支,然后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 的建议重置 head。