2016-03-29 19 views
2

テキストファイルをコミットしてマスターブランチにプッシュしました。 私の同僚は、マスターブランチとは別のブランチを作り、ファイルを変更しました。彼はテキストを改訂しました。変更は1回のコミットと1つのファイルで行われます。gitで選択した変更のみをマージする

ここで、マスターブランチの元のファイルに変更をマージします。しかし!私はすべてを受け入れたくはなく、変更のいくつかを受け入れたい。

同じファイルのさまざまな行に変更が加えられました。いくつかの行が変更され、いくつかが追加され、一部がリビジョンで削除されました。 どうすれば実現できますか?

私がgitを正しく理解していれば、マスターブランチに変更を加えていないため、リビジョンブランチをマスターに単純にマージすると競合が検出されません。 また、マージではブランチ/コミットのすべての変更が適用されます。しかし、私は20行、50行、69行の行に加えられた変更だけを適用したいと思います。私は他の変更を私がそれらに同意しないので無視したいと思います。

変更を受け入れるかどうかを選択できるように、変更されたすべてのファイルに対して競合が発生するようにするにはどうすればよいですか?私はいくつかの対話的な方法が必要です。

たとえば、MS Wordでは、変更を追跡することができます。そして、それぞれの変更が受け入れられる(新しいバージョンが取られ、古いものが取り除かれる)か、拒否される(古いバージョンが保持され、変更が破棄される)可能性があります。その後、変更は強調表示されなくなります。

私はgitバージョン1.9.5.msysgit.1で動作するMS Windows 10でTortoiseGitアプリケーションを使用しています。したがって、クライアントを使用する方法がある場合、私はそれを好むでしょう。

+0

[選択ファイルをgit-mergeとマージするにはどうすればいいですか?](http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge) –

答えて

0

私は変更を受け入れるかどうか選択することができますか? ...

マージを行うが、失敗したマージをふりと自動コミットしていない、ユーザーが点検する機会、さらに微調整を与えるために:ドキュメントは言う -

git merge --no-commit 

はこれを行いますコミットする前にマージ結果。

これは尋ねたことを行います。

しかし、あなたが望むものではないかもしれません。その結果、この状態になります:C'は本当にC内のすべての変更が含まれていませんが、あなたはgitのために嘘をついたので、あなたは再びそれをマージすることはできません

B  <sharg 
/\ 
A---B'--C' <master 
\ /
    C --/ <coworker 

。それは大丈夫ですか?

+0

これは、マージ後の多くの手動による修正と編集を意味するのではないかと心配しています。自分のバージョンや同僚を維持したい場合は、各変更についてインタラクティブに決定する方法が好きです。重要なことは、変更が同じファイルの行で行われ、さまざまなファイルで行なわれないことです。 – Sharg

+0

コミットされていない変更があったら、 'git add -p'を使って、保存する必要があるすべてのハンク(必要ならば行)のバージョンを表示したり、好みの(多分グラフィカルな)mergetoolを使うことができます。 – Useless

+0

実際、このアプローチは本当に私が必要としていたものと全く同じでした。 私は、同僚のブランチをコミット( '--no-commit')せずにマージし、以前のバージョン_で_diffを使用しました。私は現在の作業ツリーを編集する可能性のある変更を得ました。私は必要に応じて変更を加え、コミットしてプッシュしました。 お寄せいただきありがとうございます。 – Sharg

2

ここは私のために働いたものです。 testbranchブランチにインポートする変更があると仮定して(とあなたが上で動作するファイルと仮定するとREADMEです):

  • スタートmaster枝に:

    $ git checkout master 
    
  • 使用他のブランチからの変更 にもたらすgit checkoutから--patch引数:

    $ git checkout --patch testbranch README 
    

    git add -pと同じインターフェイスが表示され、 はチャンクを選択的に受け入れるかスキップすることができます。単一のコミットを話していたと仮定すると

+0

この提案は理にかなっています。私はパッチを試してみる。 – Sharg

1

、あなたはthatsのが送信されコミット取る必要があり、それをuncommit、その後、選択的に受け入れるように変化して選択することインタラクティブステージングを使用して行います。だから最初に進み、変更をマージしてください。次に...

git reset HEAD^ 
git add --interactive 

これは、メニューシステムにあなたをキックする。 「5」と入力してEnterキーを押すと、パッチ適用プロセスが開きます。変更されたファイルは、番号付きリストに表示されます。受け入れを検討したい番号を入力します。したがって、5つのファイルがあり、1,2,3、および5が欲しいと言うことができます。カンマで区切って入力するか、1-3,5を実行できます。入力したファイル番号を入力したら、Enterキーを押します。インターフェイスを使用すると、他のファイルを追加するかどうかを再度確認できます。追加番号を入力します。変更点検を開始する準備が整ったら、行を空白のままにしてEnterキーを押します。

今、gitが見つけることができる変更のそれぞれの "塊"をあなたに案内します。 "h"と入力すると、コマンドの一覧が表示されます。 「y」は変更を受け入れることを意味し、「n」は変更を受け入れないことを意味します。変更の塊が大きすぎる場合は、 "s"コマンドを使用して小さな塊に分割しようとすることができます。

すべてのファイルを読み終えたら、メニューシステムに戻ります。 "q"と打って、かなり押し込んでください。何がステージングされているか確認するにはgit statusを使用してください。

これで、受け入れた部分だけが含まれることを知り、変更をコミットできます。

関連する問題