태그 보관물: git-reset

git-reset

Git에서 파일을 스테이지 해제하는 두 가지 방법이있는 이유는 무엇입니까?

때때로 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 -m a
[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>unstage 어떤 주어진 파일 (들)에 대한 변화를 개최.

즉, git rm --cached준비된 새 파일을 사용한 경우 이전에 커밋되지 않았으므로 기본적으로 준비를 해제 한 것처럼 보입니다.

git 2.24 업데이트이
새로운 버전의 git에서는 git restore --staged대신 사용할 수 있습니다 git reset. 자식 문서를 참조하십시오 .


답변

git rm --cached색인에서 파일을 제거하는 데 사용됩니다. 파일이 이미 저장소에있는 git rm --cached경우 색인에서 파일을 제거하고 작업 디렉토리에 그대로두고 커밋은 이제 저장소에서도 파일을 제거합니다. 기본적으로 커밋 후 파일의 버전을 해제하고 로컬 복사본을 유지했을 것입니다.

git reset HEAD file(기본적으로 --mixed플래그를 사용하는 ) 파일이 이미 리포지토리에있는 경우 파일의 인덱스 버전이 리포지토리 (HEAD)의 파일 버전으로 대체되어 수정 내용 을 효과적으로 준비 하지 않습니다.

버전이없는 파일의 경우 파일이 HEAD에 없기 때문에 전체 파일을 스테이지 해제합니다. 이러한 측면에서 git reset HEAD filegit rm --cached동일하지만합니다 (REPO 이미 파일의 경우에 설명 된대로) 그들은 동일하지 않습니다

문제는 Why are there 2 ways to unstage a file in git?-실제로 git에서 아무것도 할 수있는 유일한 방법은 없습니다. 그것은 그것의 아름다움입니다 🙂


답변

아주 간단하게 :

  • git rm --cached <file> git이 파일 추적을 완전히 멈추게합니다 (일반과는 달리 파일 시스템에 남겨 둡니다 git rm)
  • git reset HEAD <file> 마지막 커밋 이후에 파일에 대한 수정 사항을 스테이지 해제합니다 (그러나 명령 이름이 제안하는 것과는 반대로 파일 시스템에서 되 돌리지 않습니다). 파일은 개정 관리 상태에 있습니다.

파일이 이전에 개정 제어 상태에 있지 않은 경우 (즉 git add, 처음에 방금 편집 한 파일의 준비를 취소하는 중 ) 두 명령은 동일한 효과를 가지므로 “두 가지 작업을 수행하는 두 가지 방법” “.

* 이전 에 저장소 에 커밋git rm --cached 된 파일 과 관련하여 @DrewT의 대답에주의해야 합니다. 이 질문의 맥락에서 파일이 추가되었지만 아직 커밋되지 않은 파일에 대해서는 걱정할 것이 없습니다.

** 나는 그 이름 때문에 git reset 명령을 사용하는 것이 당황스럽게 너무 무서웠습니다. 그러나 여전히 오늘날 나는 종종 실수하지 않도록 구문을 찾습니다. ( 업데이트 : 마침내 tldr 페이지 의 사용법git reset요약하는 데 시간이 걸렸 으므로 이제는 작동 방식에 대한 더 나은 정신 모델과 세부 사항을 잊었을 때에 대한 빠른 참조가 있습니다.)


답변

이 스레드는 약간 오래되었지만 여전히 직관적 인 문제가 아니기 때문에 약간의 데모를 추가하고 싶습니다.

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)

세 가지 유형의 변화 모두에 적용되는 …


답변

실수로 커밋하지 않을 파일을 준비하고 변경 사항을 유지하려면 다음을 사용할 수 있습니다.

git stash
git stash pop

HEAD로 재설정하고 변경 사항을 다시 적용하여 커밋을 위해 개별 파일을 다시 준비 할 수 있습니다. 풀 요청에 대한 기능 분기를 작성하지 않은 경우에도 유용합니다 ( git stash ; git checkout -b <feature> ; git stash pop).


답변

이 두 명령은 문제의 파일이 이미 저장소에 있고 버전 제어하에있는 경우 (이전 커밋 된 등) 몇 가지 미묘한 차이가 있습니다.

  • git reset HEAD <file> 현재 커밋에서 파일을 스테이지 해제합니다.
  • git rm --cached <file>향후 커밋을 위해 파일의 스테이지를 해제합니다. 로 다시 추가 될 때까지 준비되지 않은 상태입니다 git add <file>.

그리고 한 가지 더 중요한 차이점이 있습니다.

  • 실행 git rm --cached <file>하고 분기를 원격으로 푸시하면 원격에서 분기를 당기는 사람은 로컬 작업 세트에서 파일이 추적되지 않게되지만 폴더에서 실제로 삭제되지 않는 경우에도 폴더에서 파일을 실제로 삭제합니다.

이 마지막 차이점은 팀의 각 개발자가 다른 구성 (예 : 다른 기본 URL, IP 또는 포트 설정)을 갖는 구성 파일을 포함하는 프로젝트에 중요하므로 git rm --cached <file>지점을 당기는 사람을 사용 하는 경우 수동으로 다시 삭제는 사람들이 원격에서 분기를 당기는 사람들에게만 영향을 미치기 때문에 구성을 만들거나 직접 보낼 수 있으며 IP 설정 등으로 다시 편집 할 수 있습니다.


답변

하자 당신에게 말을 stage통해 전체 디렉토리를 git add <folder>,하지만 당신은 목록 (실행시 생성 즉 목록을 무대에서 파일을 제외 할 git status) 및 유지 당신이 뭔가 작업을하고 제외 된 파일 내에서 수정을 (그리고 커밋 준비가 아니지만, 당신은 당신의 일을 잃고 싶지 않습니다 …). 간단하게 사용할 수 있습니다 :

git reset <file>

당신이 실행하면 git status, 당신은 그 어떤 파일 (들) 당신이 볼 수 reset있는 unstaged당신이 파일의 나머지 added아직 staged목록을.