Gitでルートコミットを編集しますか?


328

後のコミットからメッセージを変更する方法があります:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

最初のコミット(親を持たない)のコミットメッセージをどのように変更できますか?



特に、スクリプトでのGIT_COMMIT環境変数の使用git filter-branch --msg-filter
fork0

回答:


284

クリーンな作業ツリーがあると仮定すると、次のことができます。

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master

23
これはそうあるべきだと思いますgit rebase --onto HEAD <sha1-of-root> master
アンドリュー

5
そうですが、<upstream>の元のルートコミットが必要ですgit rebase。 <upstream>にないgit rebaseコミットを<branch>(master)に適用します。HEADはにないmasterため、お使いのバージョンはのすべてを適用しようとしますmaster
アンドリュー

7
はい、それがgit rebase --onto HEAD <sha1-of-root>マスターであることを確認<sha1-of-root>してくださいgit checkout <sha1-of-root>。それ以外の場合は、2になりますfirst commit
アンディ

2
@カップケーキ:コマンドの古いバージョンをテストしましたか?正常に動作するはずです。修正はコミットメッセージを変更するだけなので、古いルートコミットと新しいルートコミットはまったく同じ変更を導入するため、古いルートコミットは自動的にスキップされます。2番目HEADは、すべてのコミットが考慮されること、およびrebaseの2つのパラメーターバージョンを使用してマスターに戻ることができることを保証します。この回答は、--rootリベースするオプションが存在する前のものであることに注意してください。
CBベイリー

9
以下のecdpalmaの答えははるかに簡単でシンプルで、投票数が多いので、下にスクロールしてください!
Flimm

567

Gitバージョン1.7.12以降、現在使用できます

git rebase -i --root

ドキュメンテーション


2
このコマンドを使用してすべてのブランチのルートをリベースすることは可能ですか?これは、現在のブランチを新しいルートに切り離し、他のすべてのブランチは古いルートにとどまるようです
woojoo666

@ woojoo666ブランチを新しいルートにリベースする必要があります。いつものように。
berkus 2015

@Atcold上流のルートがない場合は機能しません
Kai

警告:これがチェックアウトされたブランチのルートになると誤って想定しましたが、すべてのコミットをロードしてからすべてをリベースするのには時間がかかります。
2016年

2
@レオあなたのコメントはどういう意味ですか?最初の部分と2番目の部分の間にリンクが表示されません-少し時間がかかるのはどういうことですか?
ボイシー2017年

66

ecdpalmaの答えを拡張するには、--rootオプションを使用してrebase、ルート/最初のコミットを書き換えるように指示することができます。

git rebase --interactive --root

その後、ルートコミットがリベースTODOリストに表示され、編集または書き換えを選択できます。

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

これは、Git rebase docs--rootからの説明です(私の強調):

<branch>で制限する代わりに、から到達可能なすべてのコミットをリベースします<upstream>これにより、ブランチ上のルートコミットをリベースできます


12

より高い評価の回答の代替案を提供するだけです。

リポジトリを作成していて、将来的に「最初の」実際のコミットに基づいてリベースすることを事前に知っている場合は、最初に明示的に空のコミットを行うことで、この問題を完全に回避できます。

git commit --allow-empty -m "Initial commit"

その後、「実際の」コミットを開始します。次に、標準的な方法でコミットした上に簡単にリベースできます。たとえば、git rebase -i HEAD^


4
これは、これが機能するために、プロジェクトの最初に空のコミットを作成するための先見性(または精神的能力)が必要であることを意味しませんか?これは私にとって非常に状況的なものであり、一般的には実用的ではないようです。どう思いますか?すでに100回コミットしていて、突然ルートコミットを編集する必要がある場合はどうなりますか。その場合、最初に空のコミットを行わなかった場合でも、これは機能しますか?

2
ルートコミットのメッセージを編集することは、何百ものメッセージを処理した後に行うことではないでしょう。たまにgit repoを作成したい場合があります。いくつかのごちゃごちゃしたコミットを実行します。使用可能な状態に達すると、たとえばそれらを1つにつぶして、メッセージを書き直します。とにかく、今は気が変わって、最初のコミットで最も便利なのは.gitattributes、空のコミットをする代わりにファイルを置くことだと思います。
jakub.g 14

4

あなたが使うことができますgit filter-branch

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit

私はフィルターブランチを使用して作成者/コミッターを変更して-- --allいます。この場合、実際にはルートコミットも処理できるようにするためのオプションが重要です。
sschuberth 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.