답변:
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 commit --amend
. 그러나 훨씬 더 복잡한 작업 흐름. 좋은 방향을 제시하지만 (OP) OP가 묻는 질문에는 대답하지 않습니다 git reset
.
git reset --soft HEAD~
사용하다:
git reset HEAD^
기본적으로 "혼합"재설정이 수행되어 요청한 작업을 수행합니다. foo.java를 스테이지되지 않은 상태로두고 가장 최근의 커밋을 제거하십시오.
git reset --soft
작동하지는 git reset HEAD^
않았지만
나에게 다음은 더 읽기 쉬운 방법이므로 바람직합니다.
git reset HEAD~1
대신 1
스테이지를 취소하려는 커밋이 얼마든지있을 수 있습니다.
git reset --soft
그냥 그렇습니다 :과 git reset --hard
같지만 파일을 만지지 마십시오.
git reset
" git reset --hard
파일 과 같지만 터치하지 않습니다." 아닙니다 git reset --soft
. git reset --soft
변경 사항을 준비하므로 커밋하려는 경우 스테이징에 추가하지 않아도되지만 그렇지 않은 경우에는 변경하지 않아도됩니다 git reset
(예, 두 번째,없이 --soft
). 그래서 그 대답은 짧지 만 틀립니다.
"재설정"은 로컬에서 변경 사항을 취소하는 방법입니다. 커밋 할 때 먼저 " 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 개의 커밋까지 변경 사항을 스테이지 해제하고 싶다고하자.
커밋 해시는 다음과 같습니다.
그런 다음 다음 명령을 실행하십시오.
git reset hn
이제 HEAD는 hn + 1이됩니다. h1에서 hn 로의 변경은 준비되지 않습니다.