Git çıkış çift tire anlamı


274

Bu git komutundaki dosya adından önceki çift tire işaretinin anlamı nedir?

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

Zorunlular mı? Eşit mi

git checkout --ours path/to/file.txt
git checkout --theirs path/to/file.txt

24

15
@iltempo: Git için biraz farklı. Git için, ağaçların ve yolların aynı görünebileceği durumlarda ağacı yollardan ayırır.
Dietrich Epp

@Dietrich_Epp. Anlıyorum. Açıkladığınız için teşekkürler.
iltempo


3
Bu bir kopyadır, ancak bu kopya en azından 'git double dash' sorgusuyla googleable.
thorn̈

Yanıtlar:


376

path/to/file.txtGit veri havuzumda bir dosyam olduğunu ve bu dosyadaki değişiklikleri geri almak istediğimizi varsayalım .

git checkout path/to/file.txt

Şimdi dosyanın ismini verdiğini varsayalım master...

git checkout master

Tüh! Bunun yerine dallar değişti. --Ayırır ağaç Eğer kontrol etmek istiyorum dosyalarından kontrol etmek istiyorum.

git checkout -- master

Ayrıca bazı freako depomuza bir dosya eklediyse bize yardımcı olur -f:

git checkout -f      # wrong
git checkout -- -f   # right

Bu, git-checkout: Bağımsız Değişken Belirleme'de belgelenmiştir .


12
Bu sadece git komutları için değil, birçok bash komutu için geçerli, değil mi?
NHDaly

40
@NHDaly: Evet, bu doğru. Ancak, bir terminoloji notu: "Bash" sadece birkaç komut içerir (belki 20 veya daha fazla), çoğu komut Bash'ten ayrı programlardır. Aslında, --seçenekleri diğer argümanlardan ayırmak için kullanılabilen POSIX standardının bir parçasıdır , bu yüzden cpve mv(Bash'in bir parçası olmayan) gibi komutlarda göreceksiniz .
Dietrich Epp

6
Bu sözdiziminin neden checkoutkomut belgelerinde doğru bir şekilde tanımlanmadığı hakkında bir fikriniz var mı?
TanguyP

4
@DietrichEpp Birçok yerde, checkoutkomutun olası bir parametresi gibi listelenir , ancak belgeler hiçbir yerde ne yaptığını veya neden kullanıldığını açıklamıyor ... sonuçta beni buraya getirdi.
chris

7
@DietrichEpp Doğru, ancak Stack Overflow'a gelmeden önce sözdizimini (ve örnekleri) okuduktan sonra, neden kullanmak isteyeceğinizi veya istemeyeceğinizi hala anlamadım --. Linux geçmişinden gelmeyen biri olarak bunun ne olduğu belli değil. Bana göre, işlevsel amacının açıklaması olmayan git'e özgü bir sözdizimi gibi görünüyordu. Diğer seçenekler gibi kısa bir açıklama veya en azından bir linux man sayfasına bir bağlantı olması daha iyi olacağını düşünüyorum .
chris

109

Çift çizgi "-", "komut satırı bayraklarının sonu" anlamına gelir; yani, önceki komuta komut satırı seçeneklerinden sonra gelenleri ayrıştırmaya çalışmamasını söyler.


2
Açıklık gitgetirmek gerekirse, bundan daha fazlası anlamına gelir, çünkü bu, --bir dal adı olamaz ve önceki argüman --bir dosya yolu olamaz.
Gem Taylor

0

Git 2.5 (2. Çeyrek 2015) ' --' bağımsız değişkeniniz joker karakter içeriyorsa ( *)

" git <cmd> <revs> <pathspec>" Komut satırı kuralının yanlış yazılan yolları yakalamasına yardımcı olacak bir buluşsal yöntem, komut satırının sonraki bölümündeki tüm rev olmayan parametrelerin çalışma ağacındaki dosyaların adları olduğundan emin olmaktır, ancak bu " git grep $str -- \*.c" her zaman " --" ile netleştirildi , çünkü kimse aklı başında tam anlamıyla yıldız işareti olan bir dosya oluşturmayacak.

Git 2.5 , bir joker karakter dizesiyle kullanıcının bize bir yol belirtmesi gerektiğini bildirmek için buluşsal yöntemi kaybeder .

git checkout 'a*'
# same as
git checkout -- 'a*'

Bkz . Duy Nguyen ( ) tarafından 28fcc0b (02 Mayıs 2015 ) . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 949d167 tamamlama 2015 19 Mayıs)nguyenlocduy
gitster

pathspec: --joker karakter kullanıldığında " " gereksiniminden kaçının

--Komut satırında " " bulunmadığında ve bir komut hem devir hem de yol alabiliyorsa, fikir bir argümanın hem genişletilmiş SHA-1 hem de yol olarak görülebiliyor olması durumunda " --" gereklidir veya git devam etmeyi reddeder.
Şu anda uygulanmaktadır:

  • (1) bir argüman rev ise, çalışma ağacında mevcut olmamalıdır
  • (2) başka, çalışma ağacında var olmalıdır
  • (3) " --" gereklidir.

Bu kurallar değişmez yollar için çalışır, ancak değişmez yol türü dahil edildiğinde, neredeyse her zaman kullanıcının " --" eklemesini gerektirir, çünkü başarısız olur (2) ve (1) gerçekten nadiren karşılanır ( *.cörneğin " " alır , (1) " *.c" adında bir ref varsa karşılaşılır ).

Bu düzeltme eki, *"çalışma ağacında mevcut" herhangi bir geçerli ( ) joker karakter yolu dikkate alınarak kuralları biraz değiştirir .
Kurallar:

  • (1) bağımsız değişken bir devirse, çalışma ağacında var olmalı veya geçerli bir joker karakter yolu türü olmamalıdır.
  • (2) aksi takdirde, ya çalışma ağacında bulunur ya da bir joker karakter yoludur
  • (3) " --" gereklidir.

Yeni kurallarda, " --" joker karakter pathspec'inin dahil olduğu çoğu zaman gerekli değildir.


Git 2.26 (Q1 2020) ile, revizyonları ve pathspec'i ayırmak için netleştirme mantığı, ters eğik çizgiden kaçan glob özel karakterlerinin "joker karakterler pathspec" kuralında sayılmaması için ayarlanmıştır.

Bkz . Jeff King ( ) tarafından yapılan 39e21c6 (25 Ocak 2020) taahhüdü . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 341f8a6 tamamlama 2020 12 Şubat)peff
gitster

verify_filename(): "joker karakterler pathspecs" kuralında ters eğik çizgileri işleme

Rapor eden: David Burström
İmzalayan: Jeff King

Taahhüt 28fcc0b71a ( pathspec: --joker karakter kullanıldığında " " gereksiniminden kaçının , 2015-05-02) izin verdi:

git rev-parse '*.c'

çift ​​çizgi olmadan.

Ancak joker karakterleri kontrol etmek için kullandığı kural aslında herhangi bir özel küreyi arar.
Bu aşırı liberal a\bbir durumdur , çünkü " " gibi herhangi bir joker karakter eşleşmesi yapmayan bir desenin bir yol türü olarak kabul edileceği anlamına gelir.

Diskte böyle bir dosya varsa, muhtemelen istediğiniz şey budur.
Ancak bunu yapmazsanız, sonuçlar kafa karıştırıcıdır: " there's no such path a\b" demek yerine , sessizce hiçbir şeyle eşleşmeyen (veya en azından istediğiniz gibi olmayan) bir pathspec olarak sessizce kabul edeceğiz.
Aynı şekilde, " a\*b" yolunu aramak da aramayı genişletmez; yalnızca tek bir giriş bulur " a*b".

Bu komut, kuralı yalnızca glob metakarakterleri aramayı genişlettiğinde tetiklemeye geçirir, yani bu iki durum da artık bir hata rapor edecektir --(elbette " " kullanarak yine de belirsizliğe varabilirsiniz; DWIM buluşsal yöntemini sıkıyoruz).

( DWIM: Ne demek istediğimi yap )

Orijinal özelliği 28fcc0b71a'da hiç test etmediğimizi unutmayın .
Yani bu yama sadece bu köşe vakalarını test etmekle kalmaz, aynı zamanda mevcut davranış için bir regresyon testi de ekler.

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.