programing

git reset의 실용적인 사용 -- 소프트?

topblog 2023. 6. 22. 21:25
반응형

git reset의 실용적인 사용 -- 소프트?

저는 git와 일한 지 한 달이 조금 넘었습니다.사실 나는 어제 처음으로 리셋을 사용했지만, 소프트 리셋은 여전히 나에게 큰 의미가 없습니다.

디렉터리를 할 수 것으로 있습니다. 를 들어 소트 리 않 변 커 지 편 을 집 수 있 할 습 니 다 밋 고 하 프 경 터 디 리 렉 를 셋 사 작 업 을 용 인 덱 하 스 여 나 ▁i ▁without ▁to ▁a ▁or , ▁with ▁the ▁i 소 ▁would ▁commit stand ▁use ▁directory ▁i ▁the ▁altering 프 ▁reset ▁as ▁working있git commit --amend.

두 합니까?reset --softcommit --amend 또는 다른 하나 또는 다른 하나를 실용적인 용어로 사용할 이유가 있습니까?그리고 더 중요한 것은, 다른 용도가 있습니까?reset --soft약속을 수정하는 것 외에?

git reset이사하는 것이 전부입니다.HEAD그리고 일반적으로 지점 참조.
질문: 작업 트리와 인덱스는 어떻습니까?
께▁with와 함께 할 경우--soft이동, 가장 자주 지점 참조를 업데이트하고, 오직.
은 이와다 다니릅는과 .commit --amend다음과 같이:

  • 새 커밋을 만들지 않습니다.
  • 커밋으로 할 수 (" 실로헤임예이수있동다습니할로커으밋의드제를의예(▁it:다있▁can니습▁(▁actuallyas▁head수▁to▁any▁commit").commit --amend현재 커밋을 다시 실행할 수 있도록 허용하면서 HEAD를 움직이지 않는 에 대한 것입니다.)

다음을 결합한 예제를 찾았습니다.

  • 고전적 합병
  • 하위 트리 병합

모두 하나로(둘 이상의 분기가 병합되었기 때문에) 병합을 커밋합니다.

토마스 "were Hamster" Carnecky는 그의 "하위 나무 문어 병합" 기사에서 다음과 같이 설명합니다.

  • 하위 트리 병합 전략은 한 프로젝트를 다른 프로젝트의 하위 디렉터리로 병합한 후 하위 프로젝트를 최신 상태로 유지하려는 경우에 사용할 수 있습니다.이것은 git 서브모듈의 대안입니다.
  • 문어 병합 전략을 사용하여 세 개 이상의 분기를 병합할 수 있습니다.일반적인 전략은 두 개의 분기만 병합할 수 있으며, 그 이상의 분기를 병합하려고 하면 Git은 자동으로 문어 전략으로 되돌아갑니다.

문제는 하나의 전략만 선택할 수 있다는 점입니다.하지만 저는 전체 저장소가 새로운 버전으로 원자적으로 업데이트되는 깨끗한 기록을 얻기 위해 이 두 가지를 결합하고 싶었습니다.

나는 슈퍼 프로젝트가 있어, 그것으로 끝냅시다.projectA 프로젝트인 그고하위프트젝로리,,트,projectB가 내가하디병것합한에리의 한 것.projectA.

(하위 트리 병합 부분)

저는 또한 몇 가지 지역적 커밋을 유지하고 있습니다.
ProjectA업데이트됩니다.projectB며칠 또는 몇 주에 한 번씩 새 버전을 제공하며 일반적으로 의 특정 버전에 따라 다릅니다.projectA.

두 프로젝트를 모두 업데이트하기로 결정했을 때, 저는 단순한 작업을 중단하지 않습니다.projectA그리고.projectB 전체 프로젝트의 원자적 업데이트를 위해 개의 커밋을 생성할 수 있기 때문입니다.
대신 , 및 로컬 커밋을 결합한 단일 병합 커밋을 만듭니다.
여기서 까다로운 부분은 이것이 문어 병합(세 개의 머리)이지만 하위 트리 전략과 병합해야 한다는 것입니다.그래서 제가 하는 일은 다음과 같습니다.

# Merge projectA with the default strategy:
git merge projectA/master

# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master

여기서 저자는 다음을 사용했습니다.reset --hard,그리고 나서.read-tree처음 두 병합이 작업 트리 및 인덱스에 수행한 작업을 복원하는 것이 도움이 됩니다.
작동한 두 병합, 즉 작업 트리와 인덱스는 괜찮지만 두 커밋을 기록하지 않고 다시 수행하는 방법은 무엇입니까?

# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}

이제 Tomas의 솔루션을 다시 시작할 수 있습니다.

# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD

# And finally do the commit:
git commit

그래서, 매번:

  • (작업 트리 및 색인 측면에서) 최종 결과에 만족합니다.
  • 여러분은 거기에 도달하는 데 필요한 모든 커밋에 만족하지 않습니다.

git reset --soft정답입니다.

사용 사례 - 일련의 로컬 커밋 결합

"아이고, 그 세 번의 약속은 하나일 수도 있습니다."

