26

複数のプッシュされていないgitコミットがある場合、それらのコミットの 1 つだけを行うことは可能git-svn dcommitですか?

たとえば、foo、bar、および baz をコミットしましたが、今は bar だけを svn リポジトリに配置したいと考えています。これは可能ですか?

4

4 に答える 4

27

(以下は、作業が進行中であることを前提としています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.

これで、一時的にコミットにロールバックしbarHEAD~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することはそれと関係があると思います。

于 2011-11-30T15:22:18.147 に答える
13

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 dcommit は bar だけをプッシュする必要があります。

推奨される将来の使用法

したがって、git-svn の場合、リモート svn を追跡している master ブランチで直接コミットしないことが望ましいです。dcommit する前に、ローカル ブランチで作業を行い、master に選択的にマージします。

于 2009-08-12T13:22:28.187 に答える
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

マスターにこれらのコミットがある場合は、Sizzler が提案するようにヘッドをリセットできます。

于 2009-08-10T17:36:29.540 に答える
2

ブランチのいくつかのコミットだけをコミットしたい場合があります。例えば

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

BコミットしたいCD新しいブランチを作成したくない場合は、 を実行し、ブランチに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 
于 2015-10-13T13:55:22.187 に答える