2009-07-15 15 views
25

をマージ今のgitのsvnワークフロー - 機能ブランチと私は、次のワークフローでのgit-svnのを使用しています

git clone <SVN TRUNK URL> #done once 

その後、私は機能

git branch featureZ 
git checkout featureZ 
#make edits for featureZ 
git commit 

git checkout master 
git svn rebase # fetch changes from server 

git checkout featureZ #go back to branch 
#git merge master 
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below) 

#make edits for featureZ 
git commit #featureZ completed 

git checkout master 
git merge featureZ #getting featureZ onto master. Prepare to send to SVN 

git svn dcommit #push featureZ back to SVN 

に取り組む際にノートの今、いくつかの点I gitをmasterにマージすると、featureZブランチ内のすべての個々のコミットは、私と一緒に良いものとしてマージされます。

コミットメッセージは、「featureZとのマージ」として置き換えられます。これはmerge fmt msgで修正できます。

今私の質問は このワークフローに間違っていたり、世話を必要とするものがありますか?私はgit-svn manualで、git svnを使って作業するときにマージしないでください。ワークフローで私がやっていることは、彼らが言及していることですか?もしそうなら、どんな種類の問題が起こるでしょうか?一つのことは、私はSVNのメインラインを混乱させる何かをしたくないということです。

+5

btwとすると、 'git branch ..; git checkout'の代わりに' git checkout -b'を使うことができます。 'checkout'コマンドに' co'エイリアスを使うのも一般的です。 – jfs

答えて

26

SVNはノンリニアの履歴を扱うことはできません(単にノーテーションはありません)。だからあなたがしたいのは、SVNの線形履歴を保存するので、マージの代わりにリベース(これはgit-svnのmanページに示されています)

詳しくは、線形履歴は簡単です。 (AからBからC、BからD、次にC + DからE - つまり、それらは枝に芽を出す)

Rebaseを使うと、線形の履歴が得られます。リベースは、ローカルの専用ブランチから行う必要があります。例えば、masterとexperimentalの2つのブランチがある場合は、checkout実験を行い、 'git rebase master' -iフラグを指定します。逆の方法を使用すると、望ましくない副作用が生じる可能性があります。

これで、masterをチェックアウトし、experimentalブランチからの変更をマージします。あなたの履歴は線形のままです。

+0

非線形履歴とは何ですか?もう一つは、SVNが私がマージしたローカルブランチを持っていることを知る必要がある(気にしない)ことです。私のワークフローでrebaseを実行する必要があるのはどこですか? git rebase featureZ? – Pradeep

+0

私は私の答えを詳述しました。それが役に立てば幸い。 :) –

+0

説明をありがとう。私はこれまでに線形履歴のみを作成していましたが(線分自体は新しい)、非線形履歴は何かを理解しました。 これで、非線形履歴を準備するために、フィーチャーブランチからgit rebase masterを使用して、マスターからフィーチャーブランチへの変更を引き出しました。これは正常に動作します。それはマスターから私の支店への変更を引っ張って、その上に私のコミットを再生しました。 唯一の変更点は、ブランチからの "git merge master"の代わりに "git rebase master"を使用することです。 マスターブランチからの最後の "git merge featureZ"はokですか? – Pradeep

4

あなたはこのマージオプションをご覧ください:

git checkout master 
git merge --squash featureZ 

それはマスターブランチにコミットシングルに枝上のすべてのコミットをスカッシュします。ログメッセージを編集する機会が得られます。ログメッセージは、ブランチで行われたことの概要で初期化されます。

機能ブランチ上の個々のコミットが記録されないという欠点があります。さらに、これは一度だけ行う必要があり、適切なマージとして登録されていないため、その後のマージによって望ましくない結果が生じる可能性があるため、ブランチでこれ以上の作業を行わないようにしてください。

+0

スカッシュはブランチ履歴を破壊するため、推奨できません。私があなたに投票してもらえれば、私は(そして私は)そうするでしょう。 –

+1

ローカルのフィーチャーブランチの履歴をキャプチャしたくない場合、スカッシュは意味があります。私が望むならば、私が行ったすべての分岐を隠すメインライン上のSVNへの単一の太いコミットを送ることができました。 gitはそれを防ぐことはできません。おかげでロペス。 – Pradeep

+0

はい、それは間違いなくそれを使用していますが、私は歴史が貴重であると信じています。一番遠いのは、最も侵襲性の低い方法を使って軽く書き直すことです。スカッシュは非常に侵襲的です。あなたが行ったすべての変更と注文を破棄します。すべての間違いや、それらを修正するのに役立つ銀の裏地を隠します。それは人を消去し、あなたに非常に個人主義的な最終結果を与える(すなわち、その単一の脂肪コミット)。 しかしこれは私の最新の意見であり、あなたは私ではありません。だから、私はgitが柔軟であることが良いという点について同意する。 :) –

2

fake-code-monkey-rashidの回答が正しいです。これは答えが少なく、簡素化されています。

gitブランチからsvn rebase/dcommitを実行できます。唯一の使用マスターは、フィーチャーZからの変更をマージする必要がある他のローカル変更があった場合です。

git branch featureZ 
git checkout featureZ 
#bunch of changes 
git commit 
git svn rebase 
# solve any conflicts 
git svn dcommit 

あなたは、あなたがgit svn rebaseそれまたはその代わりにgit-SVNのgit merge featuresZ

0

いずれかのことができ、クリーンマスターを維持したい場合は、SubGitを使用することができます。これはSubversionとGitのリポジトリを自動的に同期させるサーバーサイドのツールです。

GitワークフローとGitクライアントを使用できます。追加のクライアントツールは必要ありません。

git branch featureZ 
git checkout featureZ 
# make edits for featureZ 
git commit 
git checkout master 

次のように作業を進めることができます:

  1. プッシュ機能ブランチを完全にあなたのシナリオを考慮

    git merge featureZ 
    git push origin refs/heads/* 
    
  2. マスター/トランクの上にフィーチャーブランチをリベースします。

    git rebase featureZ 
    git push 
    
  3. スワッシュは機能ブランチからコミットします。すぐに変化し、SubGitフックSubversionのリビジョンに変更を翻訳をプッシュするよう

    git merge --squash featureZ 
    git commit 
    git push 
    

いくつかの詳細は:多くの点で

  • SubGitのgit - SVNよりも優れている - のSubversionへのローカルアクセスを必要とするSubGitなど、より良いマージ追跡翻訳、たEOL & MIMEタイプのサポート、
  • リポジトリ(カスタムフックを使用します)。
  • SubGitは、いくつかの無料オプション(オープンソースおよびアカデミックプロジェクト、小規模チーム)を備えた製品です。
関連する問題