[解決済み] git reset --softの実用的な使い方?
質問
gitを使い始めてちょうど1ヶ月になります。確かに昨日初めてresetを使いましたが、ソフトリセットはまだあまり意味をなしていません。
ソフトリセットを使えば、インデックスや作業ディレクトリを変更することなくコミットを編集できることは理解しています。
git commit --amend
.
この2つのコマンドは本当に同じなのでしょうか(
reset --soft
対
commit --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
.両方のプロジェクトを更新しようと思ったとき、単に
projectA
とprojectB
プロジェクト全体のアトミックな更新のために、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
が答えです。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] ステージングされた変更を表示するにはどうしたらいいですか?
-
[解決済み] Gitで落としたスタッシュを復元する方法とは?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】マージ後のコミットでGitエラー - fatal: マージ中に部分コミットができない
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
[解決済み] ERROR: リモートレポ 'origin' のクローン作成に失敗しました。
-
[解決済み] git が「Pull is not possible because you have unmerged files」と表示するのはなぜですか?
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
[解決済み] GitBash | origin master - rejected (fetch first) | GitHub リポジトリにファイルがない。
-
[解決済み] git reset --mixed, --soft, --hard の違いは何ですか?
-
[解決済み] Gitで最初の2つのコミットをつぶす?重複
-
[解決済み] git reset」と「git checkout」の違いは何ですか?
-
[解決済み】Git: ベアリポジトリのActive Branchを変更する正しい方法?