5

リモートの「dev」ブランチがあり、ローカルで作業していました。

コミットメッセージ「my_feature」を使用して「dev」で最初のコミットを行い、ローカルブランチをリモートブランチよりも1コミット先に置きました。

次に、いくつかの新しいものを開発し、 を作成してgit add -u、コミットする準備をしました。次に、以前のコミット メッセージを「my_feature (1/2)」として作り直して、現在のコミット メッセージを「my_feature (2/2)」として作り直し、ローカル ブランチをリモート ブランチよりも 2 コミット先に置きたいことに気付きました。

だから私はgit commit --amend(前のコミットのメッセージを編集するだけだと思って)作成し、「my_feature」コミットメッセージを「my_feature(1/2)」として編集し、...「my_feature(1/2)」というラベルの付いた単一のコミットになりました"すべての変更(最初のコミット + ステージング ファイルの差分) を取得 -- インデックスはクリーンになりました。

それで、私が正しければ、私のコマンドは実際にコミットを行い、ステージングファイルもコミットし、単一の(マージされた?)コミットを生成しましたか?

Git がそのようなことをするとは思っていませんでした。古いコミット メッセージを現在のステージング ファイルとマージするのではなく、古いコミット メッセージを編集したかっただけです。(今考えると、rebaseもっと良かったかもしれません。)

コミットできる理由は理解git commit --amendできますが (コミット メッセージを編集したいだけでも)、Git がコマンドを使用して 2 つのコミットを 1 つにマージする方法を理解するのに問題がありますcommit

誰でも私にこれを明確にすることができますか?

$ git --version
git version 1.7.10.4
4

3 に答える 3

7

ファイルをステージングして実行する場合

git commit --amend

前のコミットのすべてに加えてステージングされたすべての新しいコミットを作成すると、この新しいコミットは、チェックアウトしたブランチのヒントとして前のコミットを置き換えます。

git commit --amendステージングされたファイルがなくてもコミット メッセージを変更できますが、ステージングされたファイルがない場合でも、新しい sha1、つまり新しいコミットが取得されることに注意してください。

ドキュメントから:

現在のブランチの先端を修正するために使用されます。いつものように最新のコミットを置き換えるツリー オブジェクトを準備します (これには、通常の -i/-o および明示的なパスが含まれます)。コミット ログ エディターには、現在のブランチの先端からのコミット メッセージがシードされます。作成したコミットは現在のヒントを置き換えます — マージの場合は、現在のヒントの親を親として持ちます — そのため、現在の最上位のコミットは破棄されます。

于 2015-02-20T14:29:59.057 に答える
3

これは予期される動作です。git commitドキュメントから。

- 改める

新しいコミットを作成して、現在のブランチのヒントを置き換えます。記録されたツリーは通常どおりに準備され (-iおよび-oオプションと明示的なパス指定の効果を含む)、コマンド ラインから他のメッセージが指定されていない場合、空のメッセージの代わりに、元のコミットからのメッセージが開始点として使用されます。-m-F、などのオプションを使用します-c。新しいコミットは、現在のものと同じ親と作成者を持ちます (--reset-authorオプションはこれを取り消すことができます)。

これは、次のものとほぼ同等です。

$ git reset --soft HEAD^
$ ... do something else to come up with the right tree ...
$ git commit -c ORIG_HEAD

ただし、マージコミットを修正するために使用できます。

すでに公開されているコミットを修正する場合は、履歴を書き換えることの意味を理解する必要があります。( git-rebase[1]の「RECOVERING FROM UPSTREAM REBASE」セクションを参照してください。)


理解すべき重要な部分はgit reset --soft HEAD^. これにより、履歴からコミットが「削除」されますが、作業ツリーやインデックスは変更されません。

のドキュメントをgit reset参照してください。鉱山を強調します。

- 柔らかい

インデックス ファイルや作業ツリーにはまったく触れません(ただし、すべてのモードと同様に、ヘッドを にリセットします)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります

于 2015-02-20T14:37:03.953 に答える