3

サイトを見て回ったのですが、自分のことを完全に網羅した答えが見つかりませんでしたので、見落とした場合は事前に失礼します。

ソース管理のないVB.NETプロジェクトを継承し(これは昔からの開発者のペットプロジェクトとして始まり、その後は誰もそれを入れようとはしませんでした)、友人の提案により、Gitを使用することを考えました。ソース管理。

このプロジェクトは、顧客の仕様に応じてカスタマイズおよび販売されるニッチな製品であるため、コードの95%がすべての顧客で同じであっても、コードの最大10%が変更および調整される場合があるという問題が発生します。顧客ごとに、既存の関数に行を変更または追加し、コードのブロック全体を追加することもありますが、異なる顧客間の変更に共通点はありません(ある関数で変更された関数が別の関数で変更されない場合があります)。

さらに複雑なことに、メンテナンス契約により、ベースラインアプリに加えられた更新は、必要に応じて顧客のブランチに複製する必要があります。特定の顧客に対して行った変更で、ベースラインに入れたい場合もあります。アプリを作成して他の顧客に複製しますが、各顧客のカスタマイズは維持します。

ですから、Gitについての私の知識がほとんどないので、次のようになると思いました。

          (customer 1)
         C1-----
(main)  /
A------B------D
        \
         \ (customer 2)
         C2-----
        \
         \ (customer 3)      
         C3-----

...しかし、その後どのように機能するかわかりません:

  • その顧客にのみ役立つ他の変更をマージせずに、顧客のブランチからの一部の変更をメイントランクにマージできますか?
  • メイントランクからの一部の変更を、それらのブランチのカスタマイズを失うことなく、各顧客のブランチにマージできますか?
  • コードの特定の行を「マーク」して、マージ/コミットされないようにすることはできますか?
  • 3人以上の開発者がこれで作業し、それぞれが自分のマシンで作業しますが、同期のために会社のリポジトリに変更をプッシュします。このプロセスにはどのような影響がありますか?
  • 現在、すべての顧客は、すべてのソースコードを含む個別のフォルダと個別のプロジェクトファイルを持っています。それらのフォルダーをGitに配置するためのインポートプロセスはどのようになりますか?
  • これはすべて、Visual Studio、Gitextensions、およびVS用のGitSourceプロバイダーを使用して実行する必要があります。サポートされていますか、それともコンソールで実行する必要がありますか?

別の回答と重複する場合は、ありがとうございます。

4

1 に答える 1

0

私はgitに比較的慣れておらず、通常はすべての操作にPoshGitを使用しているため、すべてを支援することはできないかもしれませんが、いくつかのことを支援できることを願っています。

  • その顧客にのみ役立つ他の変更をマージせずに、顧客のブランチからの一部の変更をメイントランクにマージできますか?
  • メイントランクからの一部の変更を、それらのブランチのカスタマイズを失うことなく、各顧客のブランチにマージできますか?

私が理解していることから、これらの操作は両方ともgitcherry pickを使用することで実現できます。これにより、あるブランチから特定のコミットを選択し、ブランチをマージせずに別のブランチに追加できます。

たとえば、customer1のリポジトリに加えられた変更をcustomer2に追加するとします。

まず、customer2に挿入するcustomer1からコミットのハッシュIDを取得します

git checkout customer1Branch
git log 

commit 2e8c40025939e8cf41dec70f213da75aa462184b
Author: xxxxxxx
Date: xxxxxx

This made a change that you want...

次に、チェリーピックするハッシュの最初の数文字をコピーし、顧客2のブランチに変更して、チェリーピックしてブランチに入れます。

git checkout customer2Branch
git cherry-pick 2e8c40025939e8c

