git reset --mixed, --soft, 그리고 --hard의 차이점은 무엇입니까?
커밋을 분할하려고 하는데 어떤 리셋 옵션을 사용해야 할지 잘 모르겠습니다.
영어로 "git reset"이 무엇을 하는지 페이지를 보고 있었는데, git 인덱스나 스테이징 영역이 무엇인지 잘 모르겠다는 것을 깨달았기 때문에 설명이 도움이 되지 않았습니다.
또, 다음의 사용 예에 대해서도,--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
is is is is is와 --mixed
은 당신의 (자신의)를 .HEAD
의 합니다.--hard
는 작업 디렉토리도 변경합니다.우리가 있는 곳에 있다면C
git reset --hard B
은 다음과 같습니다C
않은 내의 은 commit "commit " " " " " " " " " " " 와 B
.될 수 항상 을 실행해야 git status
하드 리셋을 실행하기 전에 작업 디렉토리가 깨끗한지, 커밋되지 않은 변경 내용이 손실되어도 문제가 없는지 확인합니다.
가장 간단한 용어로:
- : 변경을 커밋 해제하고 변경은 스테이징된 상태로 둡니다
--soft
(인덱스). --mixed
(기본값): uncommit + unstage 변경. 변경은 작업 트리에 남습니다.--hard
: uncommit + unstage + delete changes, 아무것도 남지 않았습니다.
이는 이 복잡한 기능을 이해하기 위한 첫 번째 단계로서 간략화된 설명임을 유의하시기 바랍니다.
각 명령어 후에 프로젝트 상태를 시각화하고 싶은 시각 학습자에게 도움이 됩니다.
정::- A - B - C (master)
색상이 켜진 상태에서 터미널을 사용하는 경우(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의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).
또한 '타워' 또는 '소스 트리'와 같은 GUI 프로그램을 사용하는 사용자도 있습니다.
git reset --soft A
가 된C의 이 '됩니다.
git reset --mixed A
(오류)git reset A
않은 파일'후가 되어 것을 볼 수
git reset --hard A
B와 C의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).
세 가지 후회
기존의 많은 답변들이 실제 질문에 답하지 못하는 것 같다.이 명령어는 사용자가 원하는 것, 즉 사용 사례에 대한 것이 아니라 명령어의 기능에 관한 것은 아닙니다.하지만 그게 작전본부가 물어본 거야!
그 설명을 설명하는 것이 더 도움이 될 수 있습니다.그 때, 당신이 정확히 후회하는 것이 무엇인지에 대해서요.git reset
명령어를 입력합니다.예를 들어 다음과 같습니다.
A - B - C - D <- HEAD
다음은 후회할 수 있는 몇 가지 사항과 그에 대한 대처 방법입니다.
1. B, C, D는 하나의 커밋이 아닌 것이 유감입니다.
git reset --soft A
A가 1개의 커밋이기 때문에 즉시 커밋과 프레스토를 할 수 있게 되었습니다.
2. B, C, D는 2개의 커밋(또는 10개의 커밋 등)이 아닌 것이 유감입니다.
git reset --mixed A
커밋은 없어지고 인덱스는 A로 돌아갔지만 작업영역은 D 이후처럼 보입니다.이제 전혀 다른 그룹에서 추가 및 커밋을 수행할 수 있습니다.
3. 이 지점에서 B, C, D가 발생한 것을 유감스럽게 생각합니다.A 다음에 분기해서 다른 지점에서 일어났으면 좋았을 텐데.
브런치를 만듭니다.otherbranch
, , 을 누릅니다.git reset --hard A
되며, A로 종료됩니다.otherbranch
.B, C, D.B를 하는 물질입니다.
(물론 하드리셋도 사용할 수 있습니다.B, C, D가 전혀 발생하지 않았으면 좋겠다고 생각하기 때문입니다).
모든 을 세 범주로 좋습니다.unstaged
,staged
,commit
:
--hard
모든 을 회복할 수 있다.모든 것을 복구합니다.--mixed
(기본값):unstaged
파일: 변경하지 않음staged
"로 : "로 이동unstaged
commit
"로 : "로 이동unstaged
--soft
다음과 같습니다.unstaged
파일: 변경하지 않음staged
파일: 변경하지 않음commit
"로 : "로 이동staged
요약:
--soft
을 지정하면 됩니다(제외).unstaged
파일)로 변환합니다.staging area
--mixed
을 선택하면 이 이동됩니다.unstaged area
이러한 경우, 나는 이것을 설명할 수 있는 시각적인 것이 좋다.
git reset --[hard/mixed/soft]
:
따라서 각각 다른 범위에 영향을 미칩니다.
- 하드 => WorkingDir + 인덱스 + HEAD
- 혼합 => 지수 + HEAD
- 소프트 => HEAD만(인덱스 및 현용 디르 변경 없음).
여러분은 그들 사이의 차이점을 기억하도록 스스로에게 강요할 필요가 없습니다.당신이 실제로 어떻게 약속을 했는지 생각해 보세요.
몇 가지 변경을 가합니다.
git add .
git commit -m "I did Something"
Soft, Mixed, Hard는 3에서 1로 운영하던 작업을 포기할 수 있는 방법입니다.
- 지금까지 본 적이 없는 부드러운 '척'
git commit
. - 지금까지 본 적이 없는 '가식'이 혼재하다
git add .
- 파일을 변경한 적이 없다는 것을 알 수 없을 정도로 「가식」입니다.
다음은 TortoiseGit 사용자를 위한 기본 설명입니다.
git reset --soft
★★★★★★★★★★★★★★★★★」--mixed
츠키노
git reset --hard
리셋한 커밋과 일치하도록 파일을 변경합니다.
TortoiseGit에서 인덱스의 개념은 GUI에 의해 매우 숨겨져 있습니다.파일을 수정할 때 실행할 필요가 없습니다.git add
스테이징 영역/인덱스에 변경을 추가합니다.는, 「」를 참조해 .git reset --soft
★★★★★★★★★★★★★★★★★」--mixed
똑같아!새 파일을 추가하거나 파일 이름을 변경한 경우에만 차이를 알 수 있습니다.이 경우 git reset --mixed를 실행하면 Not Versioned Files 목록에서 파일을 다시 추가해야 합니다.
mkarasek의 답변은 훌륭합니다.간단히 말하면...
git reset --soft
를합니다.HEAD
합니다.git reset --mixed
요.git reset --soft
것입니다.git reset --hard
을합니다.HEAD
커밋을 지정하고, 커밋되지 않은 변경을 포함한 마지막 커밋으로부터의 모든 변경을 리셋 합니다.
--soft
★★★★★★★★★★★★★★★★★」--mixed
하려면 , 「스테이징 에리어」를 사용하는 것이 유일한 는 「스테이징 에리어」의 변경을 보관 유지하는 경우--soft
않는 를 사용합니다.--mixed
★★★★★★ 。
이 세 가지 옵션을 선택하기 전에 세 가지를 이해해야 합니다.
1) 이력/헤드
2) 스테이지/인덱스
3) 작업 디렉토리
reset --soft : 이력 변경, HEAD 변경, 작업 디렉토리 변경 없음.
reset --mixed : 이력 변경, HEAD 변경, 작업 디렉토리 변경 및 미스테이지 데이터 변경.
reset --hard : 이력 변경, HEAD 변경, 데이터 손실로 작업 디렉토리 변경.
Git --soft를 사용하는 것은 항상 안전합니다.복잡한 요건에서는 다른 옵션을 사용해야 합니다.
에서는 '오해하다'에 대한 오해가 있습니다.git reset --soft
,, 정, 특, 특, 특, 특, 특, 특, 특, ., ., ., ., ., ., ., ..git reset --soft
할 HEAD
(분리된 헤드 상태에서 시작), 일반적으로 (및 사용 목적에 맞게) 현재 체크아웃한 분기 참조를 이동합니다.물론 브런치를 체크 아웃하지 않으면 이 기능을 실행할 수 없습니다(따라서 특정 조건은 다음과 같습니다).git reset --soft
할 HEAD
는 이것이 git reset
만 게 HEAD
(모든 것이 그렇게 됩니다), 지점 참조도 이동합니다. 예를 들어,master
하면 '아예'를 했을 때 과 비슷합니다.git commit
은 (지금의 지점은)와 합니다.HEAD
새로운 커밋을 작성하는(및 이행하는) 것을 제외하고, 이전의 커밋으로 이행합니다.
이것이 포인트입니다.브런치를 변경하지 않고 새로운 커밋 이외의 것으로 변경하는 것입니다.이것은 문서의 예에서 확인할 수 있습니다.
커밋을 실행 취소하여 토픽 분기로 만듭니다.
$ git branch topic/wip (1) $ git reset --hard HEAD~3 (2) $ git checkout topic/wip (3)
- 당신은 몇 가지 약속을 했지만, 그것이 "마스터" 지점에 있는 것은 시기상조라는 것을 깨달으세요.토픽 브랜치로 계속 연마하려면 현재 HEAD에서 "토픽/위프" 브랜치를 만듭니다.
- 마스터 브랜치를 되감아 이들 3개의 커밋을 삭제합니다.
- 「Topic/wip」브런치로 전환해, 작업을 계속합니다.
이 일련의 명령의 요점은 무엇입니까?지점을 이동하려면 여기를 클릭하십시오.master
에, 「」를 가지고 있는 동안은, 「」를 참조해 주세요.master
아웃을 '체크 아웃 '체크 아웃', '체크 아웃'을 클릭합니다.git reset
.
여기서 가장 많이 투표된 답변은 대체로 좋지만, 오해가 있는 몇 가지 답변을 수정하기 위해 이 내용을 추가하려고 합니다.
지점 변경
git reset --soft <ref>
.「 」 。<ref>
작업 디렉토리 및 인덱스의 파일은 변경되지 않습니다. 바로 .git reset
명령어를 입력합니다.
인덱스도 변경해주세요
git reset --mixed <ref>
또는 동등하게
git reset <ref>
:
가 ㅇㅇㅇㅇㅇ?--soft
또한 AND는 지정된 참조의 커밋과 일치하도록 인덱스를 리셋합니다.하는 동안에git reset --soft HEAD
브랜치로 에) 아무것도 않습니다.git reset --mixed HEAD
하게 「」를 참조해 주세요git reset HEAD
는 인덱스를 마지막 커밋 상태로 리셋하기 때문에 일반적이고 유용한 명령어입니다.
작업 디렉토리도 변경합니다.
git reset --hard <ref>
: : : : : : : :?--mixed
AND는 작업 디렉토리도 덮어씁니다.이 명령어는 다음과 같습니다.git checkout <ref>
(입니다.)reset
branch ref가 가리키는 모든 형식의 이동.
"이러한 명령어가 HEAD를 이동한다"에 대한 메모:
가 「」를 이 되지 않습니다.HEAD
는, 「」를 HEAD
바로그 the the the the the the HEAD
네가 어디에 있든 포인터야HEAD
당신이니까 언제든지 움직일 수 있어요
--mixed vs --soft vs --hard:
--mixed:
Delete changes from the local repository and staging area.
It won't touch the working directory.
Possible to revert back changes by using the following commands.
- git add
- git commit
Working tree won't be clean.
--soft:
Deleted changes only from the local repository.
It won't touch the staging area and working directory.
Possible to revert back changes by using the following command.
- git commit.
Working tree won't be clean
--hard:
Deleted changes from everywhere.
Not possible to revert changes.
The working tree will be clean.
메모: 커밋이 로컬저장소로 확인되고 해당 커밋을 파기하기 위해 사용할 수 있습니다.
`git reset command`.
단, 하지 않는 이 좋습니다.또, 「 」, 「 」, 「 」의 리셋을 사용할 필요가 있습니다.또한 이 명령어를 사용해야 합니다.revert command
리모트 커밋을 파기합니다.
3가지 옵션이 사용되는 컨텍스트에 대한 간단한 답변:
코드의 현재 변경을 유지하되 커밋 이력을 다시 쓰려면 다음 절차를 수행합니다.
soft
: 을 한 에 커밋하고 할 수 기타 GUI를 커밋을 하고 다른 개의 커밋을 할 수 모든 것을 한 번에 커밋하고 새로운 설명을 사용하여 새로운 커밋을 작성할 수 있습니다(torotise git 또는 다른 대부분의 GUI를 사용하는 경우, 커밋에 원하는 파일을 체크하고 다른 파일로 여러 개의 커밋을 할 수 있기 때문에 이 커밋을 사용할 수 있습니다).Sourcetree ))))) ))))) ))))) )))))))) 。mixed
파일을 된 모든 커밋하기 전에 개별 파일을 인덱스에 다시 추가해야 합니다(Sourcetree에서는 변경된 모든 파일은 스테이징되지 않습니다).
코드의 변경 내용도 실제로 소실하려면 다음 절차를 따릅니다.
hard
: 까지 모든 변경
git reset 명령어의 다양한 옵션 간의 기본적인 차이점은 다음과 같습니다.
- --soft: 선택한 커밋으로 HEAD만 리셋합니다.기본적으로 git checkout과 동일하게 동작하지만 분리 헤드 상태는 생성되지 않습니다.
- --mixed(기본 옵션):HEAD를 기록에서 선택한 커밋으로 재설정하고 인덱스의 변경을 취소합니다.
- --hard: HEAD를 양쪽 이력에서 선택한 커밋으로 리셋하고 인덱스의 변경을 취소하며 작업 디렉토리의 변경을 취소합니다.
--soft
: 커밋으로 디렉토리가 Git에게 HEAD를 다른 커밋으로 리셋하도록 지시하여 인덱스와 작업 디렉토리가 변경되지 않도록 합니다.원래 HEAD와 커밋 사이에서 변경된 모든 파일이 스테이징됩니다.
--mixed
: 소프트와 마찬가지로 HEAD를 다른 커밋으로 리셋합니다.또한 작업 디렉토리는 건드리지 않고 인덱스와 일치하도록 인덱스를 재설정합니다.모든 변경은 작업 디렉토리에 남아 있고 수정된 것으로 표시되지만 스테이징되지는 않습니다.
--hard
것이 이치HEAD는 다른 커밋으로 리셋되고 인덱스와 일치하도록 리셋되며 작업 디렉토리도 그에 맞게 리셋됩니다.
「 」의 주된 --mixed
★★★★★★★★★★★★★★★★★」--soft
인덱스가 수정되었는지 여부입니다.자세한 내용은 여기를 참조하십시오.
Mo Ali는 이것을 가장 간단한 말로 표현했습니다.또 다른 간단한 설명은 다음과 같습니다.
--soft
: HEAD 포인터를 이전 커밋으로 리셋합니다.
--mixed
:--soft
+ 삭제add
변경 완료
--hard
--mixed
+ 작업 트리 파일 변경 복구 (CAREful »)
- 모든 유형의 재설정은 Repo에서 HEAD를 변경합니다.그리고...
git reset --soft <B>
로 이동합니다.repo는 이미 존재했던 커밋으로 병합합니다.git reset --hard <b>
작업 트리 및 인덱스의 변경 내용이 손실됩니다.
작업 트리를 변경하는 유일한 방법입니다.
저는 git 전문가가 아니고, 그것을 이해하기 위해 이 포럼에 온 것입니다!그래서 제 설명이 완벽하지 않은 것 같습니다, 죄송합니다.저는 다른 모든 답변이 도움이 된다는 것을 알았고 다른 관점을 제시하려고 노력할 것입니다.이 질문은 저자의 의도일지도 모르기 때문에 조금 수정하겠습니다. "나는 처음입니다. git를 사용하기 전에 main.c, main_1.c, main_2.c와 같이 파일명을 변경하고 있었습니다. 따라서 main_1.c로 돌아가기로 결정하면 나중에 필요할 수 있기 때문에 main_2.c와 main_3.c도 가지고 있습니다. 어떻게 하면 쉽게 같은 일을 git으로 할 수 있을까요?제 답변은 위의 Matt의 훌륭한 답변의 "후회 넘버 3"을 주로 사용하고 있습니다.첫 번째 질문도 "git을 사용할 때 후회가 있으면 어떻게 해야 하나요?"라고 생각하기 때문입니다.처음에는 상황이 이렇습니다.
A-B-C-D(마스터)
- 첫 번째 포인트는 새로운 브랜치를 만드는 것입니다.git branch my new branch.그 후, 다음과 같이 됩니다.
A-B-C-D(마스터 및 마이뉴브런치)
- 여기서 A로 돌아가고 싶다고 합니다(이전에는 3개의 커밋).두 번째 포인트는 위험하다는 것을 인터넷에서 읽을 수 있더라도 git reset --hard 명령어를 사용하는 것입니다.네, 위험합니다만, 변경은 커밋되지 않은 경우에만 가능합니다.따라서 방법은 다음과 같습니다.
Git reset --hard 후 umberofthe commita
또는
Git reset --hard master~3
다음으로 A(마스터)– B – C – D(my new branch)를 취득합니다.
그러면 A(마스터)로부터 작업을 계속하고 커밋할 수 있지만, 다른 브랜치인 git checkout mynew branch에서 체크 아웃하면 다른 버전에 쉽게 접근할 수 있습니다.이제 git reset --hard 명령어 전에 새로운 브랜치를 만드는 것을 잊었다고 가정해 봅시다.커밋 B, C, D가 없어졌습니까?아니요, 하지만 어느 지점에도 보관되어 있지 않습니다.이들을 다시 찾으려면 "안전 명령어"로 간주되는 "git reflog" 명령어를 사용할 수 있습니다. ("문제가 발생할 경우 침착하게 git reflog 사용").이 명령어는 어느 브랜치에도 속하지 않는 커밋을 모두 나열합니다.따라서 커밋 B, C 또는 D를 찾는 편리한 방법입니다.
언급URL : https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard
'source' 카테고리의 다른 글
WPF MVVM 패턴을 사용한 뷰 탐색 (0) | 2023.04.16 |
---|---|
,,,또는 SVG 파일의 경우?또는 SVG 파일의 경우?,,, , 「」 , 「」 , 「」 파일을 SVG 하는 . 파일을 SVG 하는 . 파일을 SVG 하는 .,,, ★★★★★★★★★★★★★★★★★」 ★★★★★★★★★★★.. (0) | 2023.04.16 |
목록 또는 태플에서 항목을 명시적으로 선택 (0) | 2023.04.16 |
ListBox 항목을 두 번 클릭하여 브라우저를 엽니다. (0) | 2023.04.11 |
각 파일 및 디렉토리의 크기를 나열하고 Bash에서 내림차순으로 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.11 |