과거에 임의의 커밋 두 개 사이에 커밋을 삽입하는 방법은 무엇입니까?
로컬 전용 분기에 다음과 같은 커밋 기록이 있다고 가정합니다.
A -- B -- C
다음사새커삽방법는입하밋을 사이에 새 하려면 어떻게 합니까?A
그리고.B
?
OP의 답변보다 훨씬 더 쉽습니다.
git rebase -i <any earlier commit>
구성된 텍스트 편집기에 커밋 목록이 표시됩니다.a1b2c3d
합니다.pick
edit
.- 텍스트 편집기를 닫고 기본 재배치를 시작합니다(변경 내용 저장).하여 명령 가 표시됩니다.
a1b2c3d
마치 방금 저지른 것처럼. - 하고 변경사적다니합용을항▁and▁make▁your다니적.
git commit
(대부분의 경우와 달리 수정하지 않음)edit
선택한 커밋 다음에 새 커밋을 만듭니다. git rebase --continue
이렇게 하면 새 커밋이 올바른 위치에 삽입된 상태로 연속적인 커밋이 재생됩니다.
이것이 역사를 다시 쓸 것이고, 끌어내려는 다른 사람을 깨뜨릴 것이라는 것을 조심하세요.
답은 여기서 찾을 수 있는 매우 간단한 것으로 밝혀졌습니다.당신이 나뭇가지 위에 있다고 가정해 보세요.branch
다음 단계를 수행합니다.
커밋을 후이 경우 commit은 commit 새커이커임밋만분듭다니시기를커서밋에경우면삽려하입을밋이▁from▁create(만다▁a듭커니in밋▁branch를분기▁temporary▁you▁after▁the).
A
):git checkout -b temp A
이를 커밋이라고 부릅니다.
N
:git commit -a -m "Message"
(또는)
git add
에 뒤에git commit
)커밋 으로 변경합니다(이 commits는 commits 새후이 커기의재본배치커밋밋경우수할행에커밋이▁reb(재)커치배밋▁thein▁the▁youase경기본우▁(▁commit▁commits▁this▁new▁want).
B
그리고.C
) 커밋에git rebase temp branch
가 있는 )-p
병합이 있다면 보존하기 위해 - 더 이상 존재하지 않는 Ciekawy의 의견 덕분)
임시 분기 삭제:
git branch -d temp
이후 내역은 다음과 같습니다.
A -- N -- B -- C
물론 기본 재배치 중에 일부 충돌이 발생할 수 있습니다.
지점이 로컬 전용이 아닌 경우 다시 쓰기 기록이 발생하므로 심각한 문제가 발생할 수 있습니다.
더욱 간편한 솔루션:
마지막에 새 커밋을 생성합니다. D.이제 다음이 있습니다.
A -- B -- C -- D
그런 다음 실행:
$ git rebase -i hash-of-A
Git가 편집기를 열면 다음과 같이 표시됩니다.
pick 8668d21 B pick 650f1fc C pick 74096b9 D
이렇게 D를 맨 위로 이동한 다음 저장하고 종료합니다.
pick 74096b9 D pick 8668d21 B pick 650f1fc C
이제 다음과 같은 이점이 있습니다.
A -- D -- B -- C
여기 제가 읽은 다른 답변에서 본 기본 재배치 중에 "편집 해킹"을 피하는 전략이 있습니다.
을 사용하여git rebase -i
커밋 이후 커밋 목록을 얻습니다.파일 맨 위에 "브레이크"를 추가하기만 하면 해당 지점에서 기본 재배치가 중단됩니다.
break
pick <B's hash> <B's commit message>
pick <C's hash> <C's commit message>
되면, 단일출시면되,면,되,git rebase
이제 "중단" 지점에서 중지됩니다.이제 파일을 편집하고 일반적으로 커밋을 만들 수 있습니다. 그런다기재치계수있습다니속할를배본음▁with▁thease▁reb다로 리베이스를 계속할 수 .git rebase --continue
이로 인해 해결해야 할 충돌이 발생할 수 있습니다.길을 잃으면 언제든지 사용을 중단할 수 있습니다.git rebase --abort
.
이 전략은 일반화되어 커밋을 아무 곳에나 삽입할 수 있습니다. 커밋을 삽입할 위치에 "브레이크"를 놓기만 하면 됩니다.
기록을 다시 쓴 후에는 다음을 수행하는 것을 잊지 마십시오.git push -f
다른 사용자가 분기를 가져오는 것에 대한 일반적인 경고가 적용됩니다.
을 밋커기다음같이가정다니합과로 가정합니다.preA -- A -- B -- C
사이에 커밋을 삽입하려면A
그리고.B
단계는 다음과 같습니다.
git rebase -i hash-of-preA
Git이 편집기를 엽니다.내용은 다음과 같습니다.
pick 8668d21 A pick 650f1fc B pick 74096b9 C
번째 첫번변경째▁the를 합니다.
pick
edit
:edit 8668d21 A pick 650f1fc B pick 74096b9 C
저장하고 종료합니다.
를 수정한 코를수한다음정드▁modify▁your.
git add . && git commit -m "I"
git rebase --continue
이제 당신의 Git commit 이력은.preA -- A -- I -- B -- C
충돌이 발생하면 Git는 이 커밋에서 중지됩니다.사용할 수 있습니다.git diff
충돌 마커를 찾아 해결합니다.충돌을 에는 모충돌해후에를 .git add <filename>
Git에게 다시 Git의 충게돌해말다실시행합다니하고고다었결이되에▁to▁g.git rebase --continue
.
하려면 기본재를실취면려하소를 합니다.git rebase --abort
.
여기에 이미 많은 좋은 답변들이 있습니다.저는 간단한 4단계로 "기본 없음" 솔루션을 추가하고 싶었습니다.
요약
git checkout A
# <<< modify your files at this point
git commit -am "Message for commit D"
git cherry-pick A..C
git branch -f master HEAD
설명.
(참고: 이 솔루션의 한 가지 장점은 최종 결과에 100% 문제가 없을 때까지 분기를 건드리지 않는다는 것입니다. 따라서 AB 테스트를 수행할 수 있는 매우 편리한 "사전 확인" 단계가 있습니다.)
초기 상태(내가 가정한 바로는master
지점 이름)
A -- B -- C <<< master <<< HEAD
올바른 위치를 HEAD로 가리키며 시작합니다.
git checkout A
B -- C <<< master
/
A <<< detached HEAD
(선택적으로 여기서 HEAD를 분리하는 대신에, 우리는 임시 지점을 만들 수 있었습니다.git checkout -b temp A
우리가 그 과정의 마지막에 삭제해야 할 것입니다. 변형이 모두합니다. 모든 ). 다른 모델은 모두 동일하므로 원하는 대로 하십시오.)
삽입할 새 커밋 D 생성
# at this point, make the changes you wanted to insert between A and B, then
git commit -am "Message for commit D"
B -- C <<< master
/
A -- D <<< detached HEAD (or <<< temp <<< HEAD)
그런 다음 마지막 누락된 커밋 B와 C의 복사본을 가져옵니다(커밋 범위를 선택하는 것이므로 그 사이에 더 많은 커밋이 있더라도 명령은 동일합니다).
git cherry-pick A..C
# (if any, resolve potential conflicts between D and these last commits)
B -- C <<< master
/
A -- D -- B' -- C' <<< detached HEAD (or <<< temp <<< HEAD)
(필요한 경우 여기서 편안한 AB 테스트)
이제 코드를 검사하고 테스트해야 할 모든 항목을 테스트할 때이며, 작업 후에 단순히 확인하는 것만으로 무엇을 가지고 있었는지를 구분/비교/검사할 수 있습니다.C
또는C'
.
사이의 테스트에 따라C
그리고.C'
괜찮거나 KO입니다.
(둘 중 하나) 4-OK) 마지막으로 다음의 참조를 이동합니다.
git branch -f master HEAD
B -- C <<< (B and C are candidates for garbage collection)
/
A -- D -- B' -- C' <<< master
(OR) 4-KO) 변경하지 않고 그대로 유지합니다.
지점을 했다면, 를▁it▁delete,다▁with▁a▁if로 삭제하면 .git branch -d <name>
경로로 현가 필요하지 . 새 커밋은 를 .HEAD
git checkout master
KO) 이 하십시오.master
다시부니다합착을 붙입니다.HEAD
.
하고자 하는 이 삽할커다식로별로 식별되는 하면,D
:
# Temporarily append the commit you want to insert to the end
git cherry-pick D
# Results in D -- A -- B -- C
# Start interactive rebase
git rebase -i B^
# Let's imagine that this is what the rebase prompt looks like:
# pick B Third commit
# pick A Second commit
# pick D First commit
# Then reorder the commits:
# pick B Third commit
# pick D First commit
# pick A Second commit
# Save and exit
# After completing the rebase you will find
# A -- D -- B -- C
언급URL : https://stackoverflow.com/questions/32315156/how-to-inject-a-commit-between-some-two-arbitrary-commits-in-the-past
'code' 카테고리의 다른 글
Wordpress Rest API 역방향 프록시 (0) | 2023.06.27 |
---|---|
UIS 검색 디스플레이 컨트롤러/UIS 검색 막대를 사용하여 NSFetched Results Controller(핵심 데이터)를 필터링하는 방법 (0) | 2023.06.27 |
C: 링크된 목록에서 노드를 해제하는 방법은 무엇입니까? (0) | 2023.06.27 |
빈 data.frame을 생성합니다. (0) | 2023.06.27 |
Springboot 스프링 액추에이터 상태 끝점에서 Mongo 상태 표시기를 비활성화할 수 있습니까? (0) | 2023.06.27 |