IT story

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

hot-time 2020. 4. 25. 09:54
반응형

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


다음 명령을 수행했습니다

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

로컬 커밋을 삭제하고 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 "( "스테이징") 에 포함 할 변경 사항을 선택 합니다. 그리고 일단 변경 사항이 준비되면, " git commit "합니다.

스테이징 또는 커밋을 취소하려면 HEAD를 "재설정"하십시오. 브랜치에서 HEAD는 가장 최근의 커밋을 가리키는 git 변수입니다. 따라서 준비했지만 커밋하지 않은 경우 " git reset HEAD "입니다. 스테이지에서 변경을 수행하여 현재 HEAD로 백업합니다. " git reset --mixed HEAD ~ 0 "의 줄임말입니다 .

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

~ 또는 ^ 중 더 나은 기호는 무엇입니까? ~ 물결표를 단일 스트림 으로 생각하십시오 -각 커밋에 단일 부모가 있고 일련의 일련의 변경 사항 인 경우 물결표를 사용하여 스트림을 HEAD ~ 1, HEAD ~ 2, HEAD로 참조 할 수 있습니다 ~ 3, 부모, 조부모, 증조부모 등 (기술적으로 는 이전 세대 첫 번째 부모를 찾습니다 ).

병합이 있으면 커밋에 둘 이상의 부모가 있습니다. ^ 캐럿이 작동 할 때입니다. 나뭇 가지가 모이는 것을 보여주기 때문에 기억할 수 있습니다. 캐럿을 사용하면 HEAD ^ 1이 첫 번째 부모가되고 HEAD ^ 2는 단일 커밋의 두 번째 부모가됩니다 (예 : 어머니와 아버지).

따라서 단일 부모 커밋에서 하나의 홉으로 돌아가는 경우 HEAD ~와 HEAD ^는 동일합니다. 둘 중 하나를 사용할 수 있습니다.

또한 재설정은 --soft , --mixed 또는 --hard수 있습니다 . 소프트 재설정은 커밋을 취소하고 HEAD를 재설정하지만 이전 커밋에서 파일을 체크 아웃하지 않으므로 작업 디렉토리의 모든 변경 사항이 유지됩니다. 그리고 --soft 리셋 심지어 단계 (도 알려져 취소하지 않는 인덱스를 상연 된 모든 파일이 여전히 무대에있을 것입니다, 그래서).

--mixed 리셋 (기본값)도에서 파일을 체크 아웃하지 않는 이전의 모든 변경 사항이 유지되지만 무대가 삭제되도록, 커밋합니다. 이것이 바로 간단한 " git reset HEAD "가 무대에서 사라지는 이유 입니다.

- 하드 리셋은 머리를 재설정하고, 무대를 지우고 있지만, 모든 그것을 밖으로 또한 체크 파일에서 이전 커밋 그래서 모든 변경 사항을 덮어 씁니다.

커밋을 원격 저장소로 푸시 한 경우 재설정 이 제대로 작동하지 않습니다. 로컬로 재설정 할 수 있지만 원격으로 푸시하려고하면 git은 로컬 HEAD가 원격 분기의 HEAD 뒤에 있으며 푸시를 거부합니다. 푸시를 강제 할 수는 있지만 git은 실제로 그렇게하는 것을 좋아하지 않습니다.

양자 택일로, 당신은 할 수 숨기고 당신이 그들을 유지하려는 경우 변경 사항을 확인 이전 커밋들이 새로운 커밋 만든 다음 그 밀어 단, 변경 사항을 취소 숨기고.


n 개의 커밋까지 변경 사항을 스테이지 해제하고 싶다고하자.

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

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

그런 다음 다음 명령을 실행하십시오.
git reset hn

이제 HEAD는 hn + 1이됩니다. h1에서 hn 로의 변경은 준비되지 않습니다.

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

반응형