다수의 커밋을 비상호작용적으로 스쿼시할 수 있는 방법이 있습니까?
나는 다양한 커밋들 - HEAD to HEAD~3을 뭉개려고 노력하고 있습니다.빠른 방법이 있습니까? 아니면 rebase --interactive를 사용해야 합니까?
작업 트리가 깨끗한지 확인합니다.
git reset --soft HEAD~3
git commit -m 'new commit message'
저는 개인적으로 빌헬름텔의 해결책을 좋아합니다.
git reset --soft HEAD~3
git commit -m 'new commit message'
그러나 오류 검사를 통해 별칭을 만들어 다음 작업을 수행할 수 있습니다.
g.squash 3 'my commit message'
실제로 스크립트를 실행하는 별칭을 설정하는 것이 좋습니다. 이렇게 하면 (a) 스크립트를 코드화하고 (b) 오류 검사를 통해 보다 복잡한 작업을 수행할 수 있습니다.아래는 찌그러뜨리는 작업을 하는 스크립트입니다.홈 경로에 있는 스크립트 폴더에 넣었습니다.
스쿼시(스쿼시) 스크립트입니다.sh)
#!/bin/bash
#
#get number of commits to squash
squashCount=$1
#get the commit message
shift
commitMsg=$@
#regular expression to verify that squash number is an integer
regex='^[0-9]+$'
echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"
echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
echo "Invalid commit message. Make sure string is not empty"
else
echo "...input looks good"
echo "...proceeding to squash"
git reset --soft HEAD~$squashCount
git commit -m "$commitMsg"
echo "...done"
fi
echo
exit 0
그런 다음 squash.sh 스크립트를 별칭에 연결하려면 .zprofile에 다음을 추가합니다.
export PATH="$PATH:$HOME/scripts" # Add scripts folder to PATH
...
alias g.squash='function _gSquash(){ sh squash.sh $1 $2; };_gSquash'
...
참고: 원하는 대로 별칭을 만들 수 있습니다.나는 내 많은 깃 단축키를 가지고 있습니다.g.<myCommand>
빌헬름에 의해 답변을 추가하려면 소프트 리셋이 편리하다고 말합니다.HEAD~2
그 다음에 그 약속을 수정합니다.HEAD~3
:
git reset --soft HEAD~2
git commit --all --amend --no-edit
그러면 에 대한 모든 커밋이 병합됩니다.HEAD~3
커밋 메시지를 사용합니다.깨끗한 작업 트리에서 시작해야 합니다.
사용:
EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>
꽤 잘 작동했습니다."pick"으로 시작하는 행이 있는 커밋 로그를 가지려고 하지 마세요 :)
다음 명령을 사용하여 마지막 커밋 내의 마지막 4개 커밋을 스쿼시합니다.
git squash 4
별칭 포함:
squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f"
sq = !git squash $1
sqpsf = !git squash $1 && git psf
출처 https://github.com/brauliobo/gitconfig/blob/master/configs/ .gitconfig
여기 마지막 두 커밋을 무찌를 수 있는 하나의 라이너가 있습니다.이 예에서는 두 번째 마지막 커밋 메시지가 유지됩니다.당신이 원하는 대로 메시지를 변경할 수 있습니다.
git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"
이 명령에 대한 별칭을 만들고 대신 별칭을 사용하는 경우 이 명령이 매우 유용합니다.
나뭇가지가 마스터로부터 갈렸기 때문에 모든 것을 짓밟는 것.
git reset --soft $(git merge-base --fork-point master) \
&& git commit --verbose --reedit-message=HEAD --reset-author
당신은 꽤 친해질 수 있습니다.
깃 베이스 --to HEAD ~4 HEAD ~ 마스터
이것은 당신이 선형 이력을 가진 마스터라는 것을 가정합니다.중간자의 범법 행위를 버리기 때문에 그다지 스쿼시가 아닙니다.커밋 메시지를 수정하려면 새 HEAD를 수정해야 합니다.
언급URL : https://stackoverflow.com/questions/7275508/is-there-a-way-to-squash-a-number-of-commits-non-interactively
'programing' 카테고리의 다른 글
Angular를 안전하게 청소하는 방법지시문의 JS 이벤트 바인딩 (0) | 2023.10.20 |
---|---|
파일을 바이트 배열로 읽기 (0) | 2023.10.20 |
바닥이 왜 이렇게 느려요? (0) | 2023.10.20 |
커널 프로그래밍에서 서명되지 않은 int 대신 u8 u16 u32 u64가 사용되는 이유는 무엇입니까? (0) | 2023.10.20 |
C++에 오버로드 기능이 추가된 이유는 무엇입니까? (0) | 2023.10.20 |