programing

로컬 커밋 후 파일을 다시 스테이징 해제하려면 어떻게 해야 합니까?

muds 2023. 5. 21. 12:02
반응형

로컬 커밋 후 파일을 다시 스테이징 해제하려면 어떻게 해야 합니까?

다음 명령을 실행했습니다.

git add <foo.java>
git commit -m "add the foo.java file"

지금 로컬 커밋을 삭제하고 foo.java를 해제하려면 어떻게 해야 합니까?

입력하면git reset --hard수정된 내용을 되돌립니다.foo.java원래대로

git reset --soft HEAD~1당신이 원하는 것을 해야 합니다.이렇게 하면 인덱스의 첫 번째 변경 내용이 표시됩니다(으(으)로 표시됨git diff --cached) 및 최신 변경사항이 준비되지 않았습니다. git status그러면 다음과 같이 표시됩니다.

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.java
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.java
#

그러면 할 수 있습니다.git add foo.java두 가지 변경 사항을 동시에 적용할 수 있습니다.

사용:

git reset HEAD^

그러면 기본적으로 "혼합" 재설정이 수행되며, 이는 사용자가 요청한 작업을 수행합니다. foo.java를 스테이징되지 않은 상태로 두고 가장 최근의 커밋을 제거합니다.

저는 다음과 같은 방법을 사용하는 것이 더 읽기 쉽다고 생각합니다.

git reset HEAD~1

대신에1단계를 해제할 커밋이 얼마든지 있을 수 있습니다.

git reset --soft그것을 위한 것입니다: 그것은 마치.git reset --hard파일에는 손도 대지 않습니다

마지막 커밋에 있는 모든 파일의 스테이징을 해제하려면 -

git reset HEAD~

"재설정"은 로컬에서 변경사항을 실행 취소하는 방법입니다.커밋할 때 먼저 "git add"에 포함할 변경사항을 선택합니다. 이를 "staging"이라고 합니다.변경 사항이 준비되면 "커밋"합니다.

스테이징 또는 커밋에서 벗어나려면 HEAD를 "재설정"합니다.분기에서 HEAD는 가장 최근의 커밋을 가리키는 깃 변수입니다.그래서 만약 당신이 무대에 올랐지만 약속을 하지 않았다면, 당신은 "헤드 리셋"을 할 것입니다.변경 사항을 스테이지에서 제거하여 현재 HEAD로 백업합니다.이것은 "git reset --mixed HEAD~0"의 줄임말입니다.

이미 커밋한 경우 HEAD가 이미 진행되었으므로 이전 커밋으로 백업해야 합니다.여기서 "리셋 HEAD~1" 또는 "리셋 HEAD^1" 또는 "리셋 HEAD~" 또는 "리셋 HEAD^"-- 모두 HEAD에서 1을 뺀 참조입니다.

~와 ^ 중 어느 것이 더 나은 기호입니까?~tilde를 단일 스트림으로 생각해 보십시오. 각 커밋에 단일 부모가 있고 시퀀스의 일련의 변경 사항일 때는 부모, 조부모, 증조부모 등에 대해 HEAD~1, HEAD~2, HEAD~3으로 스트림을 백업할 수 있습니다(기술적으로 이전 세대에서 첫 번째 부모를 찾습니다).

병합이 있는 경우 커밋에는 두 개 이상의 상위 항목이 있습니다.이때 ^캐럿이 작동합니다. 분기가 함께 표시되기 때문에 기억할 수 있습니다.캐럿을 사용하면 HEAD^1이 첫 번째 부모가 되고 HEAD^2가 단일 커밋의 두 번째 부모(예: 어머니와 아버지)가 됩니다.

따라서 한 부모의 약속을 한 단계 더 거슬러 올라가면 HEAD~와 HEAD^는 동등합니다. 둘 중 하나를 사용할 수 있습니다.

또한 재설정은 소프트, 혼합 또는 하드일 수 있습니다.소프트 재설정은 HEAD를 재설정하지만, 이전 커밋의 파일을 체크아웃하지 않으므로 작업 디렉토리의 모든 변경 사항이 보존됩니다.그리고 --soft reset은 스테이지(인덱스라고도 함)를 지우지 않으므로 스테이징된 모든 파일은 스테이지에 남아 있습니다.

--mixed 재설정(기본값)도 이전 커밋의 파일을 체크아웃하지 않으므로 모든 변경사항이 보존되지만 단계는 지워집니다.그것이 간단한 " 리셋 HEAD"가 무대에서 지워지는 이유입니다.

--hard reset은 HEAD를 재설정하고 스테이지를 삭제하지만 이전 커밋의 모든 파일도 체크아웃하여 변경사항을 덮어씁니다.

원격 리포지토리에 커밋을 푸시한 경우 재설정이 제대로 작동하지 않습니다.로컬로 재설정할 수 있지만 원격으로 푸시하려고 하면 로컬 HEAD가 원격 분기의 HEAD 뒤에 있는 것을 확인하고 푸시를 거부합니다.당신은 강요할 수 있을지도 모르지만, 깃은 정말 그렇게 하는 것을 좋아하지 않습니다.

또는 변경 내용을 보관하고 이전 커밋을 체크아웃하고 변경 내용을 저장 해제한 후 스테이징하고 새 커밋을 생성한 다음 변경 내용을 푸시할 수 있습니다.

변경 사항을 커밋할 때까지 분할하려고 합니다.

커밋 해시는 다음과 같습니다.

  • h1
  • h2...
  • hn
  • hn+1

그런 다음 다음 명령을 실행합니다.
git reset hn

이제 HEAD는 n+1이 됩니다.h1에서 hn으로의 변경 사항은 스테이징되지 않습니다.

언급URL : https://stackoverflow.com/questions/6682740/how-can-i-unstage-my-files-again-after-making-a-local-commit

반응형