git reset --soft의 실제 사용?
나는 한 달 이상 git과 함께 일 해왔다. 실제로 어제 처음으로 리셋을 사용했지만 소프트 리셋은 여전히 나에게 의미가 없습니다.
소프트 리셋을 사용하여 고급 또는 작업 디렉토리를 변경하지 않고 커밋을 편집 할 수 있음을 이해 git commit --amend합니다.
이 두 명령이 동일 인사 ( reset --softvs commit --amend)? 실용적인 용어로 하나를 사용하는 이유는 무엇입니까? 더 중요한 것은 reset --soft커밋을 수정하는 것 외에 다른 용도 가 있습니까?
git reset이동 HEAD에 관한 , 일반적으로 분기 참조 입니다.
질문 : 워킹 트리와 보안은 어떻습니까?
함께 사용하면 --soft, 이동 HEAD, 가장 자주 분기 심판 업데이트 만HEAD .
이 다음과 목록 commit --amend.
- 새로운 커밋을 만들지 만들었습니다.
- 실제로 HEAD를 모든 커밋으로 옮길 수 있습니다 ( 현재 커밋을 다시 실행하면서 HEAD - 움직이지를 않는 것에
commit --amend불과합니다 )
이 결합 예제를 찾았습니다.
- 고전적인 합병
- 서브 트리 병합
커밋 병합은 모두 하나로 통합됩니다 (두 개 이상의 브랜치가 병합하여 통합됩니다).
Tomas "wereHamster"Carnecky 는 "Subtree Octopus merge"기사 에서 다음과 같이 설명합니다 .
- 하나의 프로젝트를 다른 프로젝트의 서브 디렉토리에 병합 한 후 서브 프로젝트를 최신 상태로 유지하려는 경우 서브 트리 병합 전략을 사용할 수 있습니다. git 서브 모듈의 대안입니다.
- 문어 병합 전략을 사용하여 세 개 이상의 분기를 병합 할 수 있습니다. 일반적인 전략은 두 개의 브랜치 만 병합 할 수 있고 그보다 더 많이 병합하려고하면 git은 자동으로 낙지 전략으로 넘어갑니다.
하나의 전략만이 수 문제입니다. 그러나 전체 저장소가 원자 적으로 새로운 버전으로 업데이트되는 업데이트 기록을 위해 두 가지를 결합하고 싶었습니다.
나는 슈퍼
projectA프로젝트, 그것을 호출 하고 서브 프로젝트를 가지고 있는데projectB, 나는 서브 디렉토리에 병합했다projectA.
(하위 트리 병합 부분입니다)
또한 몇 가지 로컬 커밋을 유지하고 있습니다.
ProjectA다수로 업데이트되고projectB며칠 또는 몇 주마다 새 버전이 있고 일반적으로의 특정 버전에 따라 늘어납니다projectA.나는 두 프로젝트를 업데이트하기로 결정 했을 때 , 단지에서 잡아 나는 당기지 마십시오
projectA과projectB그로 전체 프로젝트의 원자 갱신해야 우리 무엇을위한 두 개의 커밋을 만들을 구석으로입니다 .
대신에, 나는 하나의 병합하는 콤바인 커밋 만들고projectA,projectB내 지역 커밋 .
여기서 까다로운 부분은 이것이 문어 병합 (세 개의 머리) 이지만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작업 트리와 작업에 대해 처음 두 개의 병합이 수행 될 작업을 복원했지만 도움 이 됩니다. 작업 한 두 병합을 다시 실행하는 방법 , 즉 작업 트리와 보강은 다음과 가능합니다. 괜찮지 만 그 두 커밋을 기록하지 않으면?reset --soft
# 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 --softvs commit --amend)?
- 아니.
실제 용어로 둘 중 하나를 사용해야하는 이유가 있습니까?
commit --amend마지막 커밋에서 파일을 추가하거나 메시지를 변경합니다.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 reset --soft하여 인덱스 및 작업 트리에있는 변경 사항에 대해 부모로 사용할 버전을 변경할 수 있습니다 . 이것이 유용한 경우는 드뭅니다. 때로는 작업 트리의 변경 사항이 다른 분기에 속해야한다고 결정할 수 있습니다. 또는 이것을 사용하여 여러 커밋을 하나로 축소 할 수 있습니다 (스쿼시 / 폴드와 유사).
실용적인 예는 VonC의 답변을 참조하십시오 : Git에서 처음 두 커밋을 스쿼시합니까?
한 가지 가능한 사용법은 다른 컴퓨터에서 작업을 계속하려는 경우입니다. 다음과 같이 작동합니다.
숨김과 같은 이름의 새 지점을 확인하고
git checkout -b <branchname>_stash은닉 지점을 위로 밀어 올려
git push -u origin <branchname>_stash다른 컴퓨터로 전환하십시오.
보관함과 기존 지점을 모두 아래로 내립니다.
git checkout <branchname>_stash; git checkout <branchname>지금 기존 브랜치에 있어야합니다. 숨김 지점의 변경 사항을 병합하고,
git merge <branchname>_stash병합하기 전에 기존 분기를 1로 소프트 재설정하십시오.
git reset --soft HEAD^숨김 지점을 제거하고
git branch -d <branchname>_stash또한 원본에서 숨김 분기를 제거하고,
git push origin :<branchname>_stash변경 사항을 정상적으로 숨긴 것처럼 계속 작업하십시오.
나는 앞으로 GitHub와 co. 이 "원격 숨김"기능을 더 적은 단계로 제공해야합니다.
한 가지 실용적인 용도는 이미 로컬 저장소에 커밋 한 경우 (예 : git commit -m) git reset --soft HEAD ~ 1 을 수행하여 마지막 커밋을 되돌릴 수 있습니다.
또한 지식을 위해 이미 변경 사항을 스테이징 한 경우 (예 : git add.) git reset --mixed HEAD 를 수행하여 스테이징을 되돌릴 수 있거나 일반적으로 방금 사용한 적이 있습니다.git reset
마지막으로 git reset --hard는 로컬 변경 사항을 포함하여 모든 것을 지 웁니다 . ~ after head는 상단에서 몇 개의 커밋으로 이동할지 알려줍니다.
' git reset --soft <sha1>' 를 사용하는 가장 큰 이유 HEAD는 베어 리포지토리 로 이동 하는 것입니다.
--mixed또는 --hard옵션 을 사용 하려고하면 존재하지 않는 트리 및 / 또는 인덱스를 수정하고 작업하려고하므로 오류가 발생합니다.
참고 : 베어 리포지토리에서 직접이 작업을 수행해야합니다.
참고 : 베어 저장소에서 재설정하려는 분기가 활성 분기인지 확인해야합니다. 그렇지 않은 경우 저장소에 직접 액세스 할 수있을 때 베어 저장소에서 활성 분기를 업데이트하는 방법에 대한 VonC의 답변 을 따르십시오 .
SourceTree는 원하는 비트를 준비하는 데 매우 편리한 인터페이스를 가진 git GUI입니다. 적절한 개정판을 수정하기 위해 원격으로 유사한 것이 없습니다.
따라서이 시나리오 git reset --soft HEAD~1보다 훨씬 유용합니다 commit --amend. 커밋을 취소하고 모든 변경 사항을 스테이징 영역으로 되돌리고 SourceTree를 사용하여 스테이징 된 비트 조정을 재개 할 수 있습니다.
실제로 commit --amend두 가지 중 더 중복되는 명령 인 것 같지만 git은 git이며 약간 다른 작업을 수행하는 유사한 명령을 피하지 않습니다.
이 스레드의 답변이 정말 마음 git reset --soft에 들지만 약간 다르지만 매우 실용적인 시나리오를 사용합니다.
마지막 커밋 후 변경 사항 (스테이지 및 비 스테이지)을 표시하는 좋은 diff 도구가있는 개발 용 IDE를 사용합니다. 이제 대부분의 작업에는 여러 커밋이 포함됩니다. 예를 들어 특정 작업을 완료하기 위해 5 개의 커밋을 수행한다고 가정 해 보겠습니다. 마지막 커밋의 변경 사항을 확인하기 위해 1-5의 모든 증분 커밋 동안 IDE에서 diff 도구를 사용합니다. 커밋하기 전에 변경 사항을 검토하는 데 매우 유용한 방법입니다.
그러나 내 작업이 끝날 때 (첫 번째 커밋 이전부터) 모든 변경 사항을 함께보고 풀 요청을하기 전에 자체 코드 검토를 수행하려면 이전 커밋의 변경 사항 만 볼 수 있습니다 (커밋 후 4) 현재 작업의 모든 커밋에서 변경되지 않습니다.
그래서 저는 git reset --soft HEAD~44 개의 커밋으로 돌아가는 데 사용 합니다. 이를 통해 모든 변경 사항을 함께 볼 수 있습니다. 변경 사항을 확신 할 때 확신을 git reset HEAD@{1}가지고 원격으로 푸시 할 수 있습니다 .
또 다른 사용 사례는 풀 요청에서 다른 브랜치를 자신의 브랜치로 교체하려는 경우입니다. 예를 들어 개발중인 기능 A, B, C가있는 소프트웨어가 있다고 가정 해 보겠습니다.
다음 버전으로 개발 중이며 다음을 수행합니다.
제거 된 기능 B
추가 된 기능 D
이 과정에서 기능 B에 대해 방금 추가 된 핫픽스를 개발합니다.
다음으로 개발을 병합 할 수 있지만 때로는 지저분 할 수 있지만 git reset --soft origin/develop변경 사항으로 커밋을 사용 하고 만들 수도 있으며 분기는 충돌없이 병합 할 수 있으며 변경 사항을 유지합니다.
그것은 git reset --soft편리한 명령 으로 밝혀졌습니다 . 저는 개인적으로 "WIP"와 같은 "완료된 작업"이없는 커밋을 스쿼시하는 데 많이 사용하므로 풀 요청을 열면 모든 커밋을 이해할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/5203535/practical-uses-of-git-reset-soft
'IT' 카테고리의 다른 글
| 유효한 XML 파일에 XML 선언이 필요 받습니까? (0) | 2020.07.24 |
|---|---|
| C #에서 이벤트를 명시 적으로 제거해야합니까? (0) | 2020.07.24 |
| 처리되지 않는 예외가 작동하지 않는 Visual Studio 2015 중단 (0) | 2020.07.24 |
| XSD에서 JAXB 클래스를 생성하는 방법은 무엇입니까? (0) | 2020.07.24 |
| RDL LC over RDL 보고서를 언제 사용합니까? (0) | 2020.07.24 |