힘내 체크 아웃 의미 더블 대시


274

이 git 명령에서 파일 이름 앞에 이중 대시의 의미는 무엇입니까?

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

그들은 필수입니까? 그것은 동등합니까

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


15
@ iltempo : Git과 약간 다릅니다. Git의 경우 나무와 경로가 동일하게 보이는 경우 경로에서 나무를 분리합니다.
Dietrich Epp

Di 내가 참조. 설명해 주셔서 감사합니다.
iltempo


3
그것은 중복이지만이 중복은 적어도 쿼리 'git double dash'에 의해 구글 가능합니다.
thorn̈

답변:


376

path/to/file.txtGit 리포지토리에 이름이 지정된 파일이 있고 변경 내용을 되돌리고 싶다고 가정 합니다.

git checkout path/to/file.txt

이제 파일 이름이 master...

git checkout master

으악! 대신 브랜치가 변경되었습니다. --분리형은 나무 당신은 당신이 체크 아웃 할 파일에서 확인하시기 바랍니다.

git checkout -- master

일부 괴물이 -f저장소에 이름이 지정된 파일을 추가 한 경우에도 도움이됩니다 .

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

이것은 git-checkout : Argument Disambiguation에 설명되어 있습니다.


12
이것은 git 명령뿐만 아니라 많은 bash 명령에 적용됩니다.
NHDaly

40
@NHDaly : 그렇습니다. 그러나 용어 메모 : "Bash"에는 몇 개의 명령 만있을 수 있으며 (20 개 정도 정도) 대부분의 명령은 Bash와 별개의 프로그램입니다. 실제로는 --옵션을 다른 인수와 구분하는 데 사용할 수있는 POSIX 표준의 일부 이므로 cpand mv(Bash의 일부는 아님) 명령에서 볼 수 있습니다.
Dietrich Epp

6
이 구문이 왜 checkout명령 문서 에 제대로 설명되어 있지 않은지 아십니까?
TanguyP

4
@DietrichEpp 여러 곳에서 checkout명령에 가능한 매개 변수처럼 나열되어 있지만 설명서에서 그 기능 또는 사용 이유를 설명하는 곳은 없습니다.
chris

7
@DietrichEpp 맞지만 Stack Overflow에 오기 전에 구문과 예제를 읽은 후에도 왜 사용하고 싶지 않은지 이해하지 못했습니다 --. 리눅스 배경에서 오지 않은 사람은 그것이 무엇인지 분명하지 않습니다. 나에게, 그것은 기능적 목적에 대한 설명없이 git 고유의 구문 인 것처럼 보였다. 다른 옵션과 같은 간단한 설명이나 적어도 리눅스 매뉴얼 페이지에 대한 링크를 갖는 것이 좋습니다.
chris

109

이중 대시 "-"는 "명령 줄 플래그 끝"을 의미합니다. 즉, 명령 줄 옵션 뒤에 오는 내용을 구문 분석하지 않도록 이전 명령에 지시합니다.


2
명확성을 위해, git이것보다 큰 의미는 --분기 이름이 --될 수없는 인수를 의미하기 때문에 이전의 인수 는 파일 경로가 될 수 없습니다.
보석 테일러

0

--인수에 와일드 카드 ( *)가 포함 된 경우 Git 2.5 (2015 년 2 분기)에 ' '가 있으므로 필요하지 않습니다.

git <cmd> <revs> <pathspec>잘못 입력 된 경로를 잡기 위한 " "명령 행 규칙 을 돕는 휴리스틱은 명령 행의 후반 부분에있는 rev가 아닌 모든 매개 변수가 작업 트리의 파일 이름인지 확인하는 것이지만 " git grep $str -- \*.c"은 항상 " --제정신이 누구도 말 그대로 별표 (*)를 가진 파일을 만들지 않기 때문에 " "로 명확 해 집니다.

Git 2.5는 휴리스틱을 풀어 사용자가 와일드 카드 문자열을 사용하여 pathspec을 제공 할 수 있다고 선언했다 .

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

Duy Nguyen ( )의 commit 28fcc0b (2015 년 5 월 2 일)를 참조하십시오 . ( Junoio C Hamano의해 합병 - 커밋 949d167 , 2015 년 5 월 19 일)nguyenlocduy
gitster

pathspec: --와일드 카드 사용시 " " 필요 없음

" --"이 명령 행에없고 명령이 rev와 경로를 모두 취할 수있는 경우, 인수가 확장 된 SHA-1과 경로 둘 다로 간주 될 수 있으면 " --"가 필요하거나 git이 계속하기를 거부합니다.
현재 다음과 같이 구현됩니다.

  • (1) 인수가 rev이면 작업 트리에 존재해서는 안됩니다.
  • (2) 그렇지 않으면 워크 트리에 존재해야합니다.
  • (3) 그렇지 않으면 " --"가 필요합니다.

이러한 규칙은 리터럴 경로에 적용되지만 리터럴이 아닌 경로 사양이 포함 된 경우 거의 항상 " --" 를 추가해야합니다. " "(2) 실패하고 (1) 거의 충족되지 않기 때문에 " *.c"(예 : (1) " *.c") 라는 참조가 있으면 충족됩니다 .

이 패치는 유효한 ( *) 와일드 카드 경로 스펙을 "작업 트리에 있음" 으로 간주하여 규칙을 약간 수정합니다 .
규칙은 다음과 같습니다.

  • (1) arg가 rev 인 경우 작업 트리에 존재하거나 유효한 와일드 카드 경로 스펙이 아니어야합니다.
  • (2) 그렇지 않으면 워크 트리에 있거나 와일드 카드 경로 사양입니다.
  • (3) 그렇지 않으면 " --"가 필요합니다.

새로운 규칙을 사용 --하면 와일드 카드 경로 스펙이 관련된 대부분의 경우 " "가 필요하지 않습니다.


Git 2.26 (Q1 2020)에서는 백 슬래시 이스케이프 처리 된 glob 특수 문자가 "와일드 카드가 pathspec"규칙에 포함되지 않도록 개정 및 경로 사양을 구분하는 명확성 논리가 조정되었습니다.

Jeff King ( )의 commit 39e21c6 (2020 년 1 월 25 일)을 참조하십시오 . ( Junio ​​C Hamano의해 합병 -- 커밋 341f8a6 , 2020 년 2 월 12 일)peff
gitster

verify_filename(): "와일드 카드는 경로 스펙"규칙에서 백 슬래시 처리

보고자 : David Burström
서명자 : Jeff King

커밋 28fcc0b71a ( pathspec: --와일드 카드 사용시 " " 필요 없음 , 2015-05-02) 허용 :

git rev-parse '*.c'

이중 대시없이.

그러나 와일드 카드를 확인하는 데 사용되는 규칙은 실제로 어떤 특수 효과도 찾습니다.
" a\b" 와 같은 와일드 카드 일치를 실제로 수행하지 않는 패턴 은 경로 스펙으로 간주 됨을 의미하므로 지나치게 자유 롭습니다.

디스크에 이러한 파일이 있으면 아마도 원하는 것입니다.
그러나 그렇지 않으면 결과가 혼란스러워집니다. " there's no such path a\b" 라고 말하지 않고 아무 것도 일치하지 않는 (또는 적어도 의도 한 것과 일치하지 않는) 경로 사양으로 조용히 받아들입니다.
마찬가지로, 경로 " a\*b"를 검색해도 검색이 확장되지 않습니다. " a*b" 단일 항목 만 찾습니다 .

이 커밋은 glob 메타 문자가 검색을 확장 할 때만 규칙을 전환하여 두 경우 모두 오류를보고 함을 의미합니다 ( --물론 " "를 사용하여 명확하게 말할 수 있습니다 (DWIM 휴리스틱을 강화하고 있음)).

( DWIM : 무슨 뜻인지 )

우리는 28fcc0b71a 의 원래 기능을 전혀 테스트하지 않았습니다 .
따라서이 패치는 이러한 경우를 테스트 할뿐만 아니라 기존 동작에 대한 회귀 테스트를 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.