あなたは、あなたにあなたの上流のブランチをマージすることができdev
て、枝カスタムマージドライバ「keepTheirs」:
参照してください「『git merge -s theirs
』必要-私はそれが存在しません知っています」。
あなたの場合、.gitattributes
必要なのは1つだけで、次のkeepTheirs
ようなスクリプトが必要です。
mv -f $3 $2
exit 0
git merge --strategy=theirs
シミュレーション#1
アップストリームを最初の親として、マージとして表示されます。
Jefromiはmerge -s ours
、アップストリーム(またはアップストリームから開始する一時ブランチ)で作業をマージし、そのマージの結果にブランチを早送りすることで、(コメントで)言及しています。
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
これには、アップストリームの祖先を最初の親として記録するという利点があります。そのため、マージは、「このトピックブランチを破棄してアップストリームに置き換える」のではなく、「この古いトピックブランチを吸収する」ことを意味します。
(2011年編集):
このワークフローは、OPによってこのブログ投稿で報告されています:
なぜこれがまた欲しいのですか?
私のレポジトリがパブリックバージョンとは関係がない限り、これはすべて問題ありませんでしたが、今から他のチームメンバーや外部の貢献者とWIPでコラボレーションできるようにしたいので、パブリックブランチが他の人が分岐してプルするのに信頼性があります。つまり、リモートバックアップにプッシュしたものをリベースしたりリセットしたりする必要はありません。これは、GitHubとパブリックにあるためです。
だから、それは私がどのように進むべきかを私に残します。
99%の確率でコピーがアップストリームマスターに送られるので、ほとんどの場合、マスターを操作してアップストリームにプッシュしたいと思います。
しかし、時々、私が持っているwip
ものは上流に入るものによって無効になり、私は私の一部を放棄しwip
ます。
その時点で、マスターをアップストリームと同期させたいのですが、公開されているマスターのコミットポイントを破棄したくありません。つまり、コピーをアップストリームと同一にするチェンジセットで終わるアップストリームとのマージが必要です。
そして、それがgit merge --strategy=theirs
すべきことです。
git merge --strategy=theirs
シミュレーション#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 thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs
シミュレーション#3
このブログ投稿は言及しています:
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
履歴に「がらくた」があるためではなく、リベースを回避する必要があるパブリックリポジトリでの開発のベースラインを変更したい場合は、これを実行したい場合があります。
git merge --strategy=theirs
シミュレーション#4
(同じブログ投稿)
あるいは、ローカルのアップストリームブランチを早送り可能に保ちたい場合、潜在的な妥協案は、sid / unstableの場合、アップストリームブランチが時々リセット/リベースされる可能性があることを理解して作業することです(最終的にアウトになるイベントに基づいて)上流プロジェクト側のあなたのコントロールの)。
これは大したことではなく、この仮定を使用すると、ローカルのアップストリームブランチを早送りの更新のみが必要な状態に保つのが簡単になります。
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs
シミュレーション#5
(バラクA.パールマターによって提案された):
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs
シミュレーション#6
(同じMichael Gebetsroitherによって提案されました):
Michael Gebetsroitherは、私が「不正行為をしている」と主張して、チャイムを鳴らしました;)そして、より低いレベルの配管コマンドで別の解決策を与えました:
(git onlyコマンドでそれが不可能な場合はgitではありません。diff/ patch / applyを使用したgitのすべてが実際の解決策ではありません;)。
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs
シミュレーション#7
必要な手順は次のように説明できます。
- ワークツリーをアップストリームに置き換えます
- インデックスに変更を適用します
- 2番目の親としてアップストリームを追加します
- コミット
このコマンドgit read-tree
は、インデックスを別のツリーで上書きして2番目のステップを実行し、作業ツリーを更新して最初のステップを実行するためのフラグを持っています。コミットするとき、gitは.git / MERGE_HEADのSHA1を2番目の親として使用するため、これを設定してマージコミットを作成できます。したがって、これは次の方法で実現できます。
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit