code

과거에 임의의 커밋 두 개 사이에 커밋을 삽입하는 방법은 무엇입니까?

starcafe 2023. 6. 27. 22:25
반응형

과거에 임의의 커밋 두 개 사이에 커밋을 삽입하는 방법은 무엇입니까?

로컬 전용 분기에 다음과 같은 커밋 기록이 있다고 가정합니다.

A -- B -- C

다음사새커삽방법는입하밋을 사이에 새 하려면 어떻게 합니까?A그리고.B?

OP의 답변보다 훨씬 더 쉽습니다.

  1. git rebase -i <any earlier commit>구성된 텍스트 편집기에 커밋 목록이 표시됩니다.
  2. a1b2c3d합니다.pickedit.
  3. 텍스트 편집기를 닫고 기본 재배치를 시작합니다(변경 내용 저장).하여 명령 가 표시됩니다.a1b2c3d마치 방금 저지른 것처럼.
  4. 하고 변경사적다니합용을항▁and▁make▁your다니적.git commit(대부분의 경우와 달리 수정하지 않음)edit선택한 커밋 다음에 새 커밋을 만듭니다.
  5. 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

물론 기본 재배치 중에 일부 충돌이 발생할 수 있습니다.

지점이 로컬 전용이 아닌 경우 다시 쓰기 기록이 발생하므로 심각한 문제가 발생할 수 있습니다.

더욱 간편한 솔루션:

  1. 마지막에 새 커밋을 생성합니다. D.이제 다음이 있습니다.

    A -- B -- C -- D
    
  2. 그런 다음 실행:

    $ git rebase -i hash-of-A
    
  3. Git가 편집기를 열면 다음과 같이 표시됩니다.

    pick 8668d21 B
    pick 650f1fc C
    pick 74096b9 D
    
  4. 이렇게 D를 맨 위로 이동한 다음 저장하고 종료합니다.

    pick 74096b9 D
    pick 8668d21 B
    pick 650f1fc C
    
  5. 이제 다음과 같은 이점이 있습니다.

    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단계는 다음과 같습니다.

  1. git rebase -i hash-of-preA

  2. Git이 편집기를 엽니다.내용은 다음과 같습니다.

    pick 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    번째 첫번변경째▁the를 합니다.pickedit:

    edit 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    저장하고 종료합니다.

  3. 를 수정한 코를수한다음정드▁modify▁your.git add . && git commit -m "I"

  4. 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>경로로 현가 필요하지 . 새 커밋은 를 .HEADgit 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

반응형