さて、を実行するgit logと、上部にチェリーピックが表示されます。同様のチュートリアルがここにあります(http://nathanhoad.net/how-to-cherry-pick-changes-with-git

  • コードの特定の行を「マーク」して、マージ/コミットされないようにすることはできますか?

あなたはここで尋ねられて答えられた同様の質問から助けを見つけるかもしれません:

Gitでファイルの一部のみをコミットする

  • 3人以上の開発者がこれで作業し、それぞれが自分のマシンで作業しますが、同期のために会社のリポジトリに変更をプッシュします。このプロセスにはどのような影響がありますか?

GITは完全に分散されたVCSであるため、チームの各開発者は、自分のマシンに中央リポジトリの完全なクローンを効果的に持つことができます(そのリポジトリの完全な履歴が含まれます)。これは、ログ履歴クエリやその他のリクエスト(検索など)を意味します。誰が何をしたか)中央サーバーを経由する必要はありませんが、各開発者がプライベートにオフラインで実行できます。

同様に、各開発者が行った変更はすべてのユーザーが利用できるようになります(たとえば、すべての新しいブランチが利用可能になります)が、gitにあまり慣れていない場合は、同じ機能で作業するのが面倒になることがあります。

いつものように、早い段階で頻繁にコミットすることをお勧めします。これにより、変更が衝突したときに直面する可能性のある緊張が緩和されます。また、特にお互いの作業を継続することに依存している場合は、プッシュが実行されるときに何らかの構造を設定する必要があります。

試してみたいもう1つのアイデアは、リポジトリの担当者を1人にして、変更とパッチをマージして作業を調整することです。

  • 現在、すべての顧客は、すべてのソースコードを含む個別のフォルダと個別のプロジェクトファイルを持っています。それらのフォルダーをGitに配置するためのインポートプロセスはどのようになりますか?

編集

この質問の意味を明確にしていただきありがとうございます。ここで与えられた答えから適応された同様のアプローチを拡張することができます:リモートGitブランチをどのように作成しますか?

BASEプロジェクトの新しいメインラインブランチを作成し、リモートリポジトリにプッシュします。

cd baseProjectDirectory # navigate to your main project directory
git init # git initialize the dir
git add . # recursively add all files in directory to git repo
git remote add <remote-branch-name> <remote-url> # Add the url to your remote directory to your git repo
git commit -m "Initial commit of base project"
git push <remote-branch-name> <local-branch-name>

remote-branch-nameこれにより、というブランチの下にあるリモートリポジトリにベースラインプロジェクトが確立されますlocal-branch-name

次に、他のプロジェクトに移動し、新しいローカルブランチ名を使用して、リポジトリを同じリモートの異なるブランチに配置して、これらの手順を繰り返すことができます。つまりlocal-branch-name、ブランチを作成するときにを使用する代わりに、次のような新しいブランチ名を使用します。git checkout -b new-local-branch-name

たとえば、ベースプロジェクトのプッシュ(コードの最後の行)が次の場合:

git push clientproject base

「clientproject」がリモートの名前であり、「base」がローカルブランチの名前である場合、行を次のように変更できます。

git checkout -b client1 # Creates new branch named client1
git branch -d base # Deletes base branch
git push clientproject client1

続行する前に「base」ブランチを削除する必要は厳密にはありませんが、リポジトリをクリーンに保つことができるため、良い習慣と見なされていることに注意してください。ただし、何も失われる心配はありません。ベースからのgit履歴全体が、チェックアウト時にclient1にコピーされます。

また、注意:状況によっては別のディレクトリからこれを行う必要があるため、「base」ではなく「master」という名前のブランチを削除する可能性があります。

このようにプッシュすると、client1は「clientproject」リモートに保持されますが、プロジェクトは、独自の履歴を備えたclient1という新しいブランチの下に配置されます。

残りのプロジェクトでも同じ手順を使用できます。途中であなたを失った場合は、上記のリンクを読むことをお勧めします(私よりもはるかに簡潔です)。

  • これはすべて、Visual Studio、Gitextensions、およびVS用のGitSourceプロバイダーを使用して実行する必要があります。サポートされていますか、それともコンソールで実行する必要がありますか?

私はまだVSをGitで使用していませんが、これらの操作はすべてネイティブのgitコマンドであるため、すべてではないにしてもほとんどの操作がサポートされると思います。

お役に立てれば。

于 2013-02-02T09:28:15.487 に答える