따라서 인덱스나 작업 디렉터리에 영향을 주지 않고 마지막 3개(또는 임의)의 커밋을 실행 취소합니다.그런 다음 모든 변경 사항을 하나로 커밋합니다.

예.

> git add -A; git commit -m "Start here."
> git add -A; git commit -m "One"
> git add -A; git commit -m "Two"
> git add -A' git commit -m "Three"
> git log --oneline --graph -4 --decorate

> * da883dc (HEAD, master) Three
> * 92d3eb7 Two
> * c6e82d3 One
> * e1e8042 Start here.

> git reset --soft HEAD~3
> git log --oneline --graph -1 --decorate

> * e1e8042 Start here.

이제 모든 변경 사항이 보존되고 하나로 커밋될 준비가 되었습니다.

질문에 대한 간단한 답변

두 합니까?reset --softcommit --amend)?

  • 아니요.

하나 또는 다른 하나를 실용적인 용어로 사용할 이유가 있습니까?

  • commit --amend마지막 커밋의 파일을 추가/rm하여 메시지를 변경합니다.
  • reset --soft <commit>여러 개의 순차적 커밋을 새 커밋으로 결합합니다.

그리고 더 중요한 것은, 다른 용도가 있습니까?reset --soft약속을 수정하는 것 외에?

  • 다른 답변 보기 :)

나는 그것을 단지 마지막 약속 이상을 수정하는 데 사용합니다.

제가 A 커밋에서 실수를 하고 B 커밋을 했다고 가정해 보겠습니다.이제 저는 B만 수정할 수 있습니다.그래서 나는git reset --soft HEAD^^나는 A를 수정하고 다시 커밋한 다음 B를 다시 커밋합니다.

물론 대규모 커밋에는 그다지 편리하지 않습니다. 그러나 일반적으로 대규모 커밋을 수행하면 안 됩니다.

