2009-08-20 15 views
2

リポジトリの履歴を書き直す必要があります。私はコミットルートを修正する必要があるように私はGit Faqからの指示に続く:Gitは、すべてのブランチのルートコミットを編集します。

git rebase -iを使用すると、便利なルートがコミットを除く、以前のコミットを編集することができます。次のコマンドは、これを手動で行う方法を示しています。

# tag the old root 
git tag root `git rev-list HEAD | tail -1` 
git checkout -b new-root root 
# edit... 
git commit --amend 

# check out the previous branch 
git checkout @{-1} 
# replace old root with amended version 
git rebase --onto new-root root 

# cleanup 
git branch -d new-root 
git tag -d root 

私の問題は、私はすでにリポジトリに二つの枝と複数のタグを持っていると私は私の歴史書き換えがあまりにもそれらに適用することを希望することをにもかかわらずです。レポはまだ公開されていないので問題はありません。前にsimilar questionに尋ねましたが、その場合はgit rebaseコマンドが使用されていませんでした。私のレポの基本グラフは次のとおりです。

+ master branch 
| 
| + topic branch 
| | 
| | 
+---+ 
| 
| 
| 
+ TAG 
| 
+ Initial commit, the commit I'd like to amend for all branches 

それは可能ですか?

+0

おそらく関連しています:[Gitの最初の/ root/initialコミットの編集/修正/変更/変更](http://stackoverflow.com/q/2119480/456814)。 –

答えて

6

git-rebaseの代わりにgit filter-branchを使用してください。

あなたが本当に本当に、リベースが良くなると感じたら、現代のgitでは--rootオプションをgit-rebaseに使用できます。または、チェリーがルートコミットを選択し、このオプションを持たない古いgitがある場合は、その上にリベースします。

+0

Thanks Jakub。しかし、私は 'filter-branch'がどのように私を助けてくれるのか本当に分かりません。私はほぼ10のファイルでコードを編集しなければならないので、最初のコミットにはクレデンシャルがないように見せます。私はそれらのファイルのための標準フォーマットがないので、どのようにそれが可能であろうか分からない。それはちょうどコードです。私は '--tree-filter'を使って可能だと思いますが、コードを解析するのは難しいようです。 –

+2

これが状況であれば、最も簡単な解決策は、新しいブランチ( 'git symbolic-ref HEAD refs/heads/new && rm -f .git/index')を作成し、そのブランチにチェリーピックルートコミット'git commit --amend'を使ってそれを編集し、次にrebase restを実行するか、' git rebase --interactive --root --onto new master'を使います。 HTH。 –

+0

ありがとう、私は両方を試してみましょう、2番目のオプションは簡単だと思われる。大変感謝しています。 –

関連する問題