1

いくつかの変更をステージングし、その過程で以前の (およびプッシュされていない) コミット メッセージのエラーに気付いた場合、ステージングされた変更をフォールドせずにコミットを修正する方法はありますか?

関連する機能を実行するためのマニュアルページにさまざまなオプションがありますがgit-commit、目的の効果を正確に生み出すと思われる組み合わせはありません。

  • --amend
  • --all(自動的にステージング)、ただし「--none」なし
  • --message
  • --only(指定されたパスのみ)
  • --<no-more-options>...

--only空のファイルリスト (指定方法がわからない) を使用するオプションはほぼ正しいですが、いずれにせよ最後のコミットからの変更が削除される可能性があります (これは望ましくありません)。

ナイーブな方法は to resetand thencommit --amendですが、これにはステージング作業を繰り返す必要があります。または、ステージングされた変更をコミットし、最新ではないコミット メッセージを 経由で編集することもできますがrebase、メッセージを編集するだけでは扱いにくく、やり過ぎのようです。

ステージングされた変更とステージングされていない変更の区別を維持できないように見えるstash saveため、どちらも役に立たないと思います。stashstashステージングされたものだけが可能でない限り?繰り返しますが、それを行う方法がわかりません。)

この質問は 、既存のプッシュされていないコミットを変更する方法に関連していますか? 回答の中には有用な情報がたくさんありますが、これは少し異なる質問には対処されていません。

感謝して受け取ったヒント。ありがとう。

4

4 に答える 4

2

git-commit-treeとでそれを行うことができますgit-reset

git reset --soft `git commit-tree <tree-id> -m "new message" -p HEAD^`

<tree-id>HEADのルートツリーIDです。あなたはそれを得ることができますgit cat-file -p HEAD

于 2013-11-28T13:06:45.987 に答える
1

stashing は、ステージングされたものとステージングされていないものを記憶する必要があると思います。使用する必要があるかもしれません--no-keep-index

git stash --no-keep-index
于 2013-11-28T13:11:32.883 に答える
1

これを @npcode のanswerへのコメントとして入れたかったのですが、書式設定を正しく行うことができませんでした。以下はその答えに大きく基づいています...

以下は、より詳細な説明であり、元のコミット メッセージを編集できるようにするものです。

(1) $git cat-file -p HEAD | grep "^tree\b" | awk '{print $2}'

${tree-id}手順 (4) で必要なHEAD のルート ツリー ID を出力します。

オプション:

(2) $git log -1 --format="%B" > ci.txt

古いコミット メッセージを にダンプします。このメッセージは後でci.txt編集できます。必要に応じて、また別の方法として、まったく新しいコミット メッセージ ファイルを作成することもできます。

(3) $editci.txt

その後、どちらか

(4a) $git commit-tree ${tree-id} -F ci.txt -p HEAD^

また

(4b) $git commit-tree ${tree-id} -m "<new message>" -p HEAD^

ファイルから、またはコマンドラインから直接、それぞれコミットメッセージを使用して新しいコミットオブジェクトを作成します。${commit-id}これらのコマンドのいずれかが、手順 (5) で必要な新しいコミットの ID を出力します。

(5) $git reset --soft ${commit-id}

新しいコミットを現在の HEAD として設定します。

@npcode と @Daniel は、ステップ (1)、(4b)、および (5) を組み合わせます。

于 2013-11-28T16:06:20.240 に答える
0

作業を続行して、後でインタラクティブなリベースを実行できます。

git rebase -i

表示されるコミットのリストで、書き換えたいすべてのコミットをpick置き換えます。reword

于 2013-11-28T13:15:29.537 に答える