질문자 :Senthess
때때로 git은 파일을 언스테이징하기 위해 git rm --cached
git reset HEAD file
을 제안합니다. 언제 어떤 것을 사용해야 하나요?
편집하다:
D:\code\gt2>git init Initialized empty Git repository in D:/code/gt2/.git/ D:\code\gt2>touch a D:\code\gt2>git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add a D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a # D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a D:\code\gt2>touch b D:\code\gt2>git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # b nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add b D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b #
git rm --cached <filePath>
는 파일을 언스테이징하지 않고 실제로 리포지토리에서 파일 제거를 준비 하지만(이미 커밋되었다고 가정) 작업 트리에 파일을 남겨둡니다(추적되지 않은 파일).
git reset -- <filePath>
는 주어진 파일에 대한 모든 단계적 변경을 언스테이징합니다.
즉, git rm --cached
를 사용하면 이전에 커밋된 적이 없기 때문에 기본적으로 방금 언스테이징한 것처럼 보일 것입니다.
자식 2.24 업데이트
이 최신 버전의 git에서는 git reset
git restore --staged
를 사용할 수 있습니다. 자식 문서를 참조하십시오.
Ryan Stewartgit rm --cached
는 인덱스에서 파일을 제거하는 데 사용됩니다. 파일이 이미 리포지토리에 있는 경우 git rm --cached
는 인덱스에서 파일을 제거하고 작업 디렉토리에 남겨두고 커밋은 이제 리포지토리에서도 파일을 제거합니다. 기본적으로 커밋 후에 파일의 버전을 해제하고 로컬 복사본을 보관해야 합니다.
git reset HEAD file
(기본적으로 --mixed
플래그를 사용함)은 파일이 이미 repo에 있는 경우 파일의 인덱스 버전을 repo(HEAD)의 인덱스 버전으로 대체한다는 점에서 다릅니다. 수정 사항 을 언스테이징합니다.
버전이 지정되지 않은 파일의 경우 파일이 HEAD에 없었기 때문에 전체 파일을 언스테이징합니다. 이 측면에서 git reset HEAD file
과 git rm --cached
는 동일하지만 동일하지 않습니다(이미 리포지토리에 있는 파일의 경우 설명).
Why are there 2 ways to unstage a file in git?
- git에서 무엇이든 할 수 있는 유일한 방법은 없습니다. 그것이 그것의 아름다움입니다 :)
manojlds아주 간단하게:
-
git rm --cached <file>
은 git이 파일 추적을 완전히 중지하도록 합니다 git rm
*와 달리 파일 시스템에 그대로 둡니다). -
git reset HEAD <file>
은 마지막 커밋 이후 파일에 대한 모든 수정 사항을 언스테이징합니다 (그러나 명령 이름에서 제안하는 것과는 달리 파일 시스템에서 되돌리지는 않음**). 파일은 개정 관리 하에 남아 있습니다.
파일이 이전에 개정 제어에 없었다면(즉 git add
ed를 추가한 파일을 언스테이징하는 경우) 두 명령은 동일한 효과를 가지므로 "두 가지 방법으로 뭔가를하고".
* 이전에 저장소 에 커밋 된 파일의 git rm --cached
와 관련하여 @DrewT가 그의 답변에서 언급한 주의 사항을 명심하십시오. 이 질문의 맥락에서 방금 추가되고 아직 커밋되지 않은 파일에 대해서는 걱정할 것이 없습니다.
** 나는 그 이름 때문에 창피할 정도로 오랫동안 git reset 명령을 사용하는 것이 두려웠고, 오늘날에도 나는 종종 내가 망치지 않도록 구문을 찾습니다. ( 업데이트: 마침내 tldr 페이지에서 git reset
의 사용법 을 요약하는 시간을 가졌으므로 이제 작동 방식에 대한 더 나은 정신적 모델과 일부 세부 사항을 잊어 버린 경우에 대한 빠른 참조가 있습니다.)
waldyrious이 스레드는 약간 오래되었지만 여전히 직관적인 문제가 아니기 때문에 약간의 데모를 추가하고 싶습니다.
me$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: to-be-added # modified: to-be-modified # deleted: to-be-removed # me$ git reset -q HEAD to-be-added # ok me$ git reset -q HEAD to-be-modified # ok me$ git reset -q HEAD to-be-removed # ok # or alternatively: me$ git reset -q HEAD to-be-added to-be-removed to-be-modified # ok me$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: to-be-modified # deleted: to-be-removed # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # to-be-added no changes added to commit (use "git add" and/or "git commit -a")
git reset HEAD
( -q
제외)는 수정된 파일에 대한 경고를 표시하고 종료 코드는 1이며 스크립트에서 오류로 간주됩니다.
편집: git checkout HEAD to-be-modified to-be-removed
는 언스테이징에도 작동하지만 작업 공간에서 변경 사항을 완전히 제거합니다.
git 2.23.0 업데이트: 때때로 명령이 변경됩니다. 이제 git status
는 다음과 같이 말합니다.
(use "git restore --staged <file>..." to unstage)
... 세 가지 유형의 변경 모두에 적용됩니다.
Daniel Alder커밋하고 싶지 않은 파일을 실수로 준비했고 변경 사항을 확실히 유지하려면 다음을 사용할 수도 있습니다.
git stash git stash pop
이렇게 하면 HEAD로 재설정이 수행되고 변경 사항이 다시 적용되어 커밋을 위해 개별 파일을 다시 준비할 수 있습니다. 이것은 pull 요청을 위한 기능 분기를 만드는 것을 잊은 경우에도 유용합니다( git stash ; git checkout -b <feature> ; git stash pop
).
ives문제의 파일이 이미 저장소에 있고 버전 제어(이전에 커밋된 등) 하에 있는 경우 이 두 명령에는 몇 가지 미묘한 차이점이 있습니다.
-
git reset HEAD <file>
은 현재 커밋에서 파일을 언스테이징합니다. -
git rm --cached <file>
은 향후 커밋을 위해 파일을 언스테이징합니다. git add <file>
다시 추가될 때까지 스테이지되지 않습니다.
그리고 한 가지 더 중요한 차이점이 있습니다.
- 실행 한 후
git rm --cached <file>
원격으로 분기를 밀어 원격에서 분기를 당기는 사람, 즉 (로컬 작업에 단지가 추적되지하게 파일을 설정에도 불구하고, 실제로 폴더에서 삭제 된 파일을하지 얻을 것이다 폴더에서 물리적으로 삭제됨).
이 마지막 차이점은 팀의 각 개발자가 다른 구성(즉, 다른 기본 URL, IP 또는 포트 설정)을 갖는 구성 파일을 포함하는 프로젝트에 중요 git rm --cached <file>
당신의 브랜치는 설정을 수동으로 다시 생성해야 할 것입니다. 그렇지 않으면 당신이 그것들을 보낼 수 있고 그들은 그것을 그들의 ip 설정(등)으로 다시 편집할 수 있습니다. 삭제는 원격에서 당신의 브랜치를 가져오는 사람들에게만 영향을 미치기 때문입니다.
DrewT하자가 당신이 말하는 stage
를 통해 전체 디렉토리 git add <folder>
,하지만 당신은 목록 (실행시 생성 즉, 목록 무대에서 파일을 제외 할 git status
) 그리고 당신이 뭔가 작업을하고 (제외 된 파일 내에서 수정을 유지 커밋할 준비가 되지 않았지만 작업을 잃고 싶지는 않습니다...). 다음을 간단히 사용할 수 있습니다.
git reset <file>
당신이 실행하면 git status
, 당신이 어떤 파일 (들)이 볼 reset
되어이 unstaged
하고 나머지 파일 added
(가) 아직 staged
목록을.
jiminikiz1.
D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a
(언스테이징하려면 "git rm --cached ..."를 사용)
2.
D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a
자식 커밋 -ma
삼.
D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b #
("git reset HEAD ..."를 사용하여 언스테이징)
- 현재 코드에서 커밋을 수행했습니다.
- 이제 커밋에 대한 포인터를 재설정할 수 있습니다. ' 마지막 저장으로 되돌리기 '
Timothy L.J. Stewart그냥 사용:
git reset HEAD <filename>
이렇게 하면 파일이 언스테이징되고 변경 사항이 유지되므로 원하는 경우 분기를 변경하고 git add
해당 파일을 대신 다른 분기에 추가할 수 있습니다. 모든 변경 사항이 유지됩니다.
Edgar Quintero아무도 git reflog ( http://git-scm.com/docs/git-reflog )를 언급하지 않은 것에 놀랐습니다.
# git reflog <find the place before your staged anything> # git reset HEAD@{1}
reflog는 리포지토리에 대한 변경 사항을 추적할 뿐만 아니라 사용자 작업(예: pull, 다른 분기로 체크아웃 등)을 추적하고 해당 작업을 취소할 수 있는 git 기록입니다. 따라서 실수로 스테이징된 파일을 언스테이징하는 대신 파일을 스테이징하지 않은 지점으로 되돌릴 수 있습니다.
git reset HEAD <file>
과 유사하지만 경우에 따라 더 세분화될 수 있습니다.
죄송합니다. 귀하의 질문에 대한 답변은 아니지만 제가 자주 사용하는 파일을 언스테이징하는 또 다른 방법을 알려드립니다.
Alex버전 2.23 이상에서만,
이러한 제안 대신 git restore --staged <file>
를 unstage
하여 파일을 언스테이징할 수 있습니다.
Kaan Taha Kökengit rm --cached <file>
rm <file>
git rm <file>
이 두 가지 작업을 모두 수행하는 디렉토리에서 파일을 제거하지 않고 인덱스에서 파일을 제거하는 것 같습니다. 버전 관리를 제거하지 않고 디렉토리에서.
Community Wiki> 2.2인 최신 버전에서는 git restore --staged <file_name>
사용할 수 있습니다. 참고 여기에서 파일을 한 번에 하나씩 스테이지 해제(변경 사항으로 이동)하려면 파일 이름과 함께 위의 명령을 사용합니다. 예
git restore --staged abc.html
이제 모든 파일을 한 번에 언스테이징하려면 다음과 같이 할 수 있습니다.
git restore --staged .
스테이징된 모든 파일을 고려한다는 의미의 공백과 점 (.)에 유의하십시오.
DEEPAK출처 : http:www.stackoverflow.com/questions/6919121/why-are-there-two-ways-to-unstage-a-file-in-git