[解決済み] git reset」と「git checkout」の違いは何ですか?
質問
いつも思うのですが
git reset
と
git checkout
というのは、どちらもプロジェクトを特定のコミットに戻すという意味では同じだからです。しかし、冗長になってしまうので、まったく同じというわけにはいかないと思います。この2つの実際の違いは何でしょうか?私は少し混乱しています。というのも、svn には
svn co
をクリックすると、コミットを元に戻すことができます。
追加
VonCとCharlesは、以下の違いについて説明しました。
git reset
と
git checkout
は本当によくできました。私の現在の理解では
git reset
はすべての変更を特定のコミットに戻すのに対して
git checkout
ブランチの準備をします。この理解を得るために、次の2つの図が非常に役に立ちました。
追加された3
から http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html チェックアウトとリセットは、リベースをエミュレートすることができます。
git checkout bar
git reset --hard newbar
git branch -d newbar
解決方法は?
-
git reset
は、具体的には インデックスの更新 HEADを移動させます。 -
git checkout
は約 作業ツリーの更新 (インデックスまたは指定したツリーへ)。ブランチをチェックアウトした場合のみ、HEADを更新します(そうでない場合は、最終的に 切り離されたHEAD ).
(実際には、Git 2.23 Q3 2019で、これは次のようになります。git restore
とは限りません。git checkout
)
それに比べて、svnにはインデックスがないので、作業ツリーのみです。
svn checkout
は、指定されたリビジョンを別のディレクトリにコピーします。
に近いものです。
git checkout
となります。
-
svn update
(同じブランチにいる場合、同じSVN URLを意味します) -
svn switch
(例えば同じブランチを別の SVN リポジトリの URL からチェックアウトした場合)
これら3つの作業木の修正(
svn checkout
,
update
,
switch
) は、git のコマンドはひとつだけです。
git checkout
.
しかし、git にはインデックス (レポと作業ツリーの間にあるステージング・エリア) という概念があるため、次のようなものもあります。
git reset
.
シンカイ 記載事項 コメントで の記事をご覧ください。 リセット・デミスティファイド "です。
例えば、2つのブランチがある場合、'
master
と'develop
は異なるコミットを指しており、現在では 'develop
'(だからHEADはそれを指している)を実行するとgit reset master
, 'develop
と同じコミットを指すようになります。master
のようになります。一方、代わりに
git checkout master
, 'develop
は動きません。HEAD
を使用します。HEAD
を指すようになり、'master
'.つまり、どちらのケースでも
HEAD
を指して、コミットA
しかし、その方法は大きく異なります。reset
はブランチを移動させます。HEAD
を指すと、チェックアウトはHEAD
は、別のブランチを指すようにします。
そういう点では、ですが。
この回答の最初の段落は、しかし、誤解を招くものです: "
git checkout
... は、ブランチをチェックアウトした場合のみ HEAD を更新します(そうでない場合は、切り離された HEAD で終了します)" 。
そうではありません。git checkout
は、ブランチでないコミットをチェックアウトしても HEAD を更新します (そして、切り離された HEAD ができあがりますが、それでも更新されます)。git checkout a839e8f updates HEAD to point to commit a839e8f.
@LarsHさんのおっしゃる通りです。
2つ目の弾丸は、ブランチをチェックアウトした場合のみ HEAD が更新されるという、HEAD が何であるかについての誤解を含んでいます。
HEADは影のようにどこにでも行く。
ブランチ以外の参照(タグなど)をチェックアウトしたり、直接コミットすると、HEADが移動します。Detached head は HEAD から切り離されたことを意味するのではなく、ブランチ ref から切り離されたことを意味します。これは、たとえばgit log --pretty=format:"%d" -1
.
- アタッチド・ヘッド・ステートは、まず
(HEAD ->
,- が表示されたままです。
(HEAD
しかし、ブランチ参照への矢印は表示されません。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] git rebase の取り消し
-
[解決済み] git add -A」と「git add .」の違い。
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ローカルに変更があるにもかかわらず、git pushが「すべて最新」と言う
-
[解決済み】未マージファイルがあるため、Gitマージができない
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push some refs to .......
-
git revert 複数コミット
-
[解決済み] リモートから<branch name>とマージするように構成が指定されていますが、そのような参照は取得されませんでしたか?
-
[解決済み] 複数のコミットをチェリーピックする方法
-
[解決済み] ブラウンアウトの一環として、パスワード認証が一時的に無効になっています。代わりに個人用アクセストークンを使用してください[重複]。
-
[解決済み] git reset --softの実用的な使い方?
-
[解決済み] GitのHEADとは何ですか?
-
[解決済み] Git リポジトリがデタッチド HEAD 状態になったのはなぜですか?