私はかなりのプロジェクトに携わり、多くの開発者がいます。ある機能の開発では、新しいブランチが作成されました(このブランチはfeature_a
と呼ばれます)。選択的なマージ/コンフリクトの解決
master
をfeature_a
にマージしようとすると、さまざまな "モジュール"に複数の競合があり、異なる開発者がこれらのモジュールを担当しています。
私が責任を持つファイルの競合を個別に解決し、他のファイルを結合解除したままにするにはどうすればよいですか?
私はかなりのプロジェクトに携わり、多くの開発者がいます。ある機能の開発では、新しいブランチが作成されました(このブランチはfeature_a
と呼ばれます)。選択的なマージ/コンフリクトの解決
master
をfeature_a
にマージしようとすると、さまざまな "モジュール"に複数の競合があり、異なる開発者がこれらのモジュールを担当しています。
私が責任を持つファイルの競合を個別に解決し、他のファイルを結合解除したままにするにはどうすればよいですか?
feature_a
の履歴を書き直して、各コミットが単一の開発者の責任であるコミットのリストに分割し、各開発者に「独自の」コードをmaster
にマージさせることができます。ここで
は、このアイデアのアウトラインです:最終結果は(たぶん)あなたが望むコンテンツですあなたはこの方法は、マージの順序で何を得る
# from branch feature_a :
# create a new branch :
$ git checkout -b merge_feature_a
# find commit where it forked from `master` :
$ git merge-base master feature_1
0125638
# reset current merge_feature_a to this commit :
$ git reset 0125638
# diff feature_a and merge-base to get the full list of modified files :
$ git diff --name-only 0125638 feature_a
# create first commit with files which are Mike's responsibility :
$ git add <files for Mike>
$ git commit -m "feature_a for Mike"
# same for Sally :
$ git add <files for Sally>
$ git commit -m "feature_a for Sally"
# etc ...
# push this new branch :
$ git push origin merge_feature_a
# tell Mike to merge first commit,
# when he's done tell Sally to merge second commit,
# etc ...
は、コミットします。
ボーナスポイント:参加コミットとしてこの内容が示されているように、マージプロセスが完了したら、あなたは歴史をいじることができます歴史の中で適切な場所に
をコミットマージを作成しますorignal master
ブランチと元feature_a
枝の両方:
# from master :
# rewind master to its state before any merge :
# use '--soft' to keep every modifications in the index
# (your next commit will have this content)
$ git reset --soft 1e67a9bb # <- insert the hash of the original master
# get the sha1 of the commit for feature_a :
$ git rev-parse feature_a
e9573881e2eff04d219e57dfd4d7739aa5c11693
# write this hash into '.git/MERGE_HEAD' :
$ git rev-parse feature_a > .git/MERGE_HEAD
# commit : the presence of the MERGE_HEAD file indicates a merge commit
$ git commit
はい、私は同じ行を考えていましたが、新しいブランチを作成しないようにしたいと考えていました。しかし、問題を解決します。これを詳細に説明していただきありがとうございます。 – schaazzz
は、あなたがそれらのファイルのために何かをコミットする必要があり、マージされていない他のファイルを残すことはできません。 Gitでは、コミットには_every_ファイルがリポジトリに含まれています。おそらくあなたが望むことができる最高のものは、他の開発者との共同作業と併合です。 –