web-dev-qa-db-ja.com

Gitでコミットを非対話的に並べ替える方法

どの非対話型gitコマンドがBeforeからAfterへの変更を実現しますか?

前:

A---B---C---D

後:

A---C'---B'---D'
33
James Tauber

あなたの場合、インタラクティブをリベースすることができます:git rebase -i HEAD~4次に、ピックを並べ替えることができます

たとえば、ブランチにさらに3つのファイルを追加しましょう。

git add A
git commit -m "A"

git add B
git commit -m "B"

git add C
git commit -m "C"

ショートログは次のようになります。

$ git shortlog
 (3):
      A
      B
      C

BをCで並べ替える場合:

$ git rebase -i HEAD~2
pick 1f9133d B
pick 33f41be C

次のように並べ替えるだけです。

pick 33f41be C
pick 1f9133d B

書き終えたら、ショートログを参照してください。

$ git shortlog
 (3):
      A
      C
      B

並べ替えることで、すべてのコミットで同じことを行うことができます。それはあなたが見るものがあなたが得るものであるようなものです、それはかなりクールです:)

38
Mohamed Mansour

これを試して:

git reset --hard A
git cherry-pick C
git cherry-pick B
git cherry-pick D

git rebaseには方法があるかもしれませんが、私はそれを本当に理解していませんでした。

23
Paŭlo Ebermann

Git rebase --interactiveを非対話型で使用するには、 git rebase --interactiveを非対話型で実行するにはどうすればよいですか? を参照してください。

次に、コミットを並べ替える正式な基準がある場合は、スクリプトを作成できます。たとえば、 git mergeを実際にフラット化 を参照して、元のコミット日までにコミットを並べ替えます。

5
pfalcon

スクリプトでコミットを並べ替えたいが、コミットハッシュを処理したくない場合、これは一般的な解決策として機能するようです(PaŭloEbermannの回答に基づく)。

git reset --hard @~3
git cherry-pick ORIG_HEAD~1
git cherry-pick ORIG_HEAD~2
git cherry-pick ORIG_HEAD

この一連のコマンドを2回続けて実行すると、変更されたコミットハッシュを変更することを除いて、コミットツリーが以前の状態に復元されると思います。

0
rubystallion