複数のプッシュされていないgit
コミットがある場合、それらのコミットの 1 つだけを行うことは可能git-svn dcommit
ですか?
たとえば、foo、bar、および baz をコミットしましたが、今は bar だけを svn リポジトリに配置したいと考えています。これは可能ですか?
(以下は、作業が進行中であることを前提としていますmaster
。)
まず、最後の3つのコミットを並べ替えて、それ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
から2つのコミットを意味しますHEAD
)、それをdcommitできます。
git checkout HEAD~2
git svn dcommit
あなたが私のように偏執的であるならば、あなたはあなたがgit svn dcommit -n
あなたが望むものだけをコミットしていることを確認するために最初に行うことができます。
ここで、に戻りますmaster
。
git checkout master
最後のビットはmaster
、svnと同期するようにリベースすることです。
git svn rebase
なぜこれが必要なのかは少し曖昧ですが、HEADを切り離した状態でdcommitすることはそれと関係があると思います。
git svn dcommit はバーを選択的にコミットできません。マスター ブランチで foo、bar、および baz を直接コミットした場合、svn で bar のみを取得するには、次の手順を実行する必要があります。
bar の commit sha が 13abc のようなものであると仮定します...
git log master には、foo、bar、baz の 3 つのコミットがすべて表示されます。
マスターからブランチを作成する必要があります
gitブランチワイプ
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 で確認します。
これで、svn に dcommit するコミットのみを wip ブランチから master にチェリー ピックできます。バーを取得するために
git cherry-pick wip 13abc (バーコミットの社)
マスターはバーのコミットのみを取得します。
推奨される将来の使用法
したがって、git-svn の場合、リモート svn を追跡している master ブランチで直接コミットしないことが望ましいです。dcommit する前に、ローカル ブランチで作業を行い、master に選択的にマージします。
私は一種の無愛想な答えを持っています。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
マスターにこれらのコミットがある場合は、Sizzler が提案するようにヘッドをリセットできます。
ブランチのいくつかのコミットだけをコミットしたい場合があります。例えば
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
編集
ステファンがコメントしたように:
追加の「git svn rebase」を使用すると、うまく機能しました。
svn にコミットされたコミットが書き換えられるため、これが必要です。git-svn
をコミット メッセージに追加するgit-svn-id
ため、コミットの内容が同じであってもコミット ハッシュが変更されます。ただし、内容は同じであるため、リベースによって競合が発生することはありません。
PS: また、新しいブランチを省略して、detached をチェックアウトすることもよくあります。例えば
git checkout --detach C
git svn dcommit
git checkout trunk
git svn rebase