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

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

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

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

Q&A

解決済

3回答

7435閲覧

Gitで特定のファイルに関連するcommitをそのファイルに関する変更だけ抜き出して別の孤立ブランチに書き出す方法はあるか

yumetodo

総合スコア5850

Git

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

0グッド

0クリップ

投稿2017/06/17 08:28

編集2017/06/17 15:55

表題の通りです。

特定のcommitを抜き出すのはcherry-pickなりrebaseでできますが、特定ファイルの履歴抜き出しは聞いたことがなく、また調べ方の問題か検索にもヒットしないので質問しました。

追記

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

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

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

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

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

guest

回答3

0

こんにちは。

私はTortoiseGitを使ってますので、TortoiseGit語で回答です。
cherry-pickして、cherry-pick先のコミットについて特定ファイルのみ残して「最後のコミットをやり直し」すればできます。

ついつい複数のブランチに分けるべき修正を1つのコミットにまとめてしまうことが時々あります。
つい先日、上記手順を必要なブランチ数だけ行うことで別ブランチへ分解できることが分かりました。
重複や漏れが発生しそうでちょっと怖いですけどね。

投稿2017/06/17 08:58

Chironian

総合スコア23272

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

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

yumetodo

2017/06/17 09:48

あーつまり全部手動でcherry-pickとrebaseしないといけない感じか・・・うーむ。 普通一つのファイルに対する編集履歴ってたくさんあるので辛い・・・
Chironian

2017/06/17 10:51

1つのファイルの多数の編集履歴ですか。1つ2つくらいかと思ってました。 多数の履歴は自動機能がないとかなり厳しいですね。 blameがあるのだから、あっても良さそうな気もしますが、すいません。知らないです。
yumetodo

2017/06/17 13:03

インタラクティブrebaseくらいの難易度で出来ても良さそうなんですけどねぇ・・・
Chironian

2017/06/17 14:13 編集

git filter-branchがもしかすると使えるかも知れません。 公式ページhttps://goo.gl/16s1Zgを見ると「プロジェクトの各チェックアウトに対して指定したコマンドを実行し、結果を再コミットします。」ということなので、「特定のファイル以外をコミット対象から外す」コマンドを作れたらできるかも。でも、かなり難しそう。 gitの考え方的には元のブランチは消えないと思います。念のため別ブランチを用意して試みるのもありと思います。
guest

0

自己解決

https://stackoverflow.com/questions/44605145/githow-to-extract-history-of-specific-files-and-write-out-to-new-empty-branc/44606125
でphd氏から「要らないファイルを消す方向でやろう」とのアドバイスを受け、BFG Repo-Cleanerというgit filter-branchより高速でかんたんなツールを使って目的のファイルのみ残し、git rebase --committer-date-is-author-dateでBFG Repo-Cleanerで作られた空commit(ファイルを消しても無変更になった空commitが残る)を削除しました。

git rebaseって空commitは無視するんですね、知らなかった。

お二人ともありがとうございました。

投稿2017/06/18 08:49

yumetodo

総合スコア5850

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

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

0

単に
「特定のファイルを特定のコミットの状態に変更したい」
ということであれば、

sh

1git checkout <コミットのハッシュ> <ファイル名>

で実現できます。

そうではなく、
「特定のファイルに、特定のコミットの変更をマージしたい」
ということであれば、以下のように一連のコマンドを実行するのが最もイメージに近いかと思います。

sh

1git cherry-pick --no-commit <コミットのハッシュ> 2git reset HEAD . 3git add <ファイル名> 4git checkout .

参考 : https://stackoverflow.com/a/5717615/6299234

投稿2017/06/17 14:38

KiyoshiMotoki

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問