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

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

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

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

git-flow

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

Q&A

解決済

2回答

469閲覧

Git 自分の他のブランチの変更を使用したい時

masaosan18

総合スコア64

Git

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

git-flow

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

0グッド

0クリップ

投稿2022/04/14 02:28

質問

あるブランチAでPRを作成した状態で、ブランチBで他の実装を進めていこうと思っています。
ブランチBにはブランチAで実装したファイルを一部使用したいと考えていますが、
この場合、皆さんはどのように実装をしていくのでしょうか?

考えたこと

1、ブランチAで実装したファイルの一部をコピーしてきてブランチBにペーストして使う
2、ブランチAからそのままブランチBをcheckoutしてしまって作業を始める

どのように作業を開始するのが良いか教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ケースバイケースとは言いますが、
基本的には後者の「ブランチAからそのままブランチBをcheckoutしてしまって作業を始める」を採用してください。
企業内でやっているならレビュワー(先輩・上司等)に一言その旨を伝えるようにしてください。

何故そうなるのか?
ブランチAは何らかのレビューを受けて改修はあるかもしれないが、
そのうちブランチAの修正内容はmasterに取り込まれるからです。
えっ、取り込まれる予定がない?それこそ無駄な仕事では???ってなってしまいますからね。

チェリーピックで1個のファイルのコミットだけ抽出して……とかやると
「それ正常動作する保証あるん?テストしたんか?」という話になるわけで
1個のファイルを抜き出すメリットとデメリット(正常動作しなくなるリスク)が全く噛み合ってません。
無駄な作業だらけになるので、結果的にブランチAの最終結果を全て使った方が楽です。

もしかするとブランチAはレビュー→修正作業を経て別物になってしまうかもしれません。

その場合、ブランチAはコミットを中に詰め込むのではなく、上に積み上げるようにしましょう。
そうすればブランチBにはrebaseで簡単に下に滑り込ませる事ができるので、
ブランチAの最終結果の上にブランチBがあるんだぞという状態を維持できます。

こんな感じのコマンドの遷移になります。
giit add .のあたりは私がファイル名を知らないから適当に書いてますが、
ちゃんとgiit diff [ファイル名]git add [ファイル名]を繰り返して確認するようにしましょう。

bash

1$ git branch 2 branch-a 3* branch-b 4 5# ブランチAでレビュー内容を取り込む必要が出てきた 6$ git add . 7$ git commit -m "tmp" 8$ git checkout branch-a 9 10# ブランチAの改修作業完了 11$ git add . 12$ git commit -m "Import review content" 13$ git push origin branch-a 14 15# ブランチBにAの内容をすべりこませる 16$ git checkout branch-b 17$ giit rebase branch-a 18 19# もしコンフリクトが出たら 20$ git status 21$ vim [対象のファイル] 22$ git add . 23$ git rebase --continue 24 25# tmpコミット履歴を抽出 26$ git log 27$ git reset [コミットのハッシュID] 28$ git status

投稿2022/04/14 08:23

miyabi-sun

総合スコア21158

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

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

masaosan18

2022/04/15 00:21

とてもわかりやすい説明ありがとうございます! >ブランチAはコミットを中に詰め込むのではなく、上に積み上げるようにしましょう。 この部分がいまいちわからなかったのですが、branchAに修正が入りしだい、branchBにその変更を取り込めば良い、という解釈であっておりますか?
miyabi-sun

2022/04/15 03:37

Gitはコミット履歴を上に追加追加で積み上げる使い方をするものですが、 「クソみたいなコミット履歴を積み上げたくないよね」という発想も出来るわけですね。 RPGで例えると「ボスは何とか撃破したが仲間が複数人死んで経験値が入らなかった、ドロップもひどい」みたいな。 ブランチを作るって一つの目的を達成する為に作るわけですから、100点満点のコミット1個だけ上に乗っていれば美しくないですか? そういう時、1個前のコミット履歴に戻って更に完成度の高いコミット履歴を作るテクニックが存在します。 一つが積み上げた2個以上のコミット履歴を潰して1個にする方法 https://techblog.recochoku.jp/2238 もう一つが直前のコミット履歴に、今のステージに入っている変更を含めてしまう方法 https://tech-blog.rakus.co.jp/entry/20191113/git これらのテクニックは「コミット履歴の改ざん」と呼ばれる方法で 勝手にコミット履歴をダルマ落としのように抜き取ってしまいます。 それはコミット履歴を上に積み上げていくGitの構想が崩壊しかねない危険な行為となります。 masterやdevelopといった複数人に共有するブランチに取り込まれたコミット履歴は絶対に改ざんするな! でも今回のmasterから「ブランチA」修正として「上に積み上げたコミット履歴」に関しては改ざんしてもまだ許される(被害者が誰も居ないので) そしてブランチAを基点にブランチBを生やして追加の作業をするのであれば、 ブランチAもmasterやdevelopに相当の存在と認識して取り扱った方良いよねって話です。
masaosan18

2022/04/15 06:29

ありがとうございます!
guest

0

場合によります。

  1. branch B が branch A の修正前提のものなら branch A から checkout するでしょう

そうではなく、masterからcheckoutすべきものなら、masterからcheckoutし
2. 利用したい修正が その部分だけで完結しているものであるなら、その修正のcommitを cherry-pick するでしょう
3. そういう独立したcommitがないなら、branch Bのmergeで衝突が起きるかもしれないのを覚悟の上でコピペするでしょう。

投稿2022/04/14 03:49

winterboum

総合スコア23329

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

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

masaosan18

2022/04/14 08:03

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問