0

作業中のリポジトリを管理するために git を使用しています。

masterブランチは「メイン」プロジェクトです。ただし、主力製品と似ているが同じではない並行製品にも取り組んでいます。というブランチに住んでいますnewproject

コード ベースは 2 つの間で非常に似ていますが、newprojectより簡素化されており、コアの変更がいくつかあります。ただし、CSS、javascript などのウィンドウ ドレッシングの多くは、2 つのブランチ間で同じです。

一方で、newprojectブランチにまだ存在する多くのファイルを削除しましたmaster

ブランチを作成して機能を追加したり、バグを修正したりしてからマージするブランチの典型的なケースのように、これらのプロジェクトを一緒にマージしたくありませんmaster。これらのブランチは独立して永続的に存続します。

ただし、まだ重複/共有ファイルがある場所から修正masterを取得したいと考えています。newproject

私が単にそうするなら

$ git checkout newbranch
$ git pull origin master

削除されたすべてのファイルがまだ に存在するため、競合として表示されるため、大量の競合が発生しmasterます。

この状況を処理する方法はありますか?

4

2 に答える 2

1

gitサブモジュールが達成する効果は、まさにあなたが望むものです。複数のプロジェクトが依存する共通コードの本体であり、すべての依存プロジェクト間で共有される共通コードへの修正が含まれています。サブモジュールは、共有コードの履歴を分離することで効果を実現しますが、それは単なるメカニズムであり、一度それを見ると、それが自然に正しい解決策であることがわかります。

サブモジュールコマンド自体は、いくつかの厄介なハウスキーピングの詳細を追跡するために存在します(通常、rm -rf *リポジトリ内でコミットされた状態を失うことはありませんが、ネストされたリポジトリではそうではないため、コマンドは通常、サブモジュール.git dirsを持ち上げます;そのようなもの)、ただし、サブモジュール自体は、独自の履歴を持つネストされたリポジトリにすぎません。それにcdすると、gitコマンドはそれが何かのサブモジュールであることさえ知りません。なぜなら、サブモジュールであるということは、リポジトリ自体に固有のものではなく、リポジトリがどのように使用されているかということです。

  git init projectA
  cd projectA
  touch A            # now there's a file at the projectA root,
                     # but the projectA repo doesn't know about it
  echo 'this content is in file "A" at the projectA root'> A
  git add A          # content recorded, the index points to it
  git commit -m'A'   # now projectA repo has a permanent record of the indexed state


  git init projectInner  # now there's an entire repo at the projectA root,
                         # but the projectA repo doesn't know about it 
  cd projectInner
  echo "Inner content" > Inner   # a file at the inner repo, no repo knows about it
  git add Inner                  # content recorded, the inner repo's index records it
  git commit -mInner             # the inner repo has a permanent record


  cd ..
  git add projectInner   # now the projectA repo knows about the inner, the content is recorded ...
  git commit -mInner     # and now the projectA repo has a permanent record

git add実際のリポジトリを作成するということは、ファイルやディレクトリを追加する場合と同じように、現在の状態を記録することを意味しますが、ファイルの記録された状態はその内容全体であり、ディレクトリの記録された状態はそのすべての再帰的な状態です(追跡または無視されない)コンテンツの場合、レポの記録された状態は、単にそのHEADコミットのSHAであり、他のすべてはそのレポ自体にすでに記録されています。

ここでのペイロードは、gitサブモジュールが単にネストされたリポジトリであるということです。ネストされたリポジトリは非常に便利なものになる可能性があります。gitの他の部分と同様に、サブモジュールコマンドが実際に実行していることは非常に単純です。明らかに複雑なのは、非常に便利なさまざまな状況で最も便利なものを実装することです。

于 2013-02-22T20:28:19.140 に答える
0

after you have branched, you will be able to do a git rebase master on your new project branch to move it's separation point up to the HEAD of the master branch. what this will do is re-apply all of the diffs (which will be very easy and possibly have no major, if any, conflicts since most of the files are no longer in the newproject branch) from the newbranch separation point on top of the changes done to the master branch. Since the newproject commits include the removal of those files and other changes, everything should go smoothly (with hopefully not too many conflicts). Check out the rebasing info listed under the de-facto git book linked here.

于 2013-02-22T03:18:48.193 に答える