수색…


비고

스쿼시는 무엇입니까?

스쿼시 (Squashing)는 여러 개의 커밋을 가져 와서 첫 커밋의 모든 변경 사항을 캡슐화하여 단일 커밋으로 결합하는 프로세스입니다.

스쿼시 및 원격 지점

원격 분기를 추적하는 분기에서 커밋을 스쿼시 할 때 특히주의하십시오. 이미 원격 브랜치에 푸시 된 커밋을 스쿼시하면 두 브랜치가 분기되고 git push -f 를 사용하여 변경 사항을 원격 브랜치에 적용해야합니다. 이로 인해 원격 지점을 추적하는 다른 사용자가 문제를 일으킬 수 있으므로 공개 된 저장소 나 공유 저장소에 강제로 밀어 넣은 커밋을 할 때주의해야합니다.

프로젝트가 GitHub에서 호스팅되는 경우 Settings - Branches - Protected Branches 에 추가하여 master 와 같은 일부 분기에서 강제 강제 보호를 사용하도록 설정할 수 있습니다.

스쿼시 최근 Rebase없이 커밋

이전 x 커밋을 하나의 커밋으로 스쿼시하려면 다음 명령을 사용할 수 있습니다.

git reset --soft HEAD~x
git commit

x 를 스쿼시 된 커밋에 포함시키려는 이전 커밋 수로 바꾸십시오.

이렇게하면 새로운 커밋이 만들어지고 작성자, 메시지 및 날짜를 ​​포함하여 이전 x 커밋에 대한 정보를 본질적으로 잊어 버릴 수 있습니다. 먼저 기존 커밋 메시지를 복사하여 붙여 넣기를 원할 것입니다.

Rebase 동안 커밋하는 스쿼시

커밋은 git rebase 중에 squashed 될 수 있습니다. 이러한 방식으로 커밋을 시도하기 전에 리베이스 를 이해하는 것이 좋습니다.

  1. rebase 할 커밋을 결정하고 커밋 해시를 기록하십시오.

  2. git rebase -i [commit hash] 합니다.

    또는 커밋 해시 대신 HEAD~4 를 입력하여 최신 커밋 및 최신 커밋보다 커밋 된 커밋 4 개를 볼 수 있습니다.

  3. 이 명령을 실행할 때 열리는 편집기에서 스쿼시 할 커밋을 결정하십시오. 해당 줄의 시작 부분에있는 picksquash 로 바꾸면 이전 커밋으로 스쿼시됩니다.

  4. 스쿼시하고자하는 커밋을 선택하면 커밋 메시지를 작성하라는 메시지가 표시됩니다.

로깅은 리베이스 할 위치를 결정합니다.

> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

> git rebase -i 36d15de

이 시점에서 당신의 편집자가 당신이 당신이 커밋을 가지고 무엇을하고 싶은지를 설명 할 수있는 팝업을 띄웁니다. 망할 놈의 의견에 도움을 제공합니다. 당신이 그것을 그대로두면, 모든 커밋이 유지되고 그들의 순서가 리베이스 이전과 동일하기 때문에 아무 일도 일어나지 않을 것입니다. 이 예제에서는 다음 명령을 적용합니다.

pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed

# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

커밋 메시지 쓰기 후 Git 로그

> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

Autosquash : 리베이스 중에 스쿼시하려는 코드 커밋

다음의 역사를 감안할 때 커밋에 스쿼시하려고하는 변경을한다고 상상하십시오. bbb2222 A second commit :

$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

변경 한 후에 평소와 같이 인덱스에 추가 한 다음 스쿼시하려는 커밋에 대한 참조와 함께 --fixup 인수를 사용하여 커밋 할 수 있습니다.

$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit

Git이 대화 형 리베이스 중에 인식 할 수있는 커밋 메시지로 새로운 커밋을 만듭니다.

$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

그런 다음, --autosquash 인수를 사용하여 대화식 rebase를 수행하십시오.

$ git rebase --autosquash --interactive HEAD~4

Git은 올바른 위치에 - commit --fixup 을 사용하여 만든 커밋을 스쿼시하도록 제안합니다.

pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit

모든 rebase에 --autosquash 를 입력하지 않으려면 기본적으로이 옵션을 활성화 할 수 있습니다.

$ git config --global rebase.autosquash true

병합 중 스쿼시 커밋

git merge --squash 를 사용하여 브랜치에 의해 도입 된 변경 사항을 단일 커밋으로 스쿼시 할 수 있습니다. 실제 커밋은 생성되지 않습니다.

git merge --squash <branch>
git commit

이것은 git reset 을 사용하는 것과 거의 동일하지만, 통합 된 변경 사항에 기호 이름이있는 경우 더 편리합니다. 비교:

git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit

자동차 수리 및 픽업

변경 사항을 커밋 할 때 커밋이 앞으로 또 다른 커밋으로 스쿼시 될 것이라는 것을 지정할 수 있으며 이렇게 할 수 있습니다.

git commit --squash=[commit hash of commit to which this commit will be squashed to]

fixup에 --fixup=[commit hash] 사용하는 것도 가능합니다.

커밋 해시 대신 커밋 메시지의 단어를 사용할 수도 있습니다. 예를 들어,

git commit --squash :/things

'things'라는 단어를 가진 가장 최근 커밋이 사용됩니다.

이 커밋 메시지는 'fixup!' 시작합니다 'fixup!' 또는 'squash!' 나머지 커밋 메시지는이 커밋을 받아 들일 것이다.

--autosquash 할 때 autosquash / fixup 기능을 사용하려면 --autosquash 플래그를 사용해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow