지정된 커밋을 수정하는 방법은 무엇입니까?
질문
나는 보통 검토를 위해 커밋 목록을 제출합니다.다음과 같은 커밋이있는 경우 :
HEAD
Commit3
Commit2
Commit1
... 나는 Git Commit와 함께 머리를 수정할 수 있다는 것을 알고 있습니다.그러나 어떻게 commit1을 수정할 수 있습니까?
답변
Git Rebase를 사용할 수 있습니다.예를 들어, Commit BBC643CD를 수정하려면 실행하십시오.
$ git rebase --interactive 'bbc643cd^'
CARET ^ 명령이 끝나면 실제로 수정하려는 것을 전에 커밋으로 되돌릴 필요가 있기 때문입니다.
기본 편집기에서 'BBC643CD'를 언급하는 줄에서 편집 할 선택을 수정하십시오.
파일을 저장하고 종료하십시오. git은 파일에서 명령을 해석하고 자동으로 실행합니다.이전 상황에서 BBC643CD를 작성한 이전 상황에서 자신을 찾을 수 있습니다.
이 시점에서 BBC643CD가 마지막 커밋이며 쉽게 수정할 수 있습니다. 변경 사항을 작성한 다음 명령을 적용하십시오.
$ git commit --all --amend --no-edit
그 후에 다음을 입력하십시오.
$ git rebase --continue
이전 머리 커밋으로 돌아가려면.
경고 : 이것은 모든 아이들뿐만 아니라 그 커밋의 SHA-1이 변경 될 것입니다. 즉, 이것은 그 시점에서의 역사를 다시 작성합니다.Command Git Push-Force 명령을 사용하여 푸시하는 경우 Repos를 깰 수 있습니다.
답변
멋진 대화 형 Rebase를 사용하십시오.
git rebase -i @~9 # Show the last 9 commits in a text editor
원하는 커밋을 찾고, e 선택 (편집)을 변경하고 파일을 저장하고 닫습니다.Git은 그 커밋으로 되감기로 되감고, 당신이 다음 중 하나를 허용 할 수 있습니다.
Git Commit을 사용하십시오. 변경하려면 또는 변경하십시오 git reset @ ~를 사용하여 마지막 커밋을 삭제하지만 파일의 변경 사항은 아닙니다 (즉, 파일을 편집했을 때 사용한 지점으로 이동하지만 아직 확약하지 않았습니다).
후자는 여러 커밋으로 분할하는 것과 같은 더 복잡한 물건을 수행하는 데 유용합니다.
그런 다음 Git Rebase를 실행하십시오. --continue 및 git은 수정 된 커밋의 맨 위에 후속 변경 사항을 재생합니다.일부 병합 충돌을 수정하도록 요청받을 수 있습니다.
참고 : @ @는 머리가 단락이며, ~은 지정된 커밋 전에 커밋입니다.
GIT 문서에서 기록 재 작성에 대한 자세한 내용을 참조하십시오.
리베즈를 두려워하지 마라
Protip ™ : 히스토리를 다시 작성하는 "위험한"명령을 사용하여 실험하는 것을 두려워하지 마십시오. * - Git은 기본적으로 90 일 동안 커밋을 삭제하지 않습니다.리플래그에서 찾을 수 있습니다.
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* - 하드와 - 가이 포스와 같은 옵션을 조심하십시오 - 데이터를 폐기 할 수 있습니다. * 또한 협력하는 지점에서 기록을 다시 작성하지 마십시오.
많은 시스템에서 Git Rebase -i는 기본적으로 VIM을 열 수 있습니다.Vim은 대부분의 현대 텍스트 편집자와 같이 작동하지 않으므로 Vim을 사용하여 리베이제 방법을 살펴보십시오.다른 편집기를 사용하는 경우 Git Config -global Core.Editor 즐겨 찾는 텍스트 편집기로 변경하십시오.
답변
-autosquash와의 대화 형 Rebase는 이전에 역사상 더 깊이 깊어져야 할 때 자주 사용하는 것입니다.본질적으로 Zellux의 답변이 설명하는 프로세스를 속도를 높이며 둘 이상의 커밋을 편집해야 할 때 특히 편리합니다.
문서에서 :
- AutoSquash. 커밋 로그 메시지가 "스쿼시!"(또는 "fixup! ...")로 시작하면 제목이 동일하게 시작하는 커밋이 있습니다 ...스쿼시로 표시된 것은 커밋을 수정 한 직후에옵니다.
이 역사가 있다고 가정합니다.
$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1
그리고 commit2를 commit2로 수정하려는 변경 사항이 있으므로 변경 사항을 사용하여 변경하십시오.
$ git commit -m "fixup! Commit2"
또는 커밋 메시지 대신 커밋 SHA를 사용할 수 있으므로 "Fixup! E8Adec4 또는 심지어 커밋 메시지의 접두사 만 있습니다.
그런 다음 전에 커밋 전에 대화식 리베이 효소를 시작하십시오
$ git rebase e8adec4^ -i --autosquash
편집자가 이미 올바르게 주문한 커밋으로 열립니다.
pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3
당신이해야 할 일은 저장하고 종료하는 것입니다
답변
운영:
$ git rebase --interactive commit_hash ^
각 ^은 하나의 커밋이 하나 (사용자가 지정한 커밋 해시가 지정된 해시) 인 경우 ^를 추가 한 다음 ^를 추가합니다.
VIM을 사용하여 변경 사항을 변경하고 저장하고 종료 할 커밋 (: WQ)을 변경하십시오.그런 다음 Git은 커밋 메시지를 변경할 수 있도록 REWord로 표시된 각 커밋에 대해 묻는 메시지를 표시합니다.
저장 해야하는 각 커밋 메시지 (: WQ) 다음 커밋 메시지로 이동해야합니다.
변경 사항을 적용하지 않고 종료하려면 다음을 누르십시오. q!
편집 : VIM에서 탐색하려면 j를 사용하여 k를 사용하여 왼쪽으로 이동하고, 오른쪽으로 가기 위해 (정상 모드에서 모두를 눌러 정상 모드로 이동하십시오). 텍스트를 편집하려면 텍스트를 삽입하는 삽입 모드로 들어가도록 버튼을 누릅니다. Esc 키를 눌러 정상 모드로 돌아갑니다 :)
업데이트 : GitHub 목록에서 멋진 링크가 있습니다 (거의) git으로 아무것도 실행 취소하는 방법
답변
문서를 기반으로합니다
이전 또는 여러 커밋 메시지의 메시지를 수정하십시오
git rebase -i HEAD~3
위의 내용은 현재 지점의 마지막 3 개 커밋 목록을 표시하고, 더 원하는 경우 3 가지 변경 사항을 다른 것으로 변경합니다.목록은 다음과 유사합니다.
pick e499d89 Delete CNAME
pick 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.
변경하려는 각 커밋 메시지 전에 rewort로 선택하십시오.목록에서 두 번째 커밋을 변경하면 파일이 다음과 같이 표시됩니다.
pick e499d89 Delete CNAME
reword 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.
커밋 목록 파일을 저장하고 닫으면 커밋 메시지를 변경하고 커밋 메시지를 변경하고 저장할 수있는 새 편집기가 나타납니다.
마지막으로, 수정 된 커밋을 강요합니다.
git push --force
답변
완전히 비 대화식 명령 (1)
나는 이것을 위해 사용하는 별칭을 공유 할 것이라고 생각했습니다.그것은 비 인터랙티브 대화 형 Rebase를 기반으로합니다.git에 추가하려면이 명령을 실행하십시오 (아래 설명 된 설명).
git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f'
또는, 비정상적인 파일을 처리 할 수있는 버전 (stashing 및 그런 다음 이들을 멈추려서).
git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git stash -k && git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" && git stash pop; }; f'
이 명령의 가장 큰 장점은 그것이 그것이 Vim이라는 사실입니다.
(1)given that there are no conflicts during rebase, of course
Usage
git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111
The name amend-to
seems appropriate IMHO. Compare the flow with --amend
:
git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>
Explanation
git config --global alias.<NAME> '!<COMMAND>'
- creates a global git alias named<NAME>
that will execute non-git command<COMMAND>
f() { <BODY> }; f
- an "anonymous" bash function.SHA=`git rev-parse "$1"`;
- converts the argument to git revision, and assigns the result to variableSHA
git commit --fixup "$SHA"
- fixup-commit forSHA
. Seegit-commit
docsGIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"
git rebase --interactive "$SHA^"
part has been covered by other answers.--autosquash
is what's used in conjunction withgit commit --fixup
, seegit-rebase
docs for more infoGIT_SEQUENCE_EDITOR=true
is what makes the whole thing non-interactive. This hack I learned from this blog post.
최근댓글