web-dev-qa-db-ja.com

事前に競合を通知する何らかの「git rebase --dry-run」がありますか?

スクリプトのリベースを試みていますが、リベースによって競合が発生するかどうかによって、スクリプトのパスが異なります。

リベースを実行する前に、リベースによって競合が発生するかどうかを判断する方法はありますか?

56
Jonathan.Brink

執筆時点(Git v2.6.1 v2.10.0)、git rebaseコマンドには--dry-runオプションがありません。実際にリベースを試行する前に、競合に遭遇するかどうかを知る方法はありません。

ただし、git rebaseを実行して競合が発生した場合、プロセスは停止し、ゼロ以外のステータスで終了します。できることは、リベース操作の終了ステータスを確認し、ゼロ以外の場合、git rebase --abortを実行してリベースをキャンセルすることです。

git rebase ... || git rebase --abort
36
jub0bs

リベース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)。

20
joneit

git rebase ... --dry-runは、次の理由により不可能です。

git rebase、gitは開始点にロールバックし、コミットごとにパッチを段階的に適用してブランチを最新の状態にします。競合が発生すると、停止し、競合を解決するまで待機してから続行します。競合後のリベースのパスは、競合の解決方法によって異なります。特定の方法で競合を解決すると、後で競合が発生(または排除)する可能性があります。

したがって、git rebase ... --dry-runは、first conflictのみを提供できます。後の競合のレポートは、その最初の競合がどのように解決されるかに依存します。

私がこれを行うことを考えることができる唯一の方法は、git diff現在の位置とリベースするブランチの最後のコミットの間。しかし、それは実際にあなたが探しているものをあなたに与えることはありません-あなたは本当に2つのポイント間のconflicting変更のリストが必要です。 mightgit diffが、通常のパッチではありません。

7
Kryten

以前からのすべての変更を回復するよりも、git rebaseを実行し、必要に応じて操作することができます。何らかのブランチをmasterにリベースし、それが気に入らない場合:

  1. git reflog -20-HEADの簡単な説明付きで最後の20ポジションを提供します
  2. git checkout <the_branch_name>-ブランチにHEAD
  3. git reset --hard <old_sha1_found_in_reflog>-HEADとブランチを古い参照に配置します。これにより、古いブランチを復元できます。

ここで理解するいくつかのメカニズムがあります:

  1. とにかく、コマンドではなく、gitで何も削除しないでください。参照されないブランチを通過して削除するガベージコレクター(デフォルトは3か月)。したがって、リベース前のブランチはまだ存在しています。
  2. 同じブランチのリベースについても同じことが言え、古いツリーの隣に新しいツリーが書き直されます。
  3. rebaseおよびその他のHEAD操作に関するすべての履歴は、reflog
  4. reflog@{N}注釈を使用できます

したがって、rebaseの後は何も失われません。それを見つけて回復する方法を知っている必要があります。

たとえば、rebaseの前にタグを配置するか、タグに戻すか削除することができます。すべてのSHA1研究ステップを回避します。

4
Lukasz Kruszyna