7

gitとgit-hubで2つの別々の、しかし非常に類似したコードベースを処理するための最良の方法は何ですか?

バックグラウンド

小さなシェルスクリプトプロジェクト用のgitリポジトリがあります。コードのファイルは2つか3つしかなく、私は1つのファイルで作業することがよくあります。私はもともと自分の特定の目標を達成するためにプロジェクトを作成しましたが、他の人にとってより一般的に役立つように書いています。私は一般的なユースケースバージョンを作成し、それを自分の特定の目標に固有になるように変更します。特定のバージョンでは、変数を変更したり、パスワードを入力したり、一部のコードの順序を切り替えたり、forループを取り出したりする場合があります。

何を試したか

私は2つの異なる方法を試しましたが、どちらも私が思うほど最適には機能しませんでした。

  1. 2つの別々のリポジトリ
    • 問題:コードが1つに変更され、他のコードに簡単かつ選択的にマージできない
  2. 1つのリポジトリに2つのブランチ
    • 問題:ブランチは、最終的にはマージして戻されるようになっています。これらを完全にマージするのではなく、コードの一部を選択的にマージすることを意味します。
    • 問題:ブランチ間でマージコマンドを使用しようとすると、どのブランチのどのコードがマージされているかについて非常に簡単に混乱することがわかりました。どういうわけか、完全に意図しない2つのコードをマージしましたが、両方のブランチのファイルの内容を確認するまで、誤ったマージの兆候はありませんでした。

また、 2つの別々の(しかし類似した)コードベースを1つのSVN担当者にマージする方法も見ました。それはSVNについてです。私はSVNを知らないので、フォローするのは難しいです。彼はこのコードの1つのバージョンを公開しようとしていないので、それは別の質問だと思います。

解決したいユースケース

具体的には、次の場合に問題が明らかになります。

  • コメントの同期-専用バージョンを準備していますが、行の最後に説明的なコメントを追加できることに気付きました。追加しましたが、コメントは一般版ではありません。
  • 共有したくないもの-専用バージョンを準備していて、パスワードを追加するか、操作の実行順序を変更します。これらの変更が一般化されたバージョンに移行することは望ましくありません。
  • 同じファイル-上記の2つの変更は同じファイルに含まれることが多いため、それらをマージするのは困難です。インタラクティブなマージがありますが、1つのファイル内でインタラクションを実行できるかどうかはわかりません。
  • General-> Specialized-私または他の誰かが、一般化されたバージョンを更新して、私の専門的なバージョンにも役立つ新しいコンテンツまたはコメントを含めることができます。スペシャライズドバージョンの他のコードの違いを台無しにすることなく、これらを一般->スペシャライズドから持ち込みたいと思います。

GitとGithub

ほとんどの場合、私の質問は、gitの範囲内でこれを行う方法を考えています。ただし、githubとの対話方法にも影響を与える可能性があります。私の一般化されたバージョンはgithubにあります。専用バージョンはgithubにアップしないでください。上記の私のブランチメソッドは、注意すれば両方のブランチをプッシュしなかったと思います...しかし、私はいつも確信が持てませんでしたいずれにせよ、ソリューションでは、公開されているバージョンと、ローカルに保持されているバージョンが1つあるようにする必要があります...少し複雑であるか、注意が必要な場合でも。

4

4 に答える 4

5

これは、2つのブランチで簡単に実行できます。Gitではマージが非常に簡単であるため、「コードが1つで変更され、簡単かつ選択的に他のコードにマージできない」と言う理由がわかりません。

私が提案する構造は、一般バージョン用のブランチと個人バージョン用のブランチを持つことです。マージは、一般的なブランチから個人的なブランチへの一方向でのみ発生する必要があります。これは、一般バージョンに加えた変更が個人バージョンに組み込まれることを意味します。

言い換えれば、これはOKです...

git checkout personal
git merge general

これは絶対にやるべきではありません...

