내용을 삭제하지 않고 많은 수의 파일을 스테이지 해제하는 방법
실수로 많은 임시 파일을 추가했습니다. git add -A
다음 명령을 사용하여 파일을 스테이지 해제하고 더티 인덱스를 제거했습니다.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
위의 명령은에 나열되어 있습니다 git help rm
. 그러나 슬프게도 캐시 옵션을 제공했지만 파일이 실행되면 삭제되었습니다. 내용을 잃지 않고 색인을 지우려면 어떻게해야합니까?
이 파이프 작동 방식을 누군가가 설명 할 수 있다면 도움이 될 것입니다.
git reset
지나치게 원하는 "git add"실행을 취소하는 것이 전부라면 :
git reset
변경 사항이 준비되지 않아 원하는대로 다시 추가 할 수 있습니다.
실행하지 마십시오 git reset --hard
.
추가 된 파일의 스테이지를 해제 할뿐만 아니라 작업 디렉토리에서 변경 한 내용을 되돌립니다. 작업 디렉토리에 새 파일을 만든 경우 삭제 하지는 않습니다 .
당신은 자연 그대로의 REPO가 (또는 HEAD가 설정되어 있지 않은) 경우 [1] 당신은 단순히 수
rm .git/index
물론, 이것은 당신이 한 파일을 다시 추가 할 필요 않은 추가되어야합니다.
[1] 참고 (주석에 설명 된 바와 같이)는 일반적으로 리포지토리가 최신 ( "원래")이거나 커밋되지 않은 경우에만 발생합니다. 기술적으로, 체크 아웃 또는 작업 트리가 없을 때마다.
더 명확하게 :)
git reset HEAD
파일을 제거하지 않고 색인을 재설정하는 데 사용하십시오 . 색인에서 특정 파일 만 재설정하려는 경우이를 사용하면됩니다 git reset HEAD -- /path/to/file
.
쉘에서 파이프 연산자 stdout
는 왼쪽의 프로세스를 가져 와서 stdin
오른쪽의 프로세스 로 전달합니다 . 그것은이다 본질적으로 동등한 :
$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out
그러나 대신 $ proc1 | proc2
, 두 번째 프로세스는 첫 번째 프로세스가 데이터를 출력하기 전에 데이터를 가져 오기 시작할 수 있으며 실제 파일은 없습니다.
git stash && git stash pop
HEAD가 설정되어 있지 않은 경우에도 할 수 있습니다
git rm -rf --cached .
모든 것을 무대에서 풀어야합니다. 이것은 실제로 sehe의 솔루션과 동일하지만 Git 내부와의 혼잡을 피합니다.
경고 : 커밋되지 않은 작업을 잃고 싶지 않으면 다음 명령을 사용하지 마십시오!
사용법 git reset
이 설명되었지만 파이프 명령에 대한 설명도 요청했습니다.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
이 명령 git ls-files
은 git이 알고있는 모든 파일을 나열합니다. 이 옵션 -z
은에 예상되는 형식으로 특정 형식을 적용한 xargs -0
다음이를 호출 rm -f
하여 승인 여부를 확인하지 않고 제거합니다.
즉, "git이 알고있는 모든 파일을 나열하고 로컬 사본을 제거하십시오".
그런 다음 git diff
git이 알고있는 다른 버전의 항목 사이의 변경 사항을 보여줍니다. 서로 다른 트리 간 변경, 로컬 복사본과 원격 복사본 간의 차이 등이 될 수 있습니다.
여기에 사용 된 비 단계적 변경 사항이 표시됩니다. 변경했지만 아직 커밋하지 않은 파일 이 옵션 --name-only
은 (전체) 파일 이름 만 원하며 --diff-filter=D
삭제 된 파일에만 관심이 있음을 의미합니다. (이봐, 우리는 단지 많은 것들을 삭제하지 않았는가?) 이것은 xargs -0
이전에 보았던 파이프로 파이프되어 호출 git rm --cached
되어 캐시에서 제거되고 작업 트리는 혼자 남겨 두어야합니다. 작업 트리에서 모든 파일을 제거했습니다. 이제 색인에서 제거되었습니다.
즉, 단계적이든 비 단계적이든 모든 변경 사항이 사라지고 작업 트리가 비어 있습니다. 외침을하고, 원본 또는 원격에서 파일을 새로 체크 아웃 한 후 작업을 다시 수행하십시오. 이 지옥의 선을 쓴 사디스트를 저주하십시오. 왜 아무도 이것을하고 싶어하는지 전혀 모르겠습니다.
TL; DR : 당신은 모든 것을 호스로 쳤습니다. 다시 시작 git reset
하여 지금부터 사용하십시오 .
명령 줄 중 첫 번째 줄이 작업 복사본에서 git의 준비 영역에있는 모든 파일을 무조건 삭제 한 것 같습니다. 두 번째는 추적되었지만 이제 삭제 된 모든 파일의 스테이지를 해제했습니다. 불행히도 이는 해당 파일에 대한 커밋되지 않은 수정 사항이 손실되었음을 의미합니다.
작업 복사본과 인덱스를 마지막 커밋 상태로 되돌리려 면 다음 명령을 신중하게 사용할 수 있습니다 .
git reset --hard
나는 git reset --hard
작업 카피 와 색인 에서 커밋되지 않은 변경을 없애기 때문에 "주의해서"라고 말합니다 . 그러나이 상황에서는 마지막 커밋시 상태로 돌아가고 커밋되지 않은 변경 사항이 손실 된 것처럼 보입니다.
업데이트 : 아직 HEAD를 해결할 수 없기 때문에 커밋을 만들지 않았다는 Amber의 답변에 대한 귀하의 의견에서 들리므로 도움이되지 않습니다.
어떻게 그 파이프 작업에 관해서는 : git ls-files -z
및 git diff --name-only --diff-filter=D -z
모두 출력 파일 이름 목록은 바이트로 구분 0
. (이것은 줄 바꿈과 달리 0
바이트가 유닉스 계열 시스템의 파일 이름에서 발생하지 않기 때문에 유용 합니다.) 프로그램 xargs
은 기본적으로 표준 입력에서 행을 가져 와서 끝에 추가하여 표준 입력에서 명령 행을 작성 합니다. 명령 줄 이 -0
옵션은 표준 입력이 0
바이트 로 구분되어 있다고 말합니다 . xargs
표준 입력에서 모든 매개 변수를 사용하기 위해 명령을 여러 번 호출하여 명령 행이 너무 길어지지 않도록하십시오.
간단한 예로, test.txt
다음과 같은 파일을 가진 파일이있는 경우 :
hello
goodbye
hello again
... 그러면 명령 xargs echo whatever < test.txt
이 명령 을 호출합니다.
echo whatever hello goodbye hello again
모든 변경 사항을 취소하려면 아래 명령을 사용하십시오.
git reset --soft HEAD
변경 사항을 스테이지 해제하고 작업 디렉토리에서 되돌리려면,
git reset --hard HEAD
'Programming' 카테고리의 다른 글
웹팩에서 jQuery 플러그인 종속성 관리 (0) | 2020.02.19 |
---|---|
정적 std :: map 초기화 (0) | 2020.02.19 |
MySQL의 DESCRIBE [table]에 해당하는 SQLite가 있습니까? (0) | 2020.02.19 |
파이썬에서 여러 분리 문자로 문자열 분리하기 (0) | 2020.02.19 |
Mac에서 Android Studio를 완전히 제거하는 방법은 무엇입니까? (0) | 2020.02.19 |