web-dev-qa-db-ja.com

Gitでプロジェクトの最初のコミットを変更しますか?

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

私は誤って私の生の電子メールをソースコード内のコメントにリストしていました、そしてGitHubをインデックス付けするボットからスパムを受けているのでそれを変更したいです。

445
Michael

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

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

その新しい振る舞いは、最初は ここで説明

私は個人的には "git rebase -i --root"は単に "--onto"を必要とせずに動作するように作られるべきであり、歴史の最初のものでさえも "編集"させるべきだと思います。
人々が歴史のまさにその初め近くで書き換えをする頻度がはるかに少ないので、誰も気にしないことは理解できます。

パッチが続く


(元の回答、2010年2月)

Git FAQ (そしてこれ SO question )で述べられているように、アイデアは:

  1. 新しい一時的なブランチを作成する
  2. git reset --hardを使って変更したいコミットまで巻き戻します。
  3. そのコミットを変更します(それは現在のHEADのトップになるでしょう、そしてあなたはどんなファイルの内容でも変更することができます)
  4. 以下を使用して、変更されたコミットの上にブランチを再配置します。

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

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

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

669
VonC

1.7.12リリースノート に書かれているように、あなたは使うことができる

$ git rebase -i --root
202
ecdpalma

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
78
cmcginty

最初のコミットだけを修正したい場合は、git rebaseを試してコミットを修正してください。これは、次の投稿に似ています。 gitで指定されたコミットを修正する方法は?

生のEメールを含むすべてのコミットを変更したい場合は、filter-branchが最良の選択です。ブック上でグローバルにEメールアドレスを変更する方法の例がありますPro Git、そしてこのリンクが役に立つかもしれません http://) git-scm.com/book/en/Git-Tools-Rewriting-History

0
ZelluX