Git / Git Extension에서 "squash"와 "fixup"의 차이점은 무엇입니까?


111

나는 한동안 Git Extensions 를 사용해 왔지만 (굉장합니다!) 다음에 대한 간단한 대답을 찾지 못했습니다.

때로는 커밋 메시지를 입력 할 때 오타를 만듭니다. 내 친구가 Git Extentions에서 다음과 같은 방법으로 수정하는 방법을 보여주었습니다.

커밋> 고급> 수정 커밋을 마우스 오른쪽 버튼으로 클릭합니다.

여기에 이미지 설명 입력

그런 다음 "수정"확인란을 선택하고 내 메시지와 짜잔을 다시 작성합니다! 내 커밋 메시지가 수정되었습니다.

그러나이 다른 옵션은 "스쿼시 커밋"... 나는 그것이 무엇을하는지 항상 궁금했다?!

내 질문은 :

누군가 Git / Git Extentions 에서 Squash 커밋Fixup 커밋 의 정확한 차이점이 무엇인지 간단히 설명 하시겠습니까 ? 그들은 가지 봐 ... "유사" 나에게 : 여기에 이미지 설명 입력 여기에 이미지 설명 입력

답변:


153

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작업은 원본 메시지를 유지하고 수정 커밋에서 메시지를 삭제한다는 것입니다.


6
Git 문서rebase 에서 더 많은 정보 와 스쿼시 / 수정을 읽을 수 있습니다 .

이것은 훌륭한 대답입니다. 왜 내가 조합 커밋 메시지를 받는지 항상 궁금했습니다.
jedd.ahyoung

66

간단히 말해, 일련의 커밋을 리베이스 할 때으로 표시된 각 커밋 squash은 메시지를 pick또는 reword커밋 메시지의 일부로 사용할 수있는 기회를 제공합니다 .

사용 fixup하면 해당 커밋의 메시지가 삭제됩니다.


fixup그때 어떤 메시지가 보관 됩니까?
IgorGanapolsky

2
@IgorGanapolsky Git 트리에있는 다음 커밋의 메시지입니다. 기본적으로 커밋을 "병합"합니다.
Alexander Haroldo da Rocha

15

에서 자식-REBASE의 문서, "대화 형 모드"섹션 :

두 개 이상의 커밋을 하나로 접으려면 두 번째 및 후속 커밋에 대한 "pick"명령을 "squash"또는 "fixup"으로 바꿉니다. 커밋에 다른 작성자가있는 경우 접힌 커밋은 첫 번째 커밋의 작성자에게 귀속됩니다. 접힌 커밋에 대해 제안 된 커밋 메시지는 첫 번째 커밋의 커밋 메시지와 "squash"명령을 사용한 커밋 메시지의 연결이지만 "fixup"명령으로 커밋의 커밋 메시지를 생략합니다.


13

질문이 git rebase --interactive 할 때 squashfixupgit 의 차이점이 무엇인지 라면 대답은 커밋 메시지 입니다.

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

1

나는 git 확장을 땜질했고 많은 커밋을 하나로 스쿼시하지 못했습니다. 이를 위해 명령 줄에 의존해야 했고이 게시물이 유용 하다는 것을 알았 습니다.

git rebase -i Head~2

이것은 대화 형 리베이스이며 다음 사항에 유의하십시오.

  • 여기서 ~ 2는 현재 헤드를 포함하여이 작업에 참여하려는 커밋 수를 나타냅니다.
  • 후속 대화 형 편집 창을 편집하고 첫 번째 항목을 "선택"으로두고 후속 줄을 "스쿼시"로 바꿔야합니다. 불투명 한 경우 위 링크의 지침이 훨씬 더 명확합니다.

링크 된 게시물은 내가 본 스쿼시 및 수정에 대해 가장 명확한 설명에 관한 것입니다. 감사!
Simon Tewsi

0

왜 자식에게 물어 보지 않습니까? 로 리베이스하면 다음과 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"와 같지만이 커밋의 로그 메시지를 삭제합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.