source

git reset --mixed, --soft, 그리고 --hard의 차이점은 무엇입니까?

manycodes 2023. 4. 16. 15:22
반응형

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)

HEADC와 일치합니다.C.

git reset --soft B,master)HEAD을.B, 는 아직 이 있습니다.Cgit 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는 작업 디렉토리도 변경합니다.우리가 있는 곳에 있다면Cgit 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 AB와 C의 내용이 녹색으로 표시됩니다(준비되어 커밋 준비가 완료됨).

git reset --mixed A (오류)git reset AB와 C의 물건은 빨간색으로 표시됩니다(스테이지 되어 있지 않고 스테이징할 준비가 되어 있습니다(녹색), 커밋 완료).

git reset --hard AB와 C의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).


또한 '타워' 또는 '소스 트리'와 같은 GUI 프로그램을 사용하는 사용자도 있습니다.

git reset --soft A가 된C의 이 '됩니다.

git reset --mixed A (오류)git reset A 않은 파일'후가 되어 것을 볼 수

git reset --hard AB와 C의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).

세 가지 후회

기존의 많은 답변들이 실제 질문에 답하지 못하는 것 같다.이 명령어는 사용자가 원하는 것, 즉 사용 사례에 대한 것이 아니라 명령어의 기능에 관한 것은 아닙니다.하지만 그게 작전본부가 물어본 거야!

그 설명을 설명하는 것이 더 도움이 될 수 있습니다.그 때, 당신이 정확히 후회하는 것이 무엇인지에 대해서요.git reset명령어를 입력합니다.예를 들어 다음과 같습니다.

A - B - C - D <- HEAD

다음은 후회할 수 있는 몇 가지 사항과 그에 대한 대처 방법입니다.

1. B, C, D는 하나의 커밋이 아닌 것이 유감입니다.

git reset --soft AA가 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 (기본값):
    1. unstaged파일: 변경하지 않음
    2. staged "로 : "로 이동unstaged
    3. commit "로 : "로 이동unstaged
  • --soft다음과 같습니다.
    1. unstaged파일: 변경하지 않음
    2. staged파일: 변경하지 않음
    3. commit "로 : "로 이동staged

요약:

  • --soft을 지정하면 됩니다(제외).unstaged파일)로 변환합니다.staging area
  • --mixed을 선택하면 이 이동됩니다.unstaged area

이러한 경우, 나는 이것을 설명할 수 있는 시각적인 것이 좋다.

git reset --[hard/mixed/soft]:

여기에 이미지 설명 입력

따라서 각각 다른 범위에 영향을 미칩니다.

  1. 하드 => WorkingDir + 인덱스 + HEAD
  2. 혼합 => 지수 + HEAD
  3. 소프트 => HEAD만(인덱스 및 현용 디르 변경 없음).

여러분은 그들 사이의 차이점을 기억하도록 스스로에게 강요할 필요가 없습니다.당신이 실제로 어떻게 약속을 했는지 생각해 보세요.

  1. 몇 가지 변경을 가합니다.

  2. git add .

  3. 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 --softHEAD(분리된 헤드 상태에서 시작), 일반적으로 (및 사용 목적에 맞게) 현재 체크아웃한 분기 참조를 이동합니다.물론 브런치를 체크 아웃하지 않으면 이 기능을 실행할 수 없습니다(따라서 특정 조건은 다음과 같습니다).git reset --softHEAD

는 이것이 git reset만 게 HEAD(모든 것이 그렇게 됩니다), 지점 참조도 이동합니다. 예를 들어,master 하면 '아예'를 했을 때 과 비슷합니다.git commit은 (지금의 지점은)와 합니다.HEAD새로운 커밋을 작성하는(및 이행하는) 것을 제외하고, 이전의 커밋으로 이행합니다.

이것이 포인트입니다.브런치를 변경하지 않고 새로운 커밋 이외의 것으로 변경하는 것입니다.이것은 문서의 예에서 확인할 수 있습니다.

커밋을 실행 취소하여 토픽 분기로 만듭니다.

          $ git branch topic/wip     (1)
          $ git reset --hard HEAD~3  (2)
          $ git checkout topic/wip   (3)
  1. 당신은 몇 가지 약속을 했지만, 그것이 "마스터" 지점에 있는 것은 시기상조라는 것을 깨달으세요.토픽 브랜치로 계속 연마하려면 현재 HEAD에서 "토픽/위프" 브랜치를 만듭니다.
  2. 마스터 브랜치를 되감아 이들 3개의 커밋을 삭제합니다.
  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> : : : : : : : :?--mixedAND는 작업 디렉토리도 덮어씁니다.이 명령어는 다음과 같습니다.git checkout <ref> (입니다.)resetbranch 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(마스터)

  1. 첫 번째 포인트는 새로운 브랜치를 만드는 것입니다.git branch my new branch.그 후, 다음과 같이 됩니다.

A-B-C-D(마스터 및 마이뉴브런치)

  1. 여기서 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

반응형