あなたはgit rebase --interactive
を使用してそれを行うことができますが、開始する前に、あなたの行動の悪影響に注意してください。
履歴を書き換えようとしています。これは悪いことではありませんそれ自体はですが、同じプロジェクトで作業する他の開発者に影響を与える可能性があります。それを行い、変更をセントラルリポジトリにプッシュすると、ブランチの新しい履歴が作成されます。
レポや中央リポジトリでは、この新しい履歴が質問に記載されている履歴に置き換わります。しかし、他の開発者のリポジトリは、その置き換えについて知らず、あなたのブランチ(新しい歴史を持つ)は、彼らが知っている歴史から分岐したコードのほんの一部であると考えています。他の開発者が変更を取り出そうとすると、マージコミットと競合が発生する可能性があります。
他のすべての開発者があなたのやりたいことを知っていて、操作を完了してからリポジトリを正しく更新してから作業を続けるまで、変更をプッシュしない限り、安全に行うことができます。
警告が表示されたら、どうすればいいのかを見てみましょう。
まず、レポがクリーンな状態であることを確認してください。それについて学ぶにはgit status
を使用してください。クリーンでない場合は、変更をコミットまたは隠してから続行してください。
歴史を修正起動するコマンドは次のとおりです。
git rebase --interactive asdfa
git rebase
コマンドの引数はハッシュ(または他の識別方法)で、最後のそれはOKで、変更する必要はありませんコミット。私はあなたの説明から他の開発者の最後のコミットのハッシュを選んだ。
あなたは上記のコマンドを実行すると、Gitはあなたがそれのために設定エディタを開きます(同じあなたはgit commit
を実行したときに、それが開きます)このようなファイルを持つ:
pick adsf23 commit message #n
pick sdffdf commit message #2
...
pick asdadf commit message #1
# Rebase asdfa..asdadf onto asdfa (8 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
... more lines follow here ...
ファイルには、次の2つのセクションがあります。最初の部分、pick
で始まる行には、リベースするコミットのリストと、それらを実行する操作が含まれています。 2番目の部分はコメントであり(各行は#
で始まります)、操作に関する指示が含まれています。それらを読んで一人で放しましょう。
コミットは、時系列順にリストされています。最初のものは最も古いものであり、最後のものは最新のものです。
コミットラインを並べ替え、リストの最後に配置します。次に、コミットの最初のものを除いて、pick
をsquash
に置き換えます。他のものを変更しないでください。行を削除しないでください。コミット行を削除すると、対応するコミットが履歴から削除されます。おそらくこれは起こりたくないでしょう。
ファイルを保存してエディタを終了します。エディタを終了すると、Gitはあなたがファイルで指定した指示を使ってコミットを再起動します。コマンドラインで提供されているリビジョンに戻ってから、ファイルに記述されているように、変更を1つずつ適用します。最初に他の開発者のコミットを適用し(squash
のため)、すべてのコミットを1つにまとめて適用します。
操作中に、コミットが他の開発者のコミットと重複する変更を導入する可能性があるため、Gitは競合に遭遇する可能性があります。この状況ではGitは停止し、停止した理由(競合するファイル)と続行方法を画面に表示します。
競合を修正することができれば、続行できます(ただし、後続のコミットで競合が増える可能性があります)。
あなたはあまりにも多くの競合を取得し、それはそれらを解決することはできません場合は、いつでもコマンドを使用してリベースを中止することができます
git rebase --abort
これは、あなたが始まったときにそれがあった状態でリポジトリを復元します。
リベースは、成功して完了し、実行するために他の開発者に伝え、中央リポジトリにプッシュした場合:自分のリポジトリに
git fetch origin
git rebase origin/master
を正しく新しい歴史を得るために。
'git rebase --interactive'を見ると、好きなようにシリーズの並べ替えやスカッシュができます。 – jthill
対話型のリベースやフィルタブランチがなくても、ブランチの履歴を真剣に並べ替えることはできません。おそらく、あなたはなぜこれを行う必要があると思うか教えていただけますか?上記の例では –
ですが、これは既にステージングのログです。今は生産に移る必要があります。他のgitは準備ができていません。そして、私はgitをすべて組み合わせてコミットする必要があります。ハッシュ..どのように? – sasori