나는 보통 검토를 위해 커밋 목록을 제출합니다. 다음 커밋이있는 경우 :
HEAD
Commit3
Commit2
Commit1
…로 헤드 커밋을 수정할 수 있다는 것을 알고 있습니다 git commit --amend
. 그러나 커밋 Commit1
이 아닌 경우 어떻게 수정할 수 HEAD
있습니까?
답변
git rebase 사용할 수 있습니다 . 예를 들어 commit을 수정 bbc643cd
하려면 다음을 실행하십시오.
$ git rebase --interactive 'bbc643cd^'
커밋 을 수정 하기 전에^
실제로 커밋 해야하기 때문에 명령 끝에 캐럿 을 기록하십시오 .
기본 편집기에서 수정 pick
에 edit
‘bbc643cd’를 언급 라인에.
파일을 저장하고 종료합니다 : git은 파일의 명령을 해석하고 자동으로 실행합니다. 커밋을 만든 이전 상황에서 자신을 발견 할 수 있습니다 bbc643cd
.
이 지점에서, bbc643cd
마지막 커밋이 있으며 쉽게 수정할 수 있습니다 . 변경 한 후 다음 명령으로 커밋하십시오.
$ git commit --all --amend --no-edit
그런 다음 다음을 입력하십시오.
$ git rebase --continue
이전 HEAD 커밋으로 돌아갑니다.
경고 : 이렇게하면 해당 커밋의 SHA-1 과 모든 자식 이 변경됩니다. 즉,이 시점부터 기록을 다시 작성합니다. 명령을 사용하여 밀어 넣으면 이 작업을 수행 할 수 있습니다.git push --force
답변
멋진 대화식 리베이스를 사용하십시오.
git rebase -i @~9 # Show the last 9 commits in a text editor
1, 당신이 원하는 변화를 커밋 찾기 pick
에 e
( edit
), 저장하고 파일을 닫습니다. Git은 해당 커밋으로 되 감아 다음 중 하나를 수행 할 수 있습니다.
- 사용하다
git commit --amend
변경하는 데 하거나 git reset @~
파일의 변경 사항이 아닌 마지막 커밋을 버리는 데 사용 하십시오 (즉, 파일을 편집했지만 아직 커밋하지 않은 시점으로 이동하십시오).
후자는 여러 커밋으로 분할하는 것과 같이 더 복잡한 작업을 수행하는 데 유용합니다.
그런 다음을 실행 git rebase --continue
하면 Git은 수정 된 커밋 위에 후속 변경 사항을 재생합니다. 일부 병합 충돌을 수정하라는 메시지가 표시 될 수 있습니다.
참고 : @
대한 속기 HEAD
, 그리고 ~
커밋 지정하기 전에 커밋이다.
Git 문서에서 기록 을 다시 작성 하는 방법에 대해 자세히 알아보십시오 .
리베이스를 두려워하지 마십시오
ProTip ™ : 기록을 다시 작성하는 “위험한”명령을 실험하는 것을 두려워하지 마십시오 * — Git은 기본적으로 90 일 동안 커밋을 삭제하지 않습니다. reflog에서 찾을 수 있습니다.
$ 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
* 같은 옵션을 조심 --hard
하고 --force
있지만 – 그들은 데이터를 삭제할 수 있습니다.
* 또한 공동 작업중인 지점의 기록을 다시 쓰지 마십시오.
많은 시스템에서 git rebase -i
기본적으로 Vim이 열립니다. Vim은 대부분의 최신 텍스트 편집기처럼 작동하지 않으므로 Vim을 사용하여 리베이스하는 방법을 살펴보십시오 . 다른 편집기를 사용하려면로 변경하십시오 git config --global core.editor your-favorite-text-editor
.
답변
대화 형 REBASE 와--autosquash
는 이전 커밋을 기록에서 더 깊이 수정해야 할 때 자주 사용하는 것입니다. 본질적으로 ZelluX의 답변이 보여주는 프로세스의 속도를 높이고 편집해야 할 커밋이 둘 이상인 경우 특히 유용합니다.
설명서에서 :
--autosquash
커밋 로그 메시지가 “squash! …”(또는 “fixup!…”)로 시작하고 제목이 같은 것으로 시작하는 커밋이있는 경우 rebase -i의 할 일 목록을 자동으로 수정하여 커밋 커밋 수정 직후 스 쿼싱으로 표시
다음과 같은 히스토리가 있다고 가정하십시오.
$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1
Commit2로 수정하고 변경 사항을 커밋하려는 변경 사항이 있습니다.
$ git commit -m "fixup! Commit2"
또는 commit 메시지 대신 commit-sha를 사용할 수 있습니다. "fixup! e8adec4
또는 하거나 의 접두사를 사용할 수도 있습니다.
그런 다음 커밋에서 대화식 리베이스를 시작하십시오.
$ git rebase e8adec4^ -i --autosquash
커밋이 이미 올바르게 정렬되어 편집기가 열립니다.
pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3
저장하고 종료하기 만하면됩니다.
답변
운영:
$ git rebase --interactive commit_hash^
각각 ^
은 편집하려는 커밋 수를 나타냅니다. 단 하나의 커밋 해시 인 경우 하나만 추가하면 ^
됩니다.
Vim을 사용하면 변경, 저장 및 quit ( ) 하려는 커밋 pick
에 reword
대한 단어 를 변경합니다 :wq
. 그런 다음 git은 reword로 표시된 각 커밋을 묻는 메시지를 표시하여 커밋 메시지를 변경할 수 있습니다.
각 커밋 메시지는 저장하고 quit ( :wq
)해야 다음 커밋 메시지로 이동합니다.
변경 사항을 적용하지 않고 종료하려면 :q!
편집 : 탐색하기 위해 vim
사용 j
올라가고, k
내려 가서 h
왼쪽으로 이동을하고, l
(이 모든 것이 바로 갈 NORMAL
모드를 눌러 ESC
로 이동하는 NORMAL
모드). 텍스트를 편집하려면 을 눌러 텍스트를 삽입 할 모드로 i
들어갑니다 INSERT
. 모드 ESC
로 돌아가려면 누르십시오 NORMAL
🙂
업데이트 : github 리스팅의 훌륭한 링크는 다음과 같습니다 .git으로 무엇이든 (거의) 실행 취소하는 방법
답변
어떤 이유로 대화 형 편집기가 마음에 들지 않으면을 사용할 수 있습니다 git rebase --onto
.
수정한다고 가정 해보십시오 Commit1
. 먼저 이전 에서 분기 Commit1
:
git checkout -b amending [commit before Commit1]
둘째 Commit1
로 cherry-pick
:
git cherry-pick Commit1
이제 변경 사항을 수정하여 다음을 작성하십시오 Commit1'
.
git add ...
git commit --amend -m "new message for Commit1"
마지막으로 다른 변경 사항을 저장 한 후 나머지 커밋을 master
새 커밋 위에 이식하십시오 .
git rebase --onto amending Commit1 master
읽기 : “브랜치에 리베이스 ( amending
모두 Commit1
비 포함)와 master
(포함) 사이의 모든 커밋 ” 즉, Commit2 및 Commit3은 이전 Commit1을 완전히 제거합니다. 당신은 그들을 체리 따기 할 수 있지만,이 방법은 더 쉽습니다.
가지를 청소하십시오!
git branch -d amending
답변
문서를 기반으로
이전 또는 여러 커밋 메시지의 메시지 수정
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.
선택 을 reword로 교체 각각 변경하려는 메시지를 커밋하기 전에. 목록에서 두 번째 커밋을 변경한다고 가정하면 파일은 다음과 같습니다.
pick e499d89 Delete CNAME
reword 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.
커밋 목록 파일을 저장하고 닫으면 커밋 메시지를 변경하고 커밋 메시지를 변경하고 저장할 수있는 새 편집자가 나타납니다.
Finaly 수정 된 커밋을 강제로 푸시합니다.
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'
이 명령의 가장 큰 장점은 명령이 no-vim 이라는 사실입니다 .
(1) 물론 재베이스 중에 충돌이 없음을 감안할 때
용법
git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111
이름 amend-to
은 적절한 IMHO로 보인다. 흐름을 --amend
다음 과 비교하십시오 .
git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>
설명
git config --global alias.<NAME> '!<COMMAND>'
-git<NAME>
이 아닌 명령을 실행할 전역 git 별명을 만듭니다.<COMMAND>
f() { <BODY> }; f
– “익명”bash 함수.SHA=`git rev-parse "$1"`;
-인수를 git 개정으로 변환하고 결과를 변수에 할당SHA
git commit --fixup "$SHA"
-에 대한 fixup-commitSHA
. 문서 보기git-commit
GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"
git rebase --interactive "$SHA^"
부분은 다른 답변으로 덮여 있습니다.--autosquash
와 함께 사용되는 것 입니다. 자세한git commit --fixup
내용은git-rebase
문서 를 참조하십시오.GIT_SEQUENCE_EDITOR=true
전체를 비 대화식으로 만드는 것입니다. 이 해킹 은이 블로그 게시물에서 배웠 습니다 .