72

私はgitをいじっていましたが(まだ非常に初心者です)、「リセット」と「リベース」の違いを知りたいと思っていました。一方は他方よりも強力ですか?

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

17a64df 2012-06-21 | Hello は style.css (HEAD、origin/style、master) を使用しています
。css スタイルシート
801e13e を追加 2012-06-21 | README
5854339 を追加 index.html
0b1dd4c を追加しました 2012-06-21 | hello.html を lib
55649c3に移動しました 著者/電子メール コメントを追加します
。著者のコメントを追加しました
cdb39b0 2012-06-21 | テキスト付きの p タグをコミットする (v1.1)
b7b5fce 2012-06-21 | これにより、コミット a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8 が元に戻ります。
a6faf60 2012-06-21 | 「おっと、このコミットは必要ありませんでした」を元に
戻す おっと、このコミットは必要ありませんでした
262d1f7 2012-06-21 | HTML ヘッダーを追加 (v1)
b1846e5 2012 年 6 月 21 日 | 標準の HTML ページ タグを追加 (v1-beta)
bf1131e 2012-06-21 | HI タグを追加しまし
た 02b86d0 2012-06-21 | 最初のコミット

4

3 に答える 3

76

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

したがって、歴史を書き換えたい場合git-rebaseは、それが必要です。リベースによってオブジェクトが書き換えられ、古いオブジェクトとの互換性がなくなり、他の関係者に混乱が生じるため、プッシュされて他の誰かが利用できる履歴を書き換えてはならないことに注意してください。

そうは言っても、やりたいことはインタラクティブなリベースです。を使用して呼び出すと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 が履歴を書き換えます。繰り返しますが、既に変更をプッシュしている場合は、これを行わないでください。一般に、履歴にそのようなコミットがあることはまったく問題ありません。

于 2012-06-27T11:45:12.443 に答える
32

この素人の説明が正しいことを願っています。

git reset と git rebase の両方がローカル ブランチに影響します。彼らはあなたのローカルブランチを特定のコミットと同期させます。違いは次のとおりです。

  1. 「git reset --hard {commit-id}」は、ローカル履歴のコミットを使用します。
  2. 「git rebase origin/{branch-name}」はリポジトリの最新のコミットを使用します

追加情報

いつリセットを使用しますか?

作業を終了し、ローカルでコミットするとします。次に、あなたの猫がキーボードを横切り、どういうわけかあなたは猫の仕事をうっかりコミットしてしまいます。リセットを使用します。

リベースをいつ使用するか?

関数/クラスの名前をリファクタリングし、この変更が多くの​​ファイルに影響するとします。コミットしてオリジンにプッシュしようとすると、同僚がいくつかの重要な変更を行い、すでにオリジンにプッシュしていることに気付きました。(IDE を使用して) 名前を再度リファクタリングする方が、すべての競合ファイルを確認するよりも簡単だと思うとしましょう。リベースを選択すると、自分の作業が消去され、同僚の作業はそのままになります。

すべての回答/チュートリアルに技術的な免責事項が含まれているのはなぜですか?

リセットとリベースの両方がローカルの変更を永久に削除できるためです。そのため、ユーザーは自分の作業を維持するための戦略 (バックアップ ブランチの作成など) を採用する方法を知る必要があります。

于 2018-08-27T17:03:05.307 に答える