Git anahtarı ile git checkout arasındaki fark nedir <branch>


151

Git 2.23 tanıtır yeni bir komut git switch- docs okuduktan sonra hemen hemen aynı olduğu görünüyor git checkout <branchname>teneke birisi farkı veya kullanım örneğini açıklamak?

"Git switch" ve "git restore" komutları, "geçmişini ilerletmek için bir dalı kontrol etmek" ve "dizinin dışındaki yolları kontrol etmek" ve / veya geçerli olanı ilerletmek için bir ağaç-ish'i bölmek için tanıtıldı. geçmiş "tek" git checkout "komutunun dışında.


Yanıtlar:


167

Bağlandığınız belgelere göre, tek amacı iki farklı kullanımı bölmek ve açıklığa kavuşturmaktır git checkout:

  • git switchşimdi, dalları değiştirmek için kullanılabilir git checkout <branchname>yapar
  • git restoregibi belirli revizyonlar dosyaları sıfırlamak için kullanılabilir git checkout --<path_to_file>yapar

Stackoverflow ile git checkoutilgili birçok sorudan da görebileceğiniz gibi, insanların bu farklı kullanım yöntemleri kafaları karışıyor git checkout. Git geliştiricileri bunu hesaba katmış görünüyor.


30
Bu iyi bir değişiklik gibi görünüyor. Şube yapmak mı? git checkoutŞube değiştirilsin mi? git checkoutBir dosyanın belirli bir sürümünü mü edinin? git checkoutBir dosyadaki değişiklikler kaldırılsın mı? git checkoutAçıkçası, normal git iş akışının ne kadarının çeşitli bayraklarla yapılabileceğini merak ediyorum git checkout.
Captain Man

4
Artık git checkoutteknik olarak artık hiçbir şey için gerekli olmayan fikir mi? Yoksa, dal başlığı olmayan bir kesinlemeyi kontrol etmek gibi bazı şeyler için hala kullanılıyor mu ("ayrık kafa" moduna geçme)?
PieterNuyts

4
@Mike Ödeme şubeleri yapar dedikten sonra kasanın şubeleri bir cümle yapmadığını nasıl söylersiniz? -bBayrağın iç işleyişi önemli değil . Hala bir şube yapıyor.
Kaptan Adam

4
@CaptainMan, checkout işlem bir şube oluşturmaz, yalnızca mevcut bir şubeye geçiş yapabilir. -bSeçeneği checkout komutu dahili bir performans git branchaslında ödeme yapmadan önce. Bu, + git pulliçin bir kısayol olduğu gibi aynıdır . git fetchgit merge
Mike

4
Faydalı not: git checkout -b <branch name>git switch -c <branch name>
Alışkın olduğunuz kişiler

66

git checkout ilgisiz birkaç kullanımı olan bir İsviçre çakısı gibi.

Bir dosyayı değiştirirseniz ancak değişikliği aşamalandırmadıysanız, değişiklikleri git checkout <filename>tersine çevirir ... bir dosyadaki değişiklikleri iptal etmenin hızlı ve kolay bir yolu. Aynı şubede kalıyorsunuz.

git checkout <branchname> (belirttiğiniz gibi) dalları değiştirir.

Bir dosya adı ve şube adı benzerse karışıklığa yol açabilecek tamamen farklı iki amaç.

Bunu iki komut olarak almak daha net.


Bahsettiğiniz gibi aynı isimli bir şubeye ve dosyaya sahip olmak kafa karıştırıcı. Şubenin dosyaya göre öncelikli olduğunu varsayıyorum, çünkü bu genellikle daha arzu edilir bir durumdur. Ya da bu nasıl çalışıyor?
AgentM

@AgentM Evet, bu doğru. Bir dal ve dosya aynı ada sahipse, yapmak git checkout <name>dosya yerine dalı tercih eder.
Kartik Soneji

2

switchbazı sınırlamalar mevcuttur: Eğer geçiş yapabilirsiniz anda gelen herhangi taahhüt <branch name>ancak anahtara imkansız gelen <branch name> belirli bir durumu olan işlemeye müstakil HEAD . Bu nedenle kullanmanız gerekir git checkout 5efb(burada 5efb, keyfi işleme için bir karma referans örneğidir)


3
Bunun aslında bir özellik olduğunu ve bir hata (sınırlama) olmadığını iddia ediyorum. switchtek amacı şubeleri değiştirmek için yaratılmıştır ve bunu yaptığınızda, o şubenin BAŞINDA olmak istersiniz. checkoutçalışma kopyanızı geçmişteki herhangi bir duruma (= commit) getiren daha genel bir işlemdir. Herhangi bir dal adı, o dalın HEAD yürütmesi için bir takma ad olduğundan, bir dalı kullanıma almak teknik olarak diğer herhangi bir kaydetmeyi denetlemekten farklı değildir.
Mike

13
ile -dşunları yapabilirsiniz:git switch -d 6c13
Mendi Barel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.