4

以下のようなコミット履歴があります。

* 8cd26ba 2013-06-26 | history server-side (HEAD, noXHR)
* bffd858 2013-06-25 | popups and modals
* d95c5f4 2013-06-21 | Map update for new interaction
...

'8cd26ba' をコミットした後、モーダル メカニズムにバグを見つけたので、修正したいと思います。here で説明されているように、「bffd858」を修正しようとしました(修正が関連しているため)。次の手順を実行しました。

  1. 入力した

    $ git rebase -i bffd858
    
  2. git が表示します (nano で)

    pick 6fa566b history server-side
    # Rebase bffd858..6fa566b onto bffd858
    #
    # Commands:
    #  p, pick = use commit
    #  r, reword = use commit, but edit the commit message
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #  f, fixup = like "squash", but discard this commit's log message
    #  x, exec = run command (the rest of the line) using shell
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #
    
  3. 「選択」を「編集」に置き換えました

  4. gitは私に言った:

    Stopped at 8cd26ba... history server-side
    You can amend the commit now, with
    
        git commit --amend
    
    Once you are satisfied with your changes, run
    
        git rebase --continue
    
  5. バグ修正を適用して入力しました

    $ git commit -a --amend
    
  6. 入力した

    git rebase --continue
    
  7. そして、「8cd26ba」(最後のコミット) でバグ修正を見つけました!

私は何を間違えましたか?

4

4 に答える 4

7

エラーは、リベースを行うときに、変更する最も古いコミットの親の ID を指定することです。あなたの場合、bffd858親がord95c5f4としても知られているを変更したかった (特殊文字として解釈するシェルで動作するため、最後の構文を好む)。bffd858^bffd858~1^

代わりに次のことを行う必要があります。

$ git rebase --interactive bffd858~1

ファイルを次のように変更しました。

pick bffd858 popups and modals
fixup 6fa566b history server-side
# Rebase bffd858..6fa566b onto bffd858
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

次に、ファイルを保存して閉じました。

通常、バグ修正を適用して履歴を修正する最も簡単な方法は次のとおりです。

  1. git commit --fixup=bffd858修正をコミットするときに使用し、
  2. git rebase --interactive --autosquash bffd858~1リベースに使用し、
  3. 開いたファイルを保存し、リベースが完了するのを待ちます。

元のコミットには修正が適用されます。

あなたの場合、修正した単一のコミットでのみリベースを行いました。リベースの部分は、修正を送信した後の時点まで履歴を巻き戻しただけです (つまり、何もしませんでした)。

于 2013-06-27T09:09:41.307 に答える
1

私はこのようにします:

適切な「修正コミット」を記述します。

次に、どちらか-そのままにしておきます。時にはそれで十分です。すべてが公開されている場合は、それが唯一の適切なオプションです。

または。実行git rebase -i <commit to fix>^- 修正したいものより 1 つ前。次に、ファイルを編集します。「修正コミット」を上に移動して、修正したいものの直後に配置します。次に、「pick」を「squash」に置き換えてそのコミットに修正を適用し、コミット メッセージを編集するか、「fixup」を使用して修正を適用し、メッセージをそのままにします。

于 2013-06-27T09:19:45.167 に答える
0

@aragaerはこれに答えましたが、素人のために明確にしたかったのです。

職場で誰も教えてくれず、これについて説明したワークフローの基本を見つけることができなかったため、私は次のことを愚かに行うことに長い間悩まされていました. 以前git rebase -i HEAD~#は古いコミットを HEAD に移動し、途中で競合を修正する可能性があり、コミットの修正を実行し、再度リベースしてコミットを履歴の元の場所に戻し、競合を再度修正する可能性がありました。動作しますが、間違った答えです。なんて悪夢だ。http://git-scm.comがこれについて議論していないことに驚いています。これは非常に基本的なことです。もしそうなら、私はそれを逃しました。

答えは簡単です。

  1. 古いコミットに適用する変更を加えて、新しいコミットを作成します。
  2. 通常は問題ありませgit rebase -i HEAD~10ん。コミット SHA を知っている場合は、上記の @aragaer の回答を使用してください。
  3. コミットを押しつぶしたい古いコミットのすぐ下に移動します。
  4. 次に、適用するsquashfix、新しいコミットを行います。

終わり。

于 2014-02-22T02:48:21.690 に答える
0

あなたはまさにあなたが求めたものを得ました。「履歴サーバー側」のコミットを編集しましたが、xt では、以前のものを意図したと言っていました。

以前のコミットからリベースを開始し、実際に意図したものを編集した場合、プロセス自体は機能していたでしょう。

しかし、より便利な方法は、一番上に修正を加えて、'Fixup!' でコミットすることです。'、最終的にインタラクティブなリベースを下から開始します。auto-squash がデフォルトであるため、自動的に todo リストが作成され、フィックスアップが適切な場所に移動され、フィックスアップとしてマークされます。(スカッシュも同様です!)。確かに todo は手動で編集できます。

あとは実行するだけです。この方法は、何かが意図したとおりにならない場合に再現しやすく、編集で行われた作業が簡単に失われます。

于 2013-06-27T10:55:53.203 に答える