또 다른 잠재적인 용도는 스태킹의 대안으로 사용하는 것입니다(예: https://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/) 참조).

예를 들어 지점에서 작업 중이고 마스터에서 긴급하게 무언가를 수정해야 하는 경우 다음 작업을 수행할 수 있습니다.

git commit -am "In progress."

그런 다음 체크아웃 마스터와 수정을 수행합니다.작업이 끝나면 지점으로 돌아가 작업을 수행합니다.

git reset --soft HEAD~1

제가 중단했던 곳에서 일을 계속하는 것.

한 가지 실질적인 사용은 이미 로컬 레포(예: git commit -m)에 커밋한 경우 git reset --soft HEAD~1을 수행하여 마지막 커밋을 되돌릴 수 있습니다.

또한, 이미 변경 사항을 스테이징한 경우(즉, git add를 사용하여), git reset --mixed HEAD 또는 방금 일반적으로 사용한 것으로 스테이징을 되돌릴 수 있습니다.git reset

마지막으로, git reset -- 하드는 로컬 변경사항을 포함한 모든 것을 삭제합니다.~ 뒤의 머리글은 위에서 몇 번의 커밋을 수행해야 하는지 알려줍니다.

사용할 수 있습니다.git reset --soft인덱스 및 작업 트리에서 변경한 내용에 대해 상위 버전으로 가질 버전을 변경합니다.이것이 유용한 경우는 거의 없습니다.때때로 작업 트리에서 변경한 내용이 다른 분기에 속해야 한다고 결정할 수 있습니다.또는 여러 커밋을 하나로 축소하는 간단한 방법으로 사용할 수 있습니다(스쿼시/폴딩과 유사).

실질적인 예를 보려면 VonC의 이 답변을 참조하십시오. Git에서 처음커밋을 스쿼시하시겠습니까?

'을(를) 사용해야 하는 훌륭한 이유git reset --soft <sha1>이사하는 것입니다.HEAD맨몸으로

을 사용하려고 ,--mixed또는--hard존재하지 않는 트리 및/또는 인덱스를 수정하려고 하면 오류가 발생합니다.

참고: 이 작업은 기본 레포에서 직접 수행해야 합니다.

다시 참고:맨 레포에서 재설정할 분기가 활성 분기인지 확인해야 합니다.그렇지 않은 경우 레포에 직접 액세스할 수 있을 때 베어 레포의 활성 분기를 업데이트하는 방법에 대한 VonC의 답변을 따르십시오.

한 가지 가능한 사용 방법은 다른 컴퓨터에서 작업을 계속하려는 경우입니다.다음과 같이 작동합니다.

  1. 저장된 이름과 같은 새 지점을 확인합니다.

    git checkout -b <branchname>_stash
    
  2. 가지를 위로 밀어 올리고,

    git push -u origin <branchname>_stash
    
  3. 다른 컴퓨터로 전환합니다.

  4. 당신의 창고와 기존의 가지들을 모두 끌어내리세요.

    git checkout <branchname>_stash; git checkout <branchname>
    
  5. 지금 기존 지점에 있어야 합니다.스택 분기의 변경 내용을 병합합니다.

    git merge <branchname>_stash
    
  6. 병합하기 전에 기존 분기를 1로 소프트 재설정합니다.

    git reset --soft HEAD^
    
  7. 저장 브랜치를 제거합니다.

    git branch -d <branchname>_stash
    
  8. 또한 Stash 브랜치를 오리진에서 제거합니다.

    git push origin :<branchname>_stash
    
  9. 변경 내용을 정상적으로 저장한 것처럼 계속 작업합니다.

앞으로 GitHub과 Co.는 이 "원격 저장" 기능을 더 적은 단계로 제공해야 한다고 생각합니다.

는 이, 는 는나이스답정을좋만말지아다하나, 사니합용는의레드다▁use▁while,니▁i사▁in합용을 사용합니다.git reset --soft약간 다르지만, 그럼에도 불구하고 매우 실용적인 시나리오를 위해.

저는 개발을 위해 IDE를 사용하는데, 이 IDE는 마지막 커밋 이후의 변경 사항(단계별 및 단계별)을 표시하기에 좋은 차이 도구입니다.대부분의 작업에는 여러 커밋이 포함됩니다.예를 들어, 특정 작업을 완료하기 위해 5번의 커밋을 수행한다고 가정합니다.1-5까지 증분 커밋할 때마다 IDE의 diff 도구를 사용하여 마지막 커밋의 변경 사항을 확인합니다.변경사항을 확인하기 전에 변경사항을 검토하는 것이 매우 유용한 방법이라고 생각합니다.

그러나 작업이 끝날 때(첫 번째 커밋 전) 모든 변경 사항을 함께 확인하고 풀 요청을 하기 전에 자체 코드 검토를 수행하려는 경우에는 이전 커밋(커밋 4 이후)에서 변경된 내용만 볼 수 있고 현재 작업의 모든 커밋에서 변경된 내용은 볼 수 없습니다.

그래서 사용합니다.git reset --soft HEAD~4커밋 4개를 되돌립니다.이렇게 하면 모든 변경 사항을 함께 볼 수 있습니다.변경사항을 확신할 수 있을 때 다음 작업을 수행할 수 있습니다.git reset HEAD@{1}원격으로 자신 있게 밀어넣습니다.

소스트리는 원하는 비트만 스테이징할 수 있는 매우 편리한 인터페이스를 가진 깃 GUI입니다.그것은 적절한 개정을 수정하기 위해 조금이라도 유사한 것을 가지고 있지 않습니다.

그렇게git reset --soft HEAD~1는 보다훨유니다보다 훨씬 더 합니다.commit --amend 사항을 소스트리를 시작할 수 .커밋을 실행 취소하고 모든 변경 사항을 준비 영역으로 되돌린 다음 소스 트리를 사용하여 준비된 비트를 다시 조정할 수 있습니다.

정말로, 제가 보기엔commit --amend는 둘 중 더 중복된 명령이지만 깃은 기트이며 약간 다른 작업을 수행하는 유사한 명령을 주저하지 않습니다.

저는 보통 둘 다 사용합니다.git reset --soft그리고.git commit --amend커밋을 결합하기 위해.예를 들어 다음과 같은 커밋 기록이 있는 경우:

master: A--B--C

현 시점에서 저는 A 커밋을 유지하고 B 커밋과 C를 삭제하지만 변경 사항은 유지하고 싶습니다.첫 번째:

git reset --soft <commit A's hash>

왜냐하면 그 선택권 때문입니다.--soft특정한 약속을 지키면서도 변경 사항을 유지할 수 있습니다.이제 이러한 변경 사항을 커밋 A에 적용할 수 있습니다.

git commit --amend

또는 해당 커밋의 이름을 변경할 수도 있습니다.

git commit --amend -m 'your new commit message'

그런 다음 원격 리포지토리에 푸시하려면 다음을 사용해야 합니다.

git push -f origin master

이전 커밋으로 '돌아간' 것처럼 보이지만 사실 수정된 커밋은 새로운 커밋이며 이전 커밋 A를 대체했습니다(사용하면 해시 ID를 확인할 수 있습니다).git log), 하지만 결국, 당신은 당신이 의도했던 것처럼 여전히 좋은 커밋 이력을 가지고 있습니다.

다른 사용 사례는 예를 들어, A, B, C 기능이 있는 소프트웨어가 개발 중이라고 가정할 때 다른 분기를 사용자의 분기로 바꾸려는 경우입니다.

다음 버전으로 개발 중이며 다음과 같은 작업을 수행합니다.

  • 기능 B가 제거됨

  • 추가된 기능 D

이 과정에서 B 기능에 대해 추가된 핫픽스를 개발합니다.

은 지저분할 , 다으로개병수있만지합혼수, 이는때울러있있수다습니사도용할만지란스로때음발을할▁you▁▁also를 사용할 수도 있습니다.git reset --soft origin/develop그리고 변경 사항과 함께 커밋을 만들면 분기가 충돌 없이 병합되고 변경 사항을 유지할 수 있습니다.

알고 보니git reset --soft편리한 명령입니다.저는 개인적으로 "WIP"와 같은 "완료된 작업"이 없는 커밋을 스쿼시할 때 많이 사용하기 때문에 풀 요청을 열 때 제 모든 커밋을 이해할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5203535/practical-uses-of-git-reset-soft

반응형