git checkout general
git merge personal

個人用バージョンに変更を加え、一般バージョンに同じコードを含めるのが賢明であると判断した場合は、チェリーピックを使用してこれをかなり簡単に処理できるはずです。個人のブランチでコミットを整理するには、少し先見の明が必要です。一般バージョンに持ち込みたい変更のみを含む個人ブランチでのコミットが必要になります。次に、個人ブランチからチェリーを選択して、一般ブランチにドロップします。

2つのリポジトリで同じことを実行できます。これにより、個人バージョンを誤ってGithubにアップロードするリスクが軽減されますが、2つの異なるバージョンでの作業がより面倒になります。

個人的には、同じリポジトリに2つのブランチを配置します。

于 2011-11-07T15:13:57.990 に答える
1

専用バージョンをgithubにプッシュしないようにするには、構成push.defaulttracking(またはupstreamgit> = 1.7.4.2の場合)に設定します。厄介な詳細については、 http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/を参照してください。

マージは、別のリポジトリを使用する場合でも、単なるブランチを使用する場合でも、同じように機能するはずです。高レベルの答えとして、最終的にはマージが本当に上手になる必要があります。その多くは、分岐、マージ、リベースに関してgitが低レベルでどのように機能するかを実際に掘り下げることから生まれます。他のいくつかのバージョン管理システムとは異なり、gitを実際に適切に使用するには、その内部を深く理解する必要があることがわかりました。

于 2011-11-06T19:49:10.520 に答える
1

次に、 2つのブランチを使用するというアイデアを紹介します。一般バージョン用のパブリックブランチ(GitHubにプッシュされる)と、特殊なコード用のプライベートブランチ(GitHubで公開されていない)です。git stashただし、これは、概説したシナリオでやりたいことを実行できるようにするための不可欠なツールであると付け加えたいと思います(個人バージョンで作業している最中で、変更が必要であることがわかります)。一般版では)。

常に一般的なブランチに一般的な変更を実装してから、

git checkout personal
git merge general

これで、さらに、 ;を便利に使用できるようになりました。 git stash専用バージョンを更新し、一般的な変更について考えているシナリオを考えてみましょう。

  1. 現在の変更を専用バージョンに保存します。

    git stash
    

    これにより、新しいコミットを作成せずに、最後のコミットと比較した変更が隠されます。これは、進行中のコミットされていない作業を保存するのに役立ちます。

  2. あなたはあなたが考えていた一般的な変更を行うために一般的なブランチに行きます:

    git checkout general  # or master, or whatever name your general branch has
    

    その後、一般的な変更を実装して、通常どおりにコミットできます。

  3. 専用バージョンでの作業を再開する前に、一般的な変更をインポートします。

    git checkout personal
    git merge general
    

    gitはこれをうまく行うのに十分インテリジェントです。コードに対しては、最新の一般的に有用な更新のみを行う必要があります。

  4. 保留中の作業をインポートして、専門のブランチでの作業を再開します。

    git stash pop
    

それで全部です!重要なのはgit stash、このためだけにコミットを作成せずに、作業の途中で変更を保存するために使用し、次にで変更を適用することgit stash popです。

于 2011-11-07T15:28:21.363 に答える
0

gitサブモジュールを使用します。サブモジュールの個別のブランチを保持する場合は、そのプロジェクトのリポジトリにブランチを作成し、すべての変更をそのブランチにローカルに保持し、サブモジュールのチェックアウトでそのブランチのみを使用します。

異なる変更セット間のマージは、半分手動で行う必要があるものです。Gitは優れたマージサポートを備えており、2つのブランチを互いに離れすぎないようにすれば、最小限の手動介入で取得できるはずです。github(または他のホスティングプロバイダー)は、実際にはこれとは何の関係もありません。ブランチをプライベートにしておきたい場合は、パブリックリポジトリにプッシュしないでください。そのような単純な。

于 2011-11-06T19:28:49.570 に答える