多くのファイルの名前を変更するブランチがあり、元のファイルが変更されたmaster
にリベースしようとしています(できれば、手動での競合解決の悪夢に陥ることはありません)。
JavaScriptプロジェクトをTypeScriptのローカルTypeScript
ブランチに移植しています。すべての.js
ファイルが.ts
ファイルになり、一部の構文がアップグレードされました。
その間、元の.js
ファイルへの変更がmaster
ブランチで行われました。
rebaseTypeScript
ブランチをmaster
にブランチしたい-しかし、変更がファイルとして正しくマージされない名前の変更は検出されませんでした。つまり、gitが削除されたと見なしている.js
ファイルに変更が加えられると、競合が発生します(ただし、実際には.ts
ファイルに名前が変更されています)。
Gitグラフ:
o-[TypeScript] .js files become .ts
|
| o-[master] changes to the .js files
| |
| o
|/
o-[root] common ancestor
したがって、root
ブランチに立っている間:
このコマンドを実行して、すべての名前変更を表示できます:git diff --name-status --find-renames=10% TypeScript
git merge コマンドに同じ種類の--find-renames
機能があることを理解していますが、うまく機能しません。
git merge -X find-renames=10% mybranch
は、予想される構文のようです。git rebasemightサポートfind-renames
機能を理解していますが、それがどのように使用されるかはまだわかりません。
(いいえ)おそらくroot
から、名前の変更を検出しながらTypeScript
にマージできます(このように:git merge -X find-renames=10% TypeScript
)。その場合、ルートはTypeScript
と同じですが、名前の変更(一括削除/追加ではなく)を除きます。
git rebase master
だけでいいのにと思います。名前の変更が行われているため、操作はスムーズに行われ、編集内容が正しいファイルに保存されます。(うん)おそらく、リベース自体はfind-renames
オプションで実行する必要があると思います。これについて調査しています...
git rebase -X find-renames=10% master
-いいえgit rebase -X --find-renames=10% master
-いいえgit rebase --find-renames=10% master
-いいえgit rebase -X recursive --find-renames=10% master
-いいえgit rebase --merge -X find-renames=10% master
-いいえgit rebase --strategy-option="rename-threshold=10" master
-それがチケットです!うまくいく!(いいえ)おそらく問題を別の方法で見る必要がありますか?多分私はmaster
から始めて、次にTypeScript
の名前を変更して検出する何らかのスカッシュマージを実行する必要があります(どのようなリベースよりも)。
TypeScript
ブランチの履歴は必要ありません。レビューのために1つのファットコミットにまとめられます。root
ブランチに立っているときは、 git merge -X find-renames=10 TypeScript
を実行すると、TypeScript
..に早送りされます(私が望んでいたものではないため、追加/削除ではなく名前が変更された新しいコミットを望んでいました。)master
ブランチに立っているときにを実行すると、まったく同じコマンド、gitはこれを教えてくれます:fatal: Unknown option for merge-recursive: -Xfind-renames=10
...git rebase --strategy-option="rename-threshold=10" master
編集:Git 2.8.0以降、「rename- threshold」は「find-renames」のために廃止されました。
現時点ではGit 2.7.4を使用しているため、上記のコマンドが私の場合に機能することを実際に確認することしかできませんでした。上記の場合、「find-renames」という用語を使用する必要があるかもしれません。新しいバージョンのGitではコマンドが機能しない...
この例では、
master
に基づいています10%
の名前変更しきい値が指定されているmaster
を元のファイルに変更すると、新しい(名前が変更された)ファイルに配置されます(git rebase master
だけを実行するのではなく)。git diff
、git log
、およびgit merge
コマンドにある同様の名前変更検出機能と比較して、構文がどのように異なるかに注意してくださいgit rebase のドキュメントは、特にこの名前変更検出の側面についてあまり明確ではありません。別のコマンドをどこかで読んだところ、「rename-threshold」という用語は廃止されましたが、このコンテキストではfind-renames
は同義語として機能していないようです-したがって、この同じコマンドを実行するより良い方法を誰かが知っている場合は、そのように述べてください:)