나는 한동안 Git Extensions 를 사용해 왔지만 (굉장합니다!) 다음에 대한 간단한 대답을 찾지 못했습니다.
때로는 커밋 메시지를 입력 할 때 오타를 만듭니다. 내 친구가 Git Extentions에서 다음과 같은 방법으로 수정하는 방법을 보여주었습니다.
커밋> 고급> 수정 커밋을 마우스 오른쪽 버튼으로 클릭합니다.
그런 다음 “수정”확인란을 선택하고 내 메시지와 짜잔을 다시 작성합니다! 내 커밋 메시지가 수정되었습니다.
그러나이 다른 옵션은 “스쿼시 커밋”… 나는 그것이 무엇을하는지 항상 궁금했다?!
내 질문은 :
누군가 Git / Git Extentions 에서 Squash 커밋 과 Fixup 커밋 의 정확한 차이점이 무엇인지 간단히 설명 하시겠습니까 ? 그들은 가지 봐 … “유사” 나에게 :
답변
Git Extensions가 구체적으로 무엇을하는지 모르겠지만 git rebase
스쿼시로 커밋을 자동으로 스쿼시하거나 수정하는 옵션이 있습니다! 또는 수정! 접두사 각각 :
--autosquash, --no-autosquash
When the commit log message begins with "squash! ..." (or "fixup!
..."), and there is a commit whose title begins with the same ...,
automatically modify the todo list of rebase -i so that the commit
marked for squashing comes right after the commit to be modified,
and change the action of the moved commit from pick to squash (or
fixup).
스쿼시와 수정의 차이점은 리베이스 중에 squash
작업이 원본과 스쿼시 커밋의 메시지를 결합하라는 메시지를 표시하는 반면 fixup
작업은 원본 메시지를 유지하고 수정 커밋에서 메시지를 삭제한다는 것입니다.
답변
간단히 말해, 일련의 커밋을 리베이스 할 때으로 표시된 각 커밋 squash
은 메시지를 pick
또는 reword
커밋 메시지의 일부로 사용할 수있는 기회를 제공합니다 .
사용 fixup
하면 해당 커밋의 메시지가 삭제됩니다.
답변
에서 자식-REBASE의 문서, “대화 형 모드”섹션 :
두 개 이상의 커밋을 하나로 접으려면 두 번째 및 후속 커밋에 대한 “pick”명령을 “squash”또는 “fixup”으로 바꿉니다. 커밋에 다른 작성자가있는 경우 접힌 커밋은 첫 번째 커밋의 작성자에게 귀속됩니다. 접힌 커밋에 대해 제안 된 커밋 메시지는 첫 번째 커밋의 커밋 메시지와 “squash”명령을 사용한 커밋 메시지의 연결이지만 “fixup”명령으로 커밋의 커밋 메시지를 생략합니다.
답변
질문이 git rebase –interactive 할 때 squash
와 fixup
git 의 차이점이 무엇인지 라면 대답은 커밋 메시지 입니다.
s, squash <commit>
= 커밋을 사용하지만 이전 커밋과 결합
f, fixup <commit>
= “squash”와 같지만이 커밋의 로그 메시지를 버립니다.
예를 들면 :
pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2
는 메시지를 커밋 에서 리베이스 후 경우 1 과 같다 :
father commit message
child commit message
경우 2의 커밋 메시지는 다음과 같습니다.
father commit message
# no sub messages
답변
나는 git 확장을 땜질했고 많은 커밋을 하나로 스쿼시하지 못했습니다. 이를 위해 명령 줄에 의존해야 했고이 게시물이 유용 하다는 것을 알았 습니다.
git rebase -i Head~2
이것은 대화 형 리베이스이며 다음 사항에 유의하십시오.
- 여기서 ~ 2는 현재 헤드를 포함하여이 작업에 참여하려는 커밋 수를 나타냅니다.
- 후속 대화 형 편집 창을 편집하고 첫 번째 항목을 “선택”으로두고 후속 줄을 “스쿼시”로 바꿔야합니다. 불투명 한 경우 위 링크의 지침이 훨씬 더 명확합니다.
답변
왜 자식에게 물어 보지 않습니까? 로 리베이스하면 다음과 git-bash
같이 표시됩니다.
pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019) 1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C
그래서 당신은 볼 수 있습니다 :
s, 스쿼시 = 커밋을 사용하지만 이전 커밋에 결합
f, fixup = “squash”와 같지만이 커밋의 로그 메시지를 삭제합니다.