586

プロジェクトの最初のコミットで、後続のすべてのコミットを失うことなく、何かを変更したいと思います。これを行う方法はありますか?

生のメールを誤ってソースコード内のコメントに記載しましたが、GitHubのインデックスを作成しているボットからスパムが送信されているため、変更したいと思います。

4

4 に答える 4

895

以下のecdpalma で言及されているように、git 1.7.12 +(2012年8月)は以下のオプションを拡張しました:--rootgit rebase

" git rebase [-i] --root $tip"を使用して、""につながるすべての履歴を$tipルートコミットまで書き換えることができるようになりました。

その新しい振る舞いは最初ここで議論されました

個人的には、「」は「 git rebase -i --root」を必要とせずに動作するように作ら--ontoれ、歴史上最初のものでも「編集」できるようにすべきだと思います。
歴史の冒頭近くで人々が書き直す頻度は他の方法よりもはるかに少ないため、誰も気にしないことは理解できます。

パッチが続きました。


(元の回答、2010年2月)

Git FAQ(およびこのSOの質問)で述べたように、アイデアは次のとおりです。

  1. 新しい一時的なブランチを作成します
  2. を使用して変更するコミットに巻き戻しますgit reset --hard
  3. そのコミットを変更します(現在のHEADの最上位になり、任意のファイルのコンテンツを変更できます)
  4. 以下を使用して、変更されたコミットの上にブランチをリベースします。

    git rebase --onto <tmp branch> <commit after changed> <branch>`
    

秘訣は、削除したい情報が、ファイル内の別の場所で後でコミットすることによって再導入されないようにすることです。それが疑われる場合はfilter-branch --tree-filter、そのファイルのコンテンツに適切な情報がコミットに含まれていないことを確認するために使用する必要があります。

どちらの場合も、すべてのコミットのSHA1を書き換えることになるため、内容を変更するブランチを既に公開している場合は注意が必要です。プロジェクトがまだ公開されておらず、他の人が書き直そうとしているコミットに基づいて作業を行っていない場合を除いて、おそらくそれを行うべきではありません。

于 2010-02-22T07:20:36.677 に答える
281

1.7.12リリースノートに記載されているように、

$ git rebase -i --root
于 2013-01-31T15:27:14.847 に答える
91

git rebase -iルートコミットを除いて、以前のコミットを簡単に編集できます。次のコマンドは、これを手動で行う方法を示しています。

# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`

# switch to a new branch pointing at the first commit
git checkout -b new-root root

# make any edits and then commit them with:
git commit --amend

# check out the previous branch (i.e. master)
git checkout @{-1}

# replace old root with amended version
git rebase --onto new-root root

# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue

# delete the branch "new-root"
git branch -d new-root

# delete the tag "root"
git tag -d root
于 2010-02-24T00:15:34.563 に答える
-2

最初のコミットのみを変更したい場合は、git rebaseを試してコミットを修正できます。これは、次の投稿と同様 です。gitで指定されたコミットを変更するにはどうすればよいですか?

また、生の電子メールを含むすべてのコミットを変更する場合は、filter-branchが最適です。書籍ProGitにメールアドレスをグローバルに変更する方法の例があり、このリンクが役立つ場合がありますhttp://git-scm.com/book/en/Git-Tools-Rewriting-History

于 2010-02-11T17:32:59.180 に答える