質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

git-flow

git-flowとは、gitのブランチモデルを使う時の補助ツールです。gitを使う際のブランチ作成などで、一定のルールをまとめたものを指します。

Q&A

解決済

2回答

7289閲覧

Gitのチェリーピックを使うと必ずコンフリクトが起きる

patapata5050

総合スコア34

SourceTree

SourceTreeは、Gitのクライアントツール。視覚的に操作するGUI形式でGitの操作が容易になります。MacやWindowsなどのOSに依存しておらず、PC環境に合わせてインストールすることが可能です。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

git-flow

git-flowとは、gitのブランチモデルを使う時の補助ツールです。gitを使う際のブランチ作成などで、一定のルールをまとめたものを指します。

0グッド

0クリップ

投稿2018/01/29 09:31

実現したいこと

現在Git-Flowで運用しています。(SourceTree使用)
DevelopにA機能・B機能・C機能がコミットされているのですが、一旦B機能だけリリースすることになり
MasterにB機能だけマージしたいと思っています。

そこでチェリーピックを使いB機能のコミットだけマージしようとしましたが、必ずコンフリクトが起きてしまいます。

まずチェリーピックの使い方が合っているのか試したかったので、
テスト用のリポジトリを作成してDevelopにて下記のようなコミットをしてプッシュしました。

説明      ID
機能1追加   hoge1
機能2追加   hoge2
機能3追加   hoge3

そしてMasterにチェックアウトし「hoge2」のコミット上で右クリック「チェリーピック」を選択
すると下記のようなエラーが表示されます。

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree cherry-pick hoge2 error: could not apply hoge... 機能2追加 hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit' Completed with errors, see above

コンフリクト確認の為ソースを表示しても毎回、HEAD部分が空でコンフリクトが起きてしまいます。

HTML

1<main> 2<<<<<<< HEAD 3======= 4 <ul> 5 <li>機能1</li> 6 <li>機能2</li> 7 </ul> 8>>>>>>> hoge... 機能2追加 9</main>

コンフリクトが起きないような形で実行することは出来ないでしょうか。(毎回手動で修正はかなり手間がかかる為)
また、コマンドベースで試しても同様のコンフリクトが起きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/01/30 03:20 編集

git コミットID の関連がわかりにくいので、テスト用のリポジトリあって公開が可能であれば、「git log --graph --all --format="%x09%C(yellow)%h %C(cyan)%d%Creset %s"」を実行した際のような コミットIDの関連性がわかるログを記載してもらうことは可能でしょうか?
patapata5050

2018/01/30 05:37 編集

コメントありがとうございます。 解決しましたので閉じたいと思います。 今後リポジトリの公開など、わかりやすく質問できればと思います!
guest

回答2

0

ベストアンサー

こんにちは。

cherry-pick対象のコミットの差分がそれ以前のコミットの変更箇所に依存している場合、競合を解決できないためこの状態になります。

仮にMasterの状態が、

<main> </main>

であるとして、B機能のコミット時点でmainの間に何かが追記されているのではないでしょうか。


以下のようなテキストファイルを例にします。

0 1 2 3 4 BBB CCC 5 6 7 8 9 AAA

数字のみのファイルをmasterとして、AAA,BBB,CCCの順で追記してコミットしたものと見てください。
このときAとBはmasterにcherry-pickできますが、Cは競合します。Cの差分情報はBに依存しているからです。
Cが競合したときの状態は以下のようになります。

3 4 <<<<<<< HEAD ======= BBB CCC >>>>>>> 8fe981b... c 5 6

cherry-pickしていないはずのBの差分が紛れ込んでいますね。
というわけで、この状態のcherry-pickは手動できっちり競合解決してやらないと、ぶっ壊れます。自動化は難しいのではないかと思われます。

投稿2018/01/30 03:55

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

patapata5050

2018/01/30 05:34

なるほど!そういうことだったのですね! CがBに依存していると理解出来ていませんでした。 ということはソースにもよりますが、cherry-pickでコンフリクトは割りと頻繁に起きそうな気がしますね... 回答ありがとうございました!
guest

0

git cherry-pick -Xtheirs hoge1とすればマージしようとする側(hoge1側)を強制的に優先するのでコンフリクトは起きません。
当然ですが上のコマンドだと衝突が発生すべき場所で衝突が発生しないので、マージされる側で行った変更が消滅してしまう可能性が出てきます。注意して使ってください。

投稿2018/01/29 10:54

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

patapata5050

2018/01/30 00:06

回答ありがとうございます。 なるほど、そういった解決方法もあるんですね! 今回の場合HEAD側が空なので、そもそもコンフリクトが起きるのがおかしいと思っているのですが、チェリーピックでは必ずコンフリクトが起きてしまうものなのでしょうか・・・?
yumetodo

2018/01/30 02:49

>チェリーピックでは必ずコンフリクトが起きてしまうものなのでしょうか・・・? そんなことはない
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問