programing

Git에서 이전(마지막이 아님) 커밋에 변경된 파일을 추가하는 방법

yellowcard 2023. 4. 10. 21:30
반응형

Git에서 이전(마지막이 아님) 커밋에 변경된 파일을 추가하는 방법

지난 1시간 동안 몇 가지 사항을 변경하여 차근차근 커밋했는데, 커밋 전에 변경된 파일을 추가하는 것을 잊어버렸습니다.

로그는 다음과 같습니다.

GIT TidyUpRequests u:1 d:0> git log 
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce 
Author: David Klein <> 
Date:   Tue Apr 27 09:43:55 2010 +0200

    The Main program now tests both Webservices at once

commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463 
Author: David Klein <>
Date:   Tue Apr 27 09:43:27 2010 +0200

    ISBNDBQueryHandler now uses the XPath functions from XPath.fs too

commit 06a504e277fd98d97eed4dad22dfa5933d81451f 
Author: David Klein <> 
Date:   Tue Apr 27 09:30:34 2010 +0200

    AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs

commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <> 
Date:   Tue Apr 27 09:29:53 2010 +0200

    Factored out some common XPath Operations

좋은 생각 있어요?

를 사용합니다.구체적으로는:

  1. git stash추가할 변경 내용을 저장합니다.
  2. git rebase -i HEAD~10( 「 」 「 」 「 」 ) 。
  3. 에 마크를 ( 「커밋」).a0865...합니다.pickedit커밋이 삭제되므로 다른 행을 삭제하지 마십시오. [^vimnote]
  4. rebase 파일을 저장하면 git이 셸에 드롭되어 커밋이 수정되기를 기다립니다.
  5. 해서 을 터트립니다.git stash pop
  6. 「」로 합니다.git add <file>.
  7. git commit --amend --no-edit.
  8. 해요.git rebase --continue새 커밋에 대한 나머지 커밋을 다시 작성합니다.
  9. 편집용으로 여러 개의 커밋을 표시한 경우 2단계부터 반복합니다.

[^vimnote] : [ ]를 사용하고 경우vim키를 눌러서 편집하고 입력해 주세요.:wq파일을 저장하려면 편집기를 종료하고 변경사항을 적용합니다.또는 사용자 친화적인 git commit 에디터를 설정할 수 있습니다.git config --global core.editor "nano".

작은 변경으로을 ', 「」을 클릭합니다.여기서, 「」는 「수정」을 실시합니다.OLDCOMMIT랄까...091b73a:

git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^

이 경우에도 하실 수 있습니다.git commit --squash=OLDCOMMIT기본 재배치 중에 오래된 커밋메시지를 편집합니다.

git commit 및 git rebase에 대해서는 설명서를 참조하십시오.항상 그렇듯이 git 이력을 다시 쓸 때는 아직 공개하지 않은 커밋(랜덤 인터넷 사용자 및 빌드 서버 포함)만 수정하거나 스쿼시해야 합니다.


상세설명

  • git commit --fixup=OLDCOMMIT 카피하다OLDCOMMIT 및 자동으로 " " " " 가 됩니다.fixup!인터랙티브 리베이스 중에 올바른 순서로 정렬할 수 있습니다.(동일하지만 프리픽스)--squash=OLDCOMMITsquash!
  • git rebase --interactive 는 기본 재배치 명령 시퀀스를 확인(또는 편집)하기 위해 텍스트에디터(설정 가능)를 기동합니다.파일에는 기본 재배치 명령 변경에 대한 정보가 있습니다.기본 재배치 작업을 계속하려면 :wq에디터를 저장하고 종료하십시오( 참조).
  • --autosquash 자동으로 모든 것을 넣을 수 있습니다.--fixup=OLDCOMMIT올바른 순서로 커밋합니다.주의:--autosquash유효하게 되는 것은, 다음의 경우 뿐입니다.--interactive옵션이 사용됩니다.
  • in은 직전 커밋을 참조하는 것을 의미합니다.OLDCOMMIT. (OLDCOMMIT^의 첫 번째 부모입니다.OLDCOMMIT.)

자동화(옵션

위의 단계는 기본 재배치 명령 시퀀스를 확인 및/또는 수정하는 데 유용하지만, 다음과 같이 대화형 기본 재배치 텍스트 편집기를 건너뛰거나 자동화할 수도 있습니다.

git 1.7을 사용하면 매우 쉽게 사용할 수 있습니다.git rebase:

파일을 준비합니다.

git add $files

새로운 커밋을 생성하여 "파손된" 커밋 메시지를 재사용합니다.

git commit -c master~4

프리펜드fixup!제목 줄에 (또는squash!커밋(메시지)을 편집하는 경우:

fixup! Factored out some common XPath Operations

사용하다git rebase -i --autosquash약속을 정하다

세션을 사용하여 이전 커밋을 수정할 수 있습니다(이미 다른 리포트에 커밋을 푸시하지 않은 경우).

경우에 따라서는 b.2에서 수정한 것은 수정한 완전하지 않은 커밋으로 수정할 수 없습니다.이는 커밋이 패치 시리즈에 깊이 묻혀 있기 때문입니다.
이것이 바로 인터랙티브 리베이스의 목적입니다: "a"와 "b"를 많이 사용한 후 커밋을 재배치 및 편집하고 여러 커밋을 하나로 압축하여 사용합니다.

현재 상태로 유지하는 마지막 커밋부터 시작합니다.

git rebase -i <after-this-commit>

에디터는 현재 브랜치(마지 커밋 무시)의 모든 커밋으로 기동합니다.이 커밋은 지정된 커밋 뒤에 옵니다.
이 목록에 있는 커밋의 순서를 원하는 대로 변경하여 삭제할 수 있습니다.리스트는 대략 다음과 같습니다.

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...

온라인 설명은 순전히 즐거움을 위한 것입니다.git rebase는 그것들을 보는 것이 아니라 커밋 이름(이 예에서는 "deadbee"와 "fa1afe1")을 참조하므로 이름을 삭제하거나 편집하지 마십시오.

명령어 "pick"을 명령어 "edit"로 대체함으로써 파일/또는 커밋 메시지를 편집하고 커밋을 수정하고 다시 베이스링을 계속할 수 있도록 git rebase를 적용할 수 있습니다.

다음은 @Greg의 답변을 구현하는 기능입니다.

function gitamendoldcommit() {
    printf "\n\nPress any key if you have no changes other than those you want to add to $1."
    printf "(You can commit your unwanted changes and undo later.):\n\n"
    read foo
    printf "\n\nChange 'pick' to 'edit' in front of $1 (top one), save, close the editor & press any key..."
    printf "Resolve any possible conflicts, if any. then: git add .; git rebase --continue\n\n"
    git rebase -i $1^

    git stash pop
    git add .
    git commit --amend --no-edit
    git rebase --continue
}

사용방법: (스테이징에서 의도된 변경사항만 있는 경우)gitamendoldcommit $OLDCOMMIT

「」를 사용하는 는,git rebase -i첫하려면 , 「커밋」을 할 수 있습니다.git rebase -i --root이제 첫 번째 커밋을 쉽게 변경할 수 있습니다.

2023년에는 이를 실현하는 툴이 있습니다.구체적으로는 git absolve입니다.많은 git 워크플로우를 변경할 수 있는 훌륭한 도구입니다.

언급URL : https://stackoverflow.com/questions/2719579/how-to-add-a-changed-file-to-an-older-not-last-commit-in-git

반응형