커밋을 분할하고 사용할 재설정 옵션을 확실하지 않습니다.
나는 페이지를보고있다 영어로 “git reset”은 무엇을 하는가? 하지만 git index 또는 staging 영역이 무엇인지 이해하지 못해 설명이 도움이되지 않는다는 것을 깨달았습니다.
또한, 그 대답에서 (사용하고 수정하고 다시 커밋 할 때) 유스 케이스 --mixed
와 --soft
나에게도 동일하게 보입니다. 누군가 더 분해 할 수 있습니까? 나는 --mixed
아마도 함께 갈 수있는 옵션 이라는 것을 알고 있지만 그 이유 를 알고 싶습니다 . 마지막으로 --hard
어떻습니까?
누군가 3 가지 옵션을 선택하는 방법에 대한 워크 플로 예를 제공 할 수 있습니까?
답변
리포지토리에서 파일을 수정하면 초기에 변경 사항이 취소됩니다. 커밋하려면을 사용하여 준비해야 git add
합니다. 즉, 인덱스에 추가해야합니다 . 커밋 할 때 커밋 된 변경 내용은 인덱스에 추가 된 변경 사항입니다.
git reset
현재 분기 ( HEAD
)가 가리키는 위치는 최소한 변경됩니다 . 차이 --mixed
및 --soft
색인도 수정 여부입니다. 따라서 우리 master
가이 일련의 커밋 으로 분기 하는 경우 :
- A - B - C (master)
HEAD
를 가리키고 C
색인이 일치 C
합니다.
우리가 실행하는 경우 git reset --soft B
, master
(그래서 HEAD
) 이제 가리키는 B
하지만, 지수는 여전히의 변경이있다 C
; git status
단계별로 표시합니다. 따라서이 git commit
시점에서 실행 하면와 동일한 변경 사항으로 새로운 커밋을 얻게됩니다 C
.
자, 여기서부터 다시 시작하십시오.
- A - B - C (master)
이제하자 git reset --mixed B
. (참고 : --mixed
기본 옵션입니다). 다시 한번, master
그리고 HEAD
B를 가리킨하지만,이 시간은 인덱스도 일치하도록 수정됩니다 B
. git commit
이 시점에서 실행 하면 인덱스가 일치하므로 아무 일도 일어나지 않습니다 HEAD
. 작업 디렉토리에는 여전히 변경 사항이 있지만 색인에 없으므로 변경되지 않은 것으로 git status
표시됩니다. 커밋하려면 git add
평소처럼 커밋하십시오.
그리고 마지막으로, --hard
같은 것입니다 --mixed
(그것이 당신의 변화 HEAD
즉 제외하고, 인덱스) --hard
도 작업 디렉토리를 수정합니다. 에 C
있고 실행 중이면에 git reset --hard B
추가 된 변경 사항 C
과 커밋되지 않은 변경 사항이 제거되고 작업 복사본의 파일이 commit과 일치 B
합니다. 이 방법으로 변경 사항을 영구적으로 잃을 수 있으므로 git status
하드 리셋을 수행 하기 전에 항상 실행 하여 작업 디렉토리가 깨끗하거나 커밋되지 않은 변경 사항을 잃어 버릴 수 있는지 확인해야합니다.
그리고 마지막으로 시각화 :
답변
가장 간단한 용어로 :
--soft
: 커밋을 취소 하면 변경 사항이 준비됩니다 ( index ).--mixed
(기본값) : uncommit + unstage changes, 변경 사항은 작업 트리에 남아 있습니다.--hard
: 커밋 해제 + 스테이지 해제 + 변경 사항 삭제 , 남은 항목 없음.
답변
이 복잡한 기능을 이해하기위한 첫 번째 단계로 단순화 된 설명입니다.
다음 각 명령 후에 프로젝트 상태를 시각화하려는 시각 학습자에게 도움이 될 수 있습니다.
색상을 켠 상태에서 터미널을 사용하는 사용자 (git config –global color.ui auto) :
git reset --soft A
그리고 당신은 B와 C의 물건을 녹색으로 볼 것입니다 (단계적이며 커밋 준비 완료)
git reset --mixed A
(또는 git reset A
) B와 C의 내용이 빨간색으로 표시됩니다 (미 준비 및 준비 (녹색) 및 커밋 준비 완료).
git reset --hard A
더 이상 어디에도 B와 C의 변화가 보이지 않을 것입니다.
또는 ‘Tower’또는 ‘SourceTree’와 같은 GUI 프로그램을 사용하는 사람들
git reset --soft A
‘준비된 파일’영역에서 B와 C의 내용을 커밋 할 준비가 된 것을 볼 수 있습니다.
git reset --mixed A
(또는 git reset A
) ‘스테이지되지 않은 파일’영역에서 B 및 C의 항목을 스테이지로 이동 한 다음 커밋 할 수 있습니다.
git reset --hard A
더 이상 어디에도 B와 C의 변화가 보이지 않을 것입니다.
답변
다른 모든 답변은 중대하다,하지만 난 최선이 세 가지 범주로 파일을 분해하여 그들을 이해하고 찾을 : unstaged
, staged
, commit
:
--hard
이해하기 쉬워야합니다. 모든 것을 복원합니다.--mixed
(기본값) :unstaged
파일 : 변경하지 마십시오staged
파일 : 이동unstaged
commit
파일 : 이동unstaged
--soft
:unstaged
파일 : 변경하지 마십시오staged
파일 : 변경하지 마십시오commit
파일 : 이동staged
요약하자면:
--soft
옵션은 모든unstaged
파일 ( 파일 제외 )을staging area
--mixed
옵션은 모든 것을unstaged area
답변
TortoiseGit 사용자를위한 기본 설명은 다음과 같습니다.
git reset --soft
및 --mixed
훼손되지 않은 파일을 둡니다.
git reset --hard
실제로 재설정 한 커밋과 일치하도록 파일 을 변경하십시오 .
TortoiseGit 에서 인덱스 의 개념은 GUI에 의해 숨겨져 있습니다. 파일을 수정할 때 git add
준비 영역 / 인덱스에 변경 사항을 추가 하기 위해 실행할 필요는 없습니다 . 단순히 파일 이름을 변경하지 않는 기존 파일에 대한 수정을 다루는 경우 git reset --soft
와 --mixed
동일합니다! 새 파일을 추가하거나 파일 이름을 바꾼 경우에만 차이가 있습니다. 이 경우 git reset –mixed를 실행하면 버전 이 지정 되지 않은 파일 목록 에서 파일을 다시 추가해야합니다 .
답변
이 경우 희망적으로 이것을 설명 할 수있는 비주얼을 좋아합니다.
git reset --[hard/mixed/soft]
:
따라서 각 효과마다 다른 범위
- Hard => WorkingDir + Index + HEAD
- 혼합 => 색인 + HEAD
- Soft => HEAD 만 해당 (인덱스 및 작업 디렉토리는 변경되지 않음).
답변
후회의 세 가지 유형
많은 기존 답변이 실제 질문에 답변하지 않는 것 같습니다. 명령은 사용자 (사용자)가 원하는 것이 아니라 사용 사례에 관한 것이 아닙니다 . 그러나 그것이 OP가 요구 한 것입니다!
명령 을 내릴 때 후회 하는 것이 정확히 무엇인지에 관한 설명을 요약하면 도움이 될 수 있습니다 git reset
. 우리가 이것을 가지고 있다고 가정 해 봅시다.
A - B - C - D <- HEAD
다음은 가능한 후회와 이에 대한 조치입니다.
1. 나는 B, C, D가 하나의 커밋 이 아니라는 것을 후회한다 .
git reset --soft A
. A 는 하나의 커밋 이므로 모든 변경 사항을 즉시 커밋하고 미리 설정할 수 있습니다 .
2. 나는 B, C, D가 10 개의 커밋 이 아니라는 것을 후회 한다.
git reset --mixed A
. 커밋이 사라지고 인덱스가 A로 돌아 왔지만 작업 영역은 여전히 D 다음과 같이 보입니다. 이제는 완전히 다른 그룹으로 추가 및 커밋 할 수 있습니다.
3. 나는 이 지점에서 B, C, D가 일어난 것을 후회한다 ; 나는 A 다음에 지점을 가지기를 원했고 그들은 다른 지점에서 일어났다.
새 분기 otherbranch
를 만든 다음 git reset --hard A
. 현재 지점은 이제 A에서 끝나며 그 지점에서 otherbranch
파생됩니다.
(물론 B, C 및 D가 전혀 발생하지 않기를 원하기 때문에 하드 리셋을 사용할 수도 있습니다.)