답변:
Linus Torvalds의 메시지가 귀하의 질문에 대답 할 수 있습니다.
짧은 대답 : 당신은 (누르면) 할 수 없습니다.
추출물 (Linus는 BitKeeper를 BK라고합니다) :
BK에서는 할 수있는 역사적 관심사를 제외하고 참고하십시오.
그리고 당신이 그것에 익숙하다면 (실제로) 그것은 실제로 아주 실용적이었습니다. Andrew의 패치 폭탄을 적용하고 문제가 있음을 확인한 후 밀어 내기 전에 편집하십시오.
나는 자식과 같은 일을 할 수 있었다. 커밋 메시지를 이름의 일부로 만들지 않고 기록이 변경되지 않았 음을 보장하고 "나중에 주석 수정"을 허용하는 것이 쉬웠을 것입니다.
그러나 나는하지 않았다.
그것의 일부는 순전히 "내부 일관성"입니다. Git은 SHA1로 보호되는 모든 것과 객체 유형에 관계없이 동일하게 취급되는 모든 객체 덕분에 더 깨끗한 시스템입니다. 네, 서로 다른 4 가지 종류의 개체가 있으며 모두 실제로 다르며 같은 방식으로 사용할 수 없지만 동시에 디스크에서 인코딩이 다를지라도 개념적 으로는 모두 정확하게 작동합니다 똑같다.
그러나 내부 일관성은 실제로 융통성이 없다는 변명의 여지가 아니며 실수가 발생한 후에 실수를 해결할 수 있다면 분명히 융통성이 있습니다. 그래서 그것은 정말로 강력한 주장이 아닙니다.
실제 방법, 당신은 메시지를 신뢰할 수 있다는 : 이유 자식을 사용하면 매우 간단되는 최대 메시지의 끝을 커밋 변경할 수 없습니다. 사람들이 나중에 변경하도록 허용 한 경우 메시지는 본질적으로 신뢰할 수 없습니다.
완료, 당신은 할 수 당신이 원하는 무엇을 반영하기 위해 해당 지역의 커밋의 역사를 다시 sykora에 의해 제안 (일부 REBASE로하고, 헐떡 거림을 --hard 다시!)
그러나 수정 된 히스토리를 다시 게시하면 ( "빨리 감기"커밋이 발생하지 않더라도 푸시가 발생하도록 강제 git push origin +master:master
하는 +
표시로) ... 문제가 생길 수 있습니다.
이 다른 질문에서 추출하십시오.
실제로 한 번은 --force를 사용하여 git.git 저장소에 푸시하고 Linus BIG TIME에 의해 꾸짖 었습니다. 그것은 다른 사람들에게 많은 문제를 일으킬 것입니다. 간단한 답변은 "하지 마십시오"입니다.
현재 git replace 가 트릭을 수행 할 수 있습니다.
세부 사항 : 임시 작업 분기 작성
git checkout -b temp
교체 커밋으로 재설정
git reset --hard <sha1>
올바른 메시지로 커밋 수정
git commit --amend -m "<right message>"
이전 커밋을 새 커밋으로 교체
git replace <old commit sha1> <new commit sha1>
당신이 있던 지점으로 돌아가
git checkout <branch>
임시 지점 제거
git branch -D temp
푸시
guess
끝난.
git rebase -i
대화식으로 'i'를 (분기에서 분기 한) 사용할 수 있습니다 .
바꾸기 pick
(가) 당신이 변경하려는 주석 커밋에 다음을 r
(또는 reword
) 저장하고 종료하고 편집을 할 수 있습니다 있도록하고시.
git push
다시 한번 당신은 끝났습니다!
-p
의 인수 rebase
하는 p
예비 병합합니다.
다음과 같은 나무가 있다고 가정하십시오.
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
먼저 checkout
임시 지점 :
git checkout -b temp
에 temp
지점, reset --hard
A는 당신이 (입니다 커밋, 예를 들어 그 메시지를 변경하려는 커밋에 946992
) :
git reset --hard 946992
amend
메시지를 변경하는 데 사용하십시오 .
git commit --amend -m "<new_message>"
그 후 나무는 다음과 같이 보일 것입니다.
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
그런 다음 cherry-pick
모든는 앞서의 커밋 946992
에서 master
로 temp
하고, 사용을 커밋 amend
이 아니라 자신의 메시지를 변경하려면 :
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
나무는 이제 다음과 같습니다 :
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
이제 임시 지점을 원격으로 강제 푸시하십시오.
git push --force origin temp:master
마지막 단계 master
는 로컬에서 분기 를 삭제 하여 서버에서 git fetch origin
분기를 master
가져온 다음 분기 master
및 분기 삭제 로 전환합니다 temp
.
이제 로컬 및 원격 모두에서 모든 메시지가 업데이트됩니다.
우리 상점에서는 인식 할 수있는 이름이 지정된 주석이 달린 태그를 추가하여 잘못된 메시지로 커밋하고 주석을 대체물로 사용하는 규칙을 소개했습니다.
이것은 일반적인 "git log"명령을 실행하는 사람들에게는 도움이되지 않지만 주석에서 잘못된 버그 추적기 참조를 수정하는 방법을 제공하며 모든 빌드 및 릴리스 도구는 규칙을 이해합니다.
이것은 일반적인 대답은 아니지만 사람들이 특정 커뮤니티 내에서 채택 할 수있는 것일 수 있습니다. 나는 이것이 더 큰 규모로 사용된다면 확실하게 어떤 종류의 도자기 지원이 자랄 수 있다고 확신합니다.
( http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0에서 )
더 깊은 커밋 변경 방법
Git의 히스토리는 변경할 수 없으므로 가장 최근의 커밋 (분기 헤드가 아닌 커밋)을 수정하면 히스토리가 변경된 커밋 및 포워드에서 다시 작성되어야합니다.
이를 위해 StGIT를 사용하고, 필요한 경우 분기를 초기화하고, 변경하려는 커밋까지 커밋하지 않고 필요한 경우 팝업을 변경 한 다음 패치를 새로 고친 다음 (커밋 메시지를 수정하려면 -e 옵션을 사용하여) 패치를 새로 고치십시오. 모든 것과 stg commit.
또는 rebase를 사용하여 그렇게 할 수 있습니다. 새로운 임시 브랜치를 생성하고 git reset --hard를 사용하여 변경하려는 커밋으로 되 감고 커밋을 변경하고 (현재 헤드의 맨 위에 있음) git rebase --onto를 사용하여 변경된 커밋 맨 위에 브랜치를 리베이스하십시오.
또는 git rebase --interactive를 사용하면 패치 순서 변경, 축소 등과 같은 다양한 수정이 가능합니다.
나는 그것이 당신의 질문에 대답해야한다고 생각합니다. 그러나 코드를 원격 저장소로 푸시 하고 사람들이 코드를 가져간 경우 코드 히스토리와 수행 한 작업이 엉망이됩니다. 그러니 조심하십시오.