スクリプトのリベースを試みていますが、リベースによって競合が発生するかどうかによって、スクリプトのパスが異なります。
リベースを実行する前に、リベースによって競合が発生するかどうかを判断する方法はありますか?
執筆時点(Git v2.6.1 v2.10.0)、git rebase
コマンドには--dry-run
オプションがありません。実際にリベースを試行する前に、競合に遭遇するかどうかを知る方法はありません。
ただし、git rebase
を実行して競合が発生した場合、プロセスは停止し、ゼロ以外のステータスで終了します。できることは、リベース操作の終了ステータスを確認し、ゼロ以外の場合、git rebase --abort
を実行してリベースをキャンセルすることです。
git rebase ... || git rebase --abort
リベースwould beが成功したかどうかだけを確認したいが、「ロールバック」したい場合、常に ブランチの先端を再配置 元のコミットに戻ります。元のSHAにタグを付けるかメモします。
または、おそらくもっと簡単に、リベースを「ステージング」する新しい一時ブランチを作成します。
git checkout your-branch
git checkout -b tmp
git rebase other-branch
成功したが、「ロールバック」したい場合は、your-branch
は変更されません。ただgit branch -D tmp
そして、元の場所に戻ります。
競合があり、それらを解決するためにいくつかの作業を行い、リベースを維持したい場合は、ブランチの先端をtmp
(そしてgit branch -D tmp
)。
git rebase ... --dry-run
は、次の理由により不可能です。
git rebase
、gitは開始点にロールバックし、コミットごとにパッチを段階的に適用してブランチを最新の状態にします。競合が発生すると、停止し、競合を解決するまで待機してから続行します。競合後のリベースのパスは、競合の解決方法によって異なります。特定の方法で競合を解決すると、後で競合が発生(または排除)する可能性があります。
したがって、git rebase ... --dry-run
は、first conflictのみを提供できます。後の競合のレポートは、その最初の競合がどのように解決されるかに依存します。
私がこれを行うことを考えることができる唯一の方法は、git diff
現在の位置とリベースするブランチの最後のコミットの間。しかし、それは実際にあなたが探しているものをあなたに与えることはありません-あなたは本当に2つのポイント間のconflicting変更のリストが必要です。 mightgit diff
が、通常のパッチではありません。
以前からのすべての変更を回復するよりも、git rebaseを実行し、必要に応じて操作することができます。何らかのブランチをmaster
にリベースし、それが気に入らない場合:
git reflog -20
-HEADの簡単な説明付きで最後の20ポジションを提供しますgit checkout <the_branch_name>
-ブランチにHEADgit reset --hard <old_sha1_found_in_reflog>
-HEADとブランチを古い参照に配置します。これにより、古いブランチを復元できます。ここで理解するいくつかのメカニズムがあります:
rebase
およびその他のHEAD操作に関するすべての履歴は、reflog
reflog
の@{N}
注釈を使用できますしたがって、rebase
の後は何も失われません。それを見つけて回復する方法を知っている必要があります。
たとえば、rebase
の前にタグを配置するか、タグに戻すか削除することができます。すべてのSHA1研究ステップを回避します。