1. ホーム
  2. git

[解決済み] 以前のコミットを保存するには?

2023-04-08 23:19:39

質問

以下のような状況で、私の git log :

commit 111  <-- need to push it to the repository

commit 222  <-- need to stash this one

...

見ての通り、最後の(前のコミットを含まない)コミットだけをリポジトリにプッシュする必要があります。

どうすればいいのでしょうか? git revert --soft commit_hash が助けてくれるのでしょうか?

どのように解決するには?

リモートリポジトリにどちらのコミットもプッシュしていない場合、対話的リベースを使ってコミットを「並べ替え」、(新しい)直近のコミットの変更点のみを保存することができます。

現在のブランチの先端(この例ではコミット 111)をチェックアウトしたと仮定して、以下を実行してください。

git rebase -i HEAD~2

これはデフォルトのエディタを開き、直近の2つのコミットをリストアップし、いくつかの指示を出します。ここで何をするかは非常に慎重にしてください。事実上リポジトリの歴史を「書き換える」ことになるので、注意しなければ作業を失う可能性があります(必要なら最初にリポジトリ全体のバックアップをとってください)。以下に、例としてコミットハッシュ/タイトルを推定してみました。

pick 222 commit to be stashed
pick 111 commit to be pushed to remote

# Rebase 111..222 onto 333
#
# 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
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

2つのコミットをこのように並べ替えます(最も古い => 最も新しいと表示されます)。

pick 111 commit to be pushed to remote
pick 222 commit to be stashed

保存して終了すると、git はあなたが変更したふたつのコミットを書き換えるための処理を行います。問題がなければ、ふたつのチェンジセットの順番が逆になるはずです。これを確認するには git log --oneline -5 で確認でき、新しいものから順に出力されます。

この時点で、最新のコミットでソフトリセットを行い、作業中の変更を保存しておくことができます。

git reset --soft HEAD~1
git stash

このオプションが本当に実行可能なのは、以前にリモートへこれらの変更をプッシュしていない場合のみであることを言及することが重要です。そうでなければ、そのリポジトリを使用するすべての人に問題を引き起こす可能性があります。