1. ホーム
  2. git

[解決済み] git reset --softの実用的な使い方?

2022-03-04 22:13:17

質問

gitを使い始めてちょうど1ヶ月になります。確かに昨日初めてresetを使いましたが、ソフトリセットはまだあまり意味をなしていません。

ソフトリセットを使えば、インデックスや作業ディレクトリを変更することなくコミットを編集できることは理解しています。 git commit --amend .

この2つのコマンドは本当に同じなのでしょうか( reset --softcommit --amend )? 実用上、どちらかを使う理由はありますか?また、もっと重要なこととして、他の用途で reset --soft コミットを修正する以外に、どのような方法がありますか?

解決方法は?

git reset を移動させることです。 HEAD , と、一般にブランチ レフ .
質問:作業ツリーとインデックスはどうする?
を採用した場合 --soft , 移動 HEAD ブランチリファレンスを更新することがほとんどです。 HEAD .
とは異なります。 commit --amend として使用します。

  • 新しいコミットを作成しない。
  • は、実際には任意のコミットに HEAD を移動させることができます ( commit --amend はあくまで ない HEAD を移動し、現在のコミットをやり直せるようにする)

ちょうどこんな組み合わせの例を見つけました。

  • 古典的なマージ
  • サブツリーマージ

をひとつにまとめて (2つ以上のブランチがマージされているので、オクトパス) コミットマージします。

Tomas "wereHamster"カーネッキー で説明しています。 サブツリーオクトパスマージ(quot)の記事 :

  • サブツリーマージ戦略は、あるプロジェクトを別のプロジェクトのサブディレクトリにマージし、その後、サブプロジェクトを最新の状態に維持したい場合に使用します。これは、git サブモジュールの代わりとなるものです。
  • octopus merge strategyは、3つ以上のブランチをマージするために使用することができます。通常の戦略では 2 つのブランチしかマージできず、それ以上マージしようとすると自動的に octopus 戦略にフォールバックします。

問題は、戦略を1つしか選べないことです。しかし私は、リポジトリ全体が新しいバージョンにアトミックに更新されるようなきれいな履歴を得るために、この2つを組み合わせたいと思いました。

私はスーパープロジェクトを持っていて、それを projectA と、サブプロジェクトがあります。 projectB のサブディレクトリに統合しました。 projectA .

(サブツリーマージ部分です。)

ローカルコミットも少し管理しています。
ProjectA は定期的に更新されます。 projectB は数日から数週間おきに新しいバージョンを持ち、通常、特定のバージョンの projectA .

両方のプロジェクトを更新しようと思ったとき、単に projectAprojectB プロジェクト全体のアトミックな更新のために、2つのコミットを作成することになるからです。 .
その代わりに を結合した単一のマージコミットを作成します。 projectA , projectB と私のローカルコミット .
ここで厄介なのは、これがタコ足マージ(3つの頭)であることです。 しかし projectB はサブツリー戦略でマージする必要があります。 . というわけで、こんな感じです。

# Merge projectA with the default strategy:
git merge projectA/master

# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master

ここでは、作者は reset --hard で、その後に read-tree は、最初の2つのマージが作業ツリーとインデックスに対して行ったことを復元するためですが、そこでは reset --soft が役に立ちます。
2つのマージをやり直すには? というのは、私の作業ツリーとインデックスはうまくいっているのですが、この二つのコミットを記録する必要はないのでしょうか?

# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}

さて、Tomasの解答を再開します。

# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD

# And finally do the commit:
git commit


では、その都度。

  • 作業ツリーとインデックスの完成度に満足した場合
  • あなたは ない そこに至るまでにかかったすべてのコミットメントに満足しています。

git reset --soft が答えです。