역사 속에 묻혀 있는 깃 커밋을 어떻게 나눌 수 있습니까?
나는 내 역사를 망쳤고 그것에 몇 가지 변화를 주고 싶습니다.문제는 제가 두 가지 관련이 없는 변경 사항을 약속했는데, 이 약속은 제 지역(추진되지 않은) 역사의 다른 변경 사항에 둘러싸여 있다는 것입니다.
이 커밋을 푸시하기 전에 분할하고 싶지만, 제가 보는 대부분의 가이드는 최근 커밋 또는 커밋되지 않은 로컬 변경 사항을 분할하는 것과 관련이 있습니다.그 이후로 나의 약속을 "재실행"하지 않고 역사에 조금 묻혀있는 약속까지 이렇게 하는 것이 가능할까요?
기본 관리 페이지에는 커밋을 분할하는 방법에 대한 가이드가 있습니다.요약은 다음과 같습니다.
( ▁including(:▁(▁perform니▁an▁the합수행▁commitive)를 포함한 대화형 rebase를 수행합니다.
git rebase -i <commit-to-split>^ branch
및를 선택하고 편집하도록 표시합니다.기본값이 해당 커밋에 도달하면 다음을 사용합니다.
git reset HEAD^
작업 트리를 그대로 유지합니다.증분적으로 변경사항을 추가하고 커밋하여 원하는 만큼 커밋합니다.
add -p
지정된 파일의 일부 변경 사항만 추가하는 데 유용할 수 있습니다.특정 커밋에 대해 원래 커밋 메시지를 다시 사용하려는 경우 사용합니다.있는지 ( 생각을 사용하세요.
git stash
당신이 저지르지 않은 부분을 숨기기 위해 (또는).stash --keep-index
를 한 에 당이그것저도기지전에르테을스트그고리신, ▁before고리그,.git stash pop
나머지를 작업 트리에 반환합니다.모든 수정 사항이 커밋될 때까지 커밋을 계속합니다. 즉, 깨끗한 작업 트리가 있어야 합니다.려달을 합니다.
git rebase --continue
지금 종료된 커밋 후 커밋 적용을 계속합니다.
Magit을 사용하는 방법은 다음과 같습니다.
커밋된 417ae가 변경할 항목이라고 가정합니다. 관련이 없는 두 가지 변경 사항이 포함되어 있으며 하나 이상의 커밋에 포함되어 있습니다.트히를 .ll
로그를 표시하고 ed417ae로 이동합니다.
그럼 때리기r
.
그리고.m
해당 커밋을 수정합니다.
사용 방법에 주목하십시오.@
이제 분할하려는 커밋이 있습니다. 즉, HEAD가 이제 해당 커밋에 도달했다는 것입니다.
로하여 HEAD를 누릅니다.으로 이동한 다음x
(magit-reset-quickly
에묶에 o
을사하경우는을 사용하는 evil-magit
)를하고 "네, 저는 라고 "네, 지점에서 커밋"입니다.이제 로그는 다음과 같이 표시됩니다.
자, 요세를 치세요.q
일반 Magit 상태로 이동한 다음 일반 언스텝을 사용합니다.u
커밋에 않는 , commit 번첫커들지않는것명분령는하할커밋,째을에밋.c
그럼 나머지는 평소대로s
과 술c
두 커밋에 과 같이 치십시오.r
.
또 하나의 의그외r
계속하면 끝입니다! ll
이제 표시:
을 <commit>
그리고 이 커밋 앞에 새 커밋을 추가하고 작성자 날짜를 저장합니다.<commit>
과 같습니다 -- - 다음단수행니다합를.
이전에 커밋 편집
<commit>
git rebase -i <commit>^^
NB: 아마도 편집에도 필요할 것입니다.
<commit>
뿐만 아니라.체리픽▁cherry.
<commit>
.git cherry-pick -n <commit>
인덱스에서 불필요한 변경 사항을 대화형으로 재설정하고 작업 트리를 재설정합니다.
git reset -p && git checkout-index -f -a
또는 불필요한 변경 사항을 대화식으로 저장합니다.
git stash push -p -m "tmp other changes"
다른 변경 사항(있는 경우) 및 새 커밋 만들기
git commit -m "upd something" .
또는 항목 2-4를 반복하여 중간 커밋을 추가합니다.
기준 변경 계속
git rebase --continue
하나의 파일에서만 콘텐츠를 추출하려는 경우 더 빠른 버전이 있습니다.대화형 기본 재배치는 실제로 더 이상 대화형이 아니기 때문에 더 빠릅니다(그리고 마지막 커밋에서 추출하려면 물론 더 빠르며, 그러면 기본 재배치가 전혀 필요하지 않습니다).
- 하여 편기를사추에서 합니다.
the_file
.가까운.the_file
그것이 당신이 필요로 하는 유일한 버전이고, 나머지는 단지 git 명령뿐입니다. 인덱스에서 삭제 준비:
git add the_file
인덱스에 영향을 주지 않고 방금 삭제한 줄을 파일로 다시 복원합니다!
git show HEAD:./the_file > the_file
"SHA1"은 다음에서 줄을 추출하려는 커밋입니다.
git commit -m 'fixup! SHA1'
3단계까지 복원된 내용으로 두 번째 새로운 커밋을 만듭니다.
git commit -m 'second and new commit' the_file
편집하지 않고, 중지/계속하지 않고, 모든 것을 수락합니다.
git rebase --autosquash -i SHA1~1
물론 추출에 대한 커밋이 마지막 커밋일 때는 훨씬 더 빠릅니다.
4. git commit -C HEAD --amend
5. git commit -m 'second and new commit' thefile
6. no rebase, nothing
사용하는 경우magit
그런 다음 4, 5, 6단계는 단일 작업입니다. 픽스업,
체리 따기를 통해 기록을 수동으로 수정하는 것도 일부 경우에 효과적일 수 있습니다.
(명령줄 대신) git GUI를 사용하는 것을 선호합니다. 문제가 되는 커밋은 단 3개의 커밋만 다운되었고, 아직 푸시하지 않았으며, 다음 커밋도 정확히 정리되지 않았기 때문에 체리픽으로 완전히 재구성하기로 결정했습니다. 그리고 명령줄을 통한 대화형 기본 편집을 사용하는 것보다 더 빨랐습니다.접근법은 비슷하지만요
내가 가장 좋아하는 git GUI에서 수행한 방법은 다음과 같습니다(나는 개인적으로 SourceTree를 사용합니다).
- 현재 상태에서 태그를 생성하여 태그가 손실되지 않도록 합니다.
- 이제 실제 로컬 분기 포인터를 지저분한 커밋으로 이동합니다.
- (2)의 커밋 파일이 유지되도록 이전 파일로 재설정(혼합)합니다.
- 이제 필요한 파일을 준비하고 준비되지 않은 파일이 없을 때까지 올바른 메시지로 커밋하여 커밋을 둘 이상으로 분할할 수 있습니다.
- Cherry는 (태그한 내역에서) 줄에서 다음 커밋을 선택합니다.원하는 커밋을 마우스 오른쪽 단추로 클릭하고 "체리 픽"을 선택하면 됩니다.(4)로 이동하여 더 이상 계정되지 않은 커밋이 남지 않을 때까지 수행합니다.
- 결과적으로 가장 적합한 커밋이 몇 개 있더라도 걱정하지 마십시오.GUI에서 선택적인 대화형 리베이스를 사용하여 이들을 스쿼시할 수 있습니다.혼란 앞에서 커밋을 마우스 오른쪽 단추로 클릭하고 "대화형 기본 재배치"를 클릭한 다음 커밋을 서로 끌어서 스쿼시(커밋 메시지를 간단하게 유지하도록 수정)하거나 원하는 대로 위 또는 아래로 이동하는 것이 간단합니다.
- (1)에서 생성된 태그를 제거합니다.
안 아직밀지않다면으셨보사그, 세요하용어냥▁use▁if요▁just▁yet세,사하용면그▁you다,▁haven.git rebase
더 좋은 것은, 사용하기git rebase -i
대화형으로 커밋을 이동합니다.문제가 되는 커밋을 앞으로 이동한 다음 원하는 대로 분할하여 패치를 뒤로 이동할 수 있습니다(필요한 경우).
언급URL : https://stackoverflow.com/questions/4307095/how-can-i-split-up-a-git-commit-buried-in-history
'bestsource' 카테고리의 다른 글
Oracle Apex를 사용하여 버전 관리 (0) | 2023.06.08 |
---|---|
엑셀에서 VBA로 한 시트에서 다른 시트로 열을 복사하려면 어떻게 해야 합니까? (0) | 2023.06.08 |
노드를 사용하여 요청에서 요청 http 헤더를 추출하는 방법JS 연결 (0) | 2023.06.03 |
Twitter Bootstrap 메뉴 드롭다운을 클릭하는 대신 마우스 커서로 만드는 방법 (0) | 2023.06.03 |
변수를 부분 레일 3으로 전달하시겠습니까? (0) | 2023.06.03 |