gitswitchとgitcheckout <branch>の違いは何ですか


164

Git 2.23では新しいコマンドが導入されていますgit switch-ドキュメントを読んだ後、git checkout <branchname>誰かが違いやユースケースを説明できるのとほとんど同じように見えますか?

2つの新しいコマンド「gitswitch」と「gitrestore」が導入され、「ブランチをチェックアウトして履歴の進行に取り組む」と「パスをインデックスからチェックアウトするか、ツリーっぽくして現在の進行に取り組む」を分割します単一の「gitcheckout」コマンドからの「履歴」。


2
このトピックについてのInfoQので良い記事があります:infoq.com/news/2019/08/git-2-23-switch-restore
rsenna

回答:


179

リンク先のドキュメントによると、その唯一の目的は、次の2つの異なる使用法を分割して明確にすることですgit checkout

  • git switch今、枝を変更するために使用することができgit checkout <branchname>ません
  • git restore特定のリビジョンにファイルをリセットするために使用することができgit checkout --<path_to_file>ません

Stackoverflowgit checkoutに関する多くの質問からわかるように、人々はこれらのさまざまな使用方法に混乱しgit checkoutています。Git開発者はこれを考慮に入れているようです。


32
これは良い変化のようです。ブランチを作りますか?git checkoutブランチを切り替えますか?git checkoutファイルの特定のバージョンを取得しますか?git checkout1つのファイルへの変更を削除しますか?git checkout正直なところ、さまざまなフラグを使用して、通常のgitワークフローのどれだけを実行できるのか疑問に思っていますgit checkout
キャプテンマン

5
では、git checkout技術的にはもう必要のないアイデアはあるのでしょうか。それとも、ブランチヘッドではないコミットのチェックアウト(「デタッチドヘッド」モードへの移行)など、特定の目的でまだ使用されていますか?
PieterNuyts

5
@Mikeチェックアウトでブランチが作成されると言った後、チェックアウトでブランチが1文にならないというのはどうしてですか。-b旗の内部の仕組みは関係ありません。それはまだ枝を作ります。
キャプテンマン

5
@CaptainMan、checkout 操作はブランチを作成せず、既存のブランチにのみ切り替えることができます。コマンド-bオプションは、実際にチェックアウトを実行する前に、内部で実行します。これは、+のショートカットと同じです。checkout git branchgit pullgit fetchgit merge
マイク

7
参考ノート:に使用されているもののためにgit checkout -b <branch name>あなたが使用することができgit switch -c <branch name>、同じ効果を得るために
Xeuron

72

git checkout いくつかの無関係な用途があるスイスのアーミーナイフのビットです。

ファイルを変更したが、変更をステージングしていない場合は、変更git checkout <filename>が元に戻されます...ファイルへの変更をキャンセルするための迅速で簡単な方法。あなたは同じブランチにとどまります。

git checkout <branchname> (あなたが指摘したように)ブランチを切り替えます。

2つのまったく異なる目的。ファイル名とブランチ名が類似していると、混乱を招く可能性があります。

2つのコマンドとしてそれを持っていることはより明確です。


あなたが言ったように、同じ名前のブランチとファイルを持つことは混乱を招きます。多くの場合、より望ましいので、ブランチがファイルよりも優先されると思いますか?またはそれはどのように機能しますか?
AgentM

@AgentMはい、その通りです。ブランチとファイルの名前が同じである場合、実行するとファイルではgit checkout <name>なくブランチが優先されます。
KartikSoneji20年

3

switchいくつかの制限があります。現時点では、あなたは切り替えることができますから、いずれかにコミットする<branch name>、しかし、それは切り替えることが不可能だから <branch name>の状態で特定のコミットに切り離さHEAD。したがって、使用する必要がありますgit checkout 5efb(5efbは任意のコミットへのハッシュ参照の例です)


3
これは実際には機能であり、バグ(制限)ではないと私は主張します。switchはブランチを変更するという単一の目的のために作成されており、それを行うときは、そのブランチの先頭にいる必要があります。checkoutは、作業コピーを履歴内の特定の状態(=コミット)に一致させる、より一般的な操作です。ブランチ名はそのブランチのHEADコミットのエイリアスであるため、ブランチをチェックアウトすることは、技術的には他のコミットをチェックアウトすることと同じです。
マイク

16
-dあなたと一緒に:git switch -d 6c13
メンディバレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.