2012-06-27 32 views
38

私はgit(まだ非常にnoob)で遊んでいて、 "リセット"と "リベース"の違いを知りたかったのです。他のものより強力ですか?"git reset"と "git rebase"の違いは何ですか?

私は太字の3つのコミットを履歴から削除したいと思っていますが、どちらを使うのが良いでしょうか、それともタグ付けしてからgit tag -d <tagname>で削除する必要がありますか?

17a64df 2012-06-21 | Helloはstyle.css(HEAD、origin/style、master)を使用します。
a6792e4 2012-06-21 | CSSスタイルシートの追加
801e13e 2012-06-21 | READMEを追加
5854339 2012-06-21 |追加index.html
0b1dd4c 2012-06-21 | hello.htmlをlibに移動
55649c3 2012-06-21 |著者/電子メールのコメントを追加する
9b2f3ce 2012-06-21 |投稿者コメントを追加
cdb39b0 2012-06-21 |テキストでpタグをコミットする(v1.1)
b7b5fce 2012-06-21 |これはコミットを戻しますa6faf60631b5fbc6ee79b52a1bdac4c971b69ef8。
a6faf60 2012-06-21 | "Oopsを元に戻す、このコミットは望んでいない"
a006669 2012-06-21 |おっと、私たちはこのコミットを望んでいませんでした
262d1f7 2012-06-21 | HTMLヘッダー(v1)を追加しました
b1846e5 2012-06-21 |標準のHTMLページタグ(v1-beta)を追加しました
bf1131e 2012-06-21 | HI TAGを追加しました
02b86d0 2012-06-21 |最初のコミット

答えて

43

これらは全く異なっています。 git-resetは、コミットオブジェクト(または他のオブジェクト)に触れることなく、作業ディレクトリとインデックス上のrefで動作します。一方、git-rebaseは、以前に作成されたコミットオブジェクトを書き換えるために使用されます。

履歴を書き換えたい場合は、git-rebaseが必要です。 は、リベースしているオブジェクトを古いオブジェクトと互換性のないものに書き換え、関係する他の人のために混乱を招くため、プッシュされて他の人が利用できた履歴を書き直す必要があることに注意してください。

あなたがしたいことは、ist interactive rebasingと言われています。 git rebase -i 262d1f7を使用して、それを起動して、あなたはこのように見ているプロンプトを取得する必要があります:

あり
pick 262d1f7 Added HTML header (v1) 
pick a006669 Oops, we didn't want this commit 
pick a6faf60 Revert "Oops, we didn't want this commit" 
pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8. 
pick cdb39b0 Commit p tags with text (v1.1) 
pick 9b2f3ce Added an author comment 
pick 55649c3 Add an author/email comment 
pick 0b1dd4c Moved hello.html to lib 
pick 5854339 Added index.html 
pick 801e13e Added README 
pick a6792e4 Added css stylesheet 
pick 17a64df Hello uses style.css (HEAD, origin/style, master), 

は、単にあなたが、削除保存してエディタを終了し、Gitがあなたの歴史を書き換えますしたいコミットの行を削除します。再度この変更を行わなかった場合はとなります。一般的に、そのようなコミットを歴史に残すことは、まったく問題ありません。

+0

ご回答いただきありがとうございました。 – Q10

+0

は、スカッシュの単語 "pick"を "s"に変更するのと同じように、リベースから行を削除していますか? – Ninjaxor

+4

@Ninjaxorいいえ、行を削除すると、履歴から導入されたコミットと変更が完全に削除されます。コミットが決して行われなかったかのようです。たとえば、行を追加したコミットを削除した場合、その行は後で再コミット後にコミットされません。一方では、別のコミット自体を取り除きながら、コミットに導入された変更を維持します。 – poke

8

これは2つの違いを比較しませんが、here'sはわかりやすいリベースを説明する優れた記事です。

+1

URLは現在http://www.jarrodspillers.com/git/2009/08/19/git-merge-vs-git-rebase-avoiding-rebase-hell.html – AnneTheAgile

+1

です。この記事では、唯一のメリットはマージが少ないことです残りのマージコミットはより意味があります。これはリスクの価値があるとは思われません。他の利点はありますか? –

+0

その記事はとても役に立ちました。私は今までインターネットで見てきました。 –

関連する問題