逆引きマニュアル: Git: 改行コードの変更が入ったコミットをマージする方法

投稿日:

やりたいこと

例えば以下のようなコミットがあります。

  1. ファイルAをコミット
  2. Aに対して変更Bを追加
  3. Aに対して変更Cを追加(以下同様)

この作業後に、Aの改行コードがCRLFになっていたのを気づいて、 LFに直したいときに、変更Bの前にCRLF→LFへの変更をコミットする方法です。 別に改行コードを最後に変換したのでもいいんですが、diffに^Mが入るのが嫌なんですよね。

前提条件

git 2.16.2で動作確認しています。

概要

.gitattributesファイルと、マージ戦略のオプションを指定します。

手順

  1. 変更Bを追加する前のコミットを起点に、ブランチを切ります。
  2. 改行のみ変更してコミットします。
  3. .gitattributesファイルを作成して次の行を追加します。既にある場合は追加します。
    • ファイル名 eol=lf
    • このファイルはコミットやステージに追加しないで構いません。
  4. 以下のコマンドを実行します。
    • git cherry-pick コミットのハッシュ --strategy-option=renormalize
  5. 複数のコミットがある場合はそれぞれcherry-pickを繰り返します。

これで意図した通りになっているブランチができます。

補足

--strategy=recursiveのオプションの説明をしているサイトもありますが、 現在のマージ戦略のデフォルトはrecursiveアルゴリズムのため、不要です1

また、--strategy-option=ignore-space-at-eolというオプションもありますが、 これは比較時に改行コードを無視するだけで、 マージ後はCRLFになってしまいます。


  1. man git-mergeより、This is the default merge strategy when pulling or merging one branch.と書かれている。 ↩︎

外部サイト

マニュアル

  • Git
  • merge: まだありません。
  • eol: まだありません。