콘텐츠를 삭제하지 않고 많은 수의 파일을 분할하는 방법
다음을 사용하여 실수로 많은 임시 파일을 추가했습니다.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
.
추가된 파일의 스테이징을 해제할 뿐만 아니라 작업 디렉토리에서 변경한 내용도 되돌립니다.작업 디렉토리에 새 파일을 만든 경우에도 파일은 삭제되지 않습니다.
기본 레포가 있는 경우(또는 HEAD가 [1]설정되지 않은 경우) 간단히
rm .git/index
물론 추가하려는 파일을 다시 추가해야 합니다.
[1] 참고(댓글에 설명된 바와 같이) 이 문제는 일반적으로 레포가 새것("prisstine")이거나 커밋이 수행되지 않은 경우에만 발생합니다.좀 더 엄밀히 말하면, 체크아웃이나 작업 트리가 없을 때마다.
좀 더 분명히 해둘 뿐입니다 :)
사용하다git reset HEAD
수 (에는 파을제않재인다니합정설를인을 사용할 수 있습니다.)git reset HEAD -- /path/to/file
이를 위해.)
파이프 오퍼레이터는 셸에서 다음을 가져갑니다.stdout
왼쪽에 있는 프로세스의 다음과 같이 전달합니다.stdin
오른쪽 프로세스로 이동합니다.기본적으로 다음과 같습니다.
$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out
하지만 대신에 그것은.$ proc1 | proc2
두 번째 프로세스는 첫 번째 프로세스가 데이터를 출력하기 전에 데이터를 가져오기 시작할 수 있으며, 실제 파일은 포함되지 않습니다.
2019년 업데이트
관련 질문(여기, 여기, 여기, 여기, 여기, 여기, 여기 및 여기 참조)에서 다른 사람이 지적했듯이 이제 다음을 사용하여 파일의 스테이징을 해제할 수 있습니다.git restore --staged <file>
.
프로젝트에 있는 모든 파일의 스테이징을 해제하려면 리포지토리의 루트에서 다음을 실행합니다(명령은 재귀적임).
git restore --staged .
디렉터리에 있는 파일의 스테이징을 해제하려면 위를 실행하기 전에 디렉터리로 이동하거나 다음을 실행하십시오.
git restore --staged <directory-path>
메모들
git restore
2019년 7월에 소개되었으며 버전 2.23에 출시되었습니다.
과--staged
flag, 트리의 합니다(그래서 ).git add
변경 사항을 삭제하지 않습니다.)이 명령은 새 명령이지만 이전 명령의 동작은 변경되지 않습니다.은 서나이사람은들든래로 대답합니다.
git reset
또는git reset HEAD
여전히 완벽하게 유효합니다.을 할 때
git status
준비된 커밋되지 않은 파일과 함께, 이것은 이제 Git가 (대신) 준비되지 않은 파일을 사용하기 위해 제안하는 것입니다.git reset HEAD <file>
v2.23 이전 하게 됩니다.
git stash && git stash pop
되지 않은 HEAD를 그냥 .git
를 할 .
git rm -rf --cached .
모든 것을 해체하기 위해.이것은 사실상 Shehe의 솔루션과 동일하지만 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
작업 복사본 및 색인에서 커밋되지 않은 변경 사항을 제거합니다.그러나 이 상황에서는 마지막 약속을 할 때 상태로 돌아가기를 원하는 것처럼 들리며, 약속되지 않은 변경 사항은 어쨌든 손실되었습니다.
업데이트: 앰버의 답변에 대한 귀하의 의견을 보면 (헤드를 해결할 수 없기 때문에) 아직 커밋을 만들지 않은 것처럼 들리기 때문에 도움이 되지 않을 것 같습니다.
작동 는 다음과 같이 설명합니다.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
언급URL : https://stackoverflow.com/questions/7103631/how-to-unstage-large-number-of-files-without-deleting-the-content
'programing' 카테고리의 다른 글
3.x를 사용하여 람다 매개 변수에 대한 2.x의 튜플 언팩을 시뮬레이션하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
---|---|
git pull origin 마스터와 git pull origin/master 간의 차이 (0) | 2023.05.05 |
바이트를 int로 변환하시겠습니까? (0) | 2023.05.05 |
명령이 실패하면 어떻게 종료합니까? (0) | 2023.04.25 |
Swift 스크립트에서 터미널 명령을 실행하려면 어떻게 해야 합니까?(예: xcodebuild)입니다. (0) | 2023.04.25 |