给定多次未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,最好不要直接在跟踪远程svn的master分支上进行提交.在dcommiting之前,在本地分支上进行工作并选择性地合并到master.
我有一种严厉的回答。您可以创建一个不包含 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。
| 归档时间: |
|
| 查看次数: |
6223 次 |
| 最近记录: |