6

私には2つのブランチAとBがあります。私がやりたいのは、Aの現在の状態を親としてAに新しい(マージ)コミットを作成することです。これは、Bによって記述されたファイルツリーを参照し、Aから何かを破棄します。 Bは1つのコミットに押しつぶされる必要があります。

具体的なリポジトリの状態は、2つの独立したブランチで構成されます。これらのブランチには、共通の祖先(2つの以前は独立したリポジトリからのもの)はありませんが、同じコンテンツを記述しています。今、私はそれらをまとめるための「git」方法を見つけたいと思います。基本的な解決策(gitなし)は、Aをチェックアウトし、Bのコンテンツを作業ツリーにコピーしてaを実行することgit commitです。これは基本的に、2番目のリポジトリのコンテンツを最初のリポジトリに伝播するために以前に行ったことです。

gitでそれを行うために私は試しました

git checkout A
git merge --squash B

しかし、残念ながら、AとBで異なるすべてのファイルに対してマージの競合が発生しました。これは、私が期待したものとは明らかに異なります。

基本的には

git merge --squash -s theirs

仕事をする必要がありますが、マージ戦略theirsは存在しません。ドキュメントを読むと、次のようなものを使用する可能性が示されます

git merge -X theirs

これは、マージ戦略のオプションrecursiveです。ただし、これでも競合しないチャンクのマージは行われます。競合するチャンクのみがから直接取得されtheirsます。

4

1 に答える 1

2

あなたがコメントするように、私が「あるブランチを別のブランチのようにするためのgitコマンド」にリストしているすべてのマージ-それらの戦略から、2番目のオプションはあなたが必要とするものに近いです:

最初の親として私たちのものを使用して、マージとして表示されます。
jcwengerによって提案されました)

git checkout -b tmp upstream
git merge -s ours thebranch         # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp               # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined the branch from upstream" # make the commit.
git branch -D tmp                    # deleting tmp
于 2012-08-03T11:27:50.753 に答える