etc./StackOverFlow

Git을 사용하여 마지막 X 커밋을 함께 스쿼시

청렴결백한 만능 재주꾼 2021. 9. 26. 10:52
반응형

질문자 :markdorison


Git을 사용하여 마지막 X 커밋을 하나의 커밋으로 어떻게 스쿼시할 수 있습니까?



답변자 : Chris Johnsen


git rebase 또는 git merge --squash 없이 이 작업을 상당히 쉽게 수행할 수 있습니다. 이 예에서는 마지막 3개의 커밋을 스쿼시합니다.

새 커밋 메시지를 처음부터 작성하려면 다음으로 충분합니다.

 git reset --soft HEAD~3 && git commit

기존 커밋 메시지를 연결하여 새 커밋 메시지 편집을 시작하려면(예: pick/squash/squash/…/squash git rebase -i 명령 목록이 시작하는 것과 유사) 다음을 추출해야 합니다. 해당 메시지를 git commit 전달합니다.

 git reset --soft HEAD~3 && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

이 두 가지 방법 모두 동일한 방식으로 마지막 세 커밋을 단일 새 커밋으로 스쿼시합니다. 소프트 리셋은 스쿼시하고 싶지 않은 마지막 커밋으로 HEAD를 다시 가리킵니다. 인덱스도 작업 트리도 소프트 리셋에 의해 건드리지 않고 인덱스를 새 커밋에 대해 원하는 상태로 남깁니다(즉, "버리려는" 커밋의 모든 변경 사항이 이미 있습니다).



답변자 : Anomie


매뉴얼에 git rebase -i <after-this-commit> 을 사용하고 두 번째 및 후속 커밋에서 "pick"를 "squash" 또는 "fixup"으로 바꿉니다.

이 예에서 <after-this-commit> 은 SHA1 해시이거나 rebase 명령에 대해 커밋이 분석되는 현재 분기의 HEAD에 대한 상대 위치입니다. 예를 들어 사용자가 과거에 현재 HEAD에서 5개의 커밋을 보려면 git rebase -i HEAD~5 명령을 사용합니다.



답변자 : Mark Longair


git merge --squash 를 사용할 수 있습니다 git rebase -i 보다 약간 더 우아합니다. 마스터에 있고 마지막 12개 커밋을 하나로 스쿼시하고 싶다고 가정합니다.

경고: 먼저 작업을 커밋했는지 확인하십시오. git status 가 깨끗한지 git reset --hard 는 단계적 변경 사항과 단계적 변경 사항을 버릴 것이기 때문에)

그 다음에:

 # Reset the current branch to the commit just before the last 12: git reset --hard HEAD~12 # HEAD@{1} is where the branch was just before the previous command. # This command sets the state of the index to be as it would just # after a merge from that commit: git merge --squash HEAD@{1} # Commit those squashed changes. The commit message will be helpfully # prepopulated with the commit messages of all the squashed commits: git commit

git merge 대한 설명서--squash 옵션에 대해 자세히 설명합니다.


업데이트: Chris Johnsen이 답변 git reset --soft HEAD~12 && git commit 보다 이 방법의 유일한 장점은 스쿼시하는 모든 커밋 메시지로 미리 채워진 커밋 메시지를 얻을 수 있다는 것입니다.



답변자 : Brent Bradburn


특히 Git 초보자의 경우 가능하면 git reset 피하는 것이 좋습니다. 많은 커밋을 기반으로 프로세스를 자동화해야 하는 경우가 아니라면 덜 이국적인 방법이 있습니다...

  1. 작업 브랜치에 스쿼시할 커밋을 넣습니다(아직 없는 경우) -- 이를 위해 gitk를 사용합니다.
  2. 대상 브랜치를 확인하십시오(예: '마스터').
  3. git merge --squash (working branch name)
  4. git commit

커밋 메시지는 스쿼시를 기반으로 미리 채워집니다.



답변자 : br3nt


이 편리한 블로그 게시물 덕분에 이 명령을 사용하여 마지막 3개의 커밋을 스쿼시할 수 있다는 것을 알게 되었습니다.

 git rebase -i HEAD~3

이것은 추적 정보/원격 리포지토리가 없는 로컬 지점에 있는 경우에도 작동하므로 편리합니다.

이 명령은 대화식 rebase 편집기를 열어 평소대로 재정렬, 스쿼시, 단어 변경 등을 수행할 수 있습니다.


대화형 리베이스 편집기 사용:

대화식 rebase 편집기는 마지막 세 커밋을 보여줍니다. 이 제약 조건은 git rebase -i HEAD~3 명령을 실행할 때 HEAD~3 의해 결정되었습니다.

가장 최근 커밋인 HEAD 가 1행에 먼저 표시됩니다. # 으로 시작하는 행은 주석/문서입니다.

표시된 문서는 매우 명확합니다. 주어진 줄에서 명령을 pick 에서 원하는 명령으로 변경할 수 있습니다.

나는 위 줄의 커밋에 대한 커밋의 변경 사항을 "스쿼시"하고 커밋 메시지를 fixup 때문에 fixup 명령을 사용하는 것을 선호합니다.

1행의 커밋이 HEAD 이므로 대부분의 경우 이것을 pick 둡니다. 커밋을 스쿼시할 다른 커밋이 없기 때문에 squash 또는 fixup 을 사용할 수 없습니다.

커밋 순서를 변경할 수도 있습니다. 이를 통해 연대순으로 인접하지 않은 커밋을 스쿼시하거나 수정할 수 있습니다.

대화형 리베이스 편집기


실용적인 일상의 예

최근에 새로운 기능을 커밋했습니다. 그 이후로 두 가지 버그 수정을 커밋했습니다. 하지만 이제 내가 커밋한 새 기능에서 버그(또는 그냥 철자 오류)를 발견했습니다. 얼마나 짜증나! 내 커밋 기록을 오염시키는 새 커밋을 원하지 않습니다!

내가 할 첫 번째 일은 실수를 수정하고 squash this into my new feature! .

그런 다음 git log 또는 gitk 를 실행하고 새 기능의 커밋 SHA를 가져옵니다(이 경우 1ff9460 ).

git rebase -i 1ff9460~ 사용하여 대화형 rebase 편집기를 불러옵니다. ~ SHA는 편집기에 해당 커밋을 편집기에 포함하도록 지시합니다.

다음으로 수정 사항( fe7f1e0 )이 포함된 커밋을 기능 커밋 아래 pickfixup 변경합니다.

편집기를 닫으면 수정 사항이 기능 커밋에 포함되고 커밋 기록이 보기 좋고 깨끗해집니다!

이것은 모든 커밋이 로컬일 때 잘 작동하지만 이미 원격으로 푸시된 커밋을 변경하려고 하면 동일한 브랜치를 체크아웃한 다른 개발자에게 실제로 문제를 일으킬 수 있습니다!

여기에 이미지 설명 입력



답변자 : EthanB


Chris Johnsen의 답변을 바탕으로 ,

bash에서 전역 "squash" 별칭 추가: (또는 Windows의 Git Bash)

 git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... 또는 Windows의 명령 프롬프트 사용:

 git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


~/.gitconfig 다음 별칭이 포함되어야 합니다.

 [alias] squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


용법:

 git squash N

N 커밋을 포함하여 자동으로 스쿼시합니다.

참고: 결과 커밋 메시지는 모든 스쿼시된 커밋을 순서대로 조합한 것입니다. 만족스럽지 않다면 언제든지 git commit --amend 수동으로 수정할 수 있습니다. (또는 취향에 맞게 별칭을 편집하십시오.)



답변자 : Xys


2020 리베이스가 없는 간단한 솔루션:

git reset --soft HEAD~2

git commit -m "new commit message"

git push -f

2는 마지막 두 커밋이 스쿼시됨을 의미합니다. 임의의 숫자로 대체할 수 있습니다.



답변자 : Jakir Hosen Khan


이렇게하려면 다음 git 명령을 사용할 수 있습니다.

 git rebase -i HEAD~n

n(=4)은 마지막 커밋의 수입니다. 그런 다음 다음과 같은 옵션이 있습니다.

 pick 01d1124 Message.... pick 6340aaa Message.... pick ebfd367 Message.... pick 30e0ccb Message....

아래와 같이 업데이트하면 하나의 커밋을 pick 다른 커밋을 가장 최근 것으로 squash

 p 01d1124 Message.... s 6340aaa Message.... s ebfd367 Message.... s 30e0ccb Message....

자세한 내용은 링크를 클릭하십시오



답변자 : Matthias M


TortoiseGit을 사용하는 경우 Combine to one commit 기능을 사용할 수 있습니다.

  1. TortoiseGit 컨텍스트 메뉴 열기
  2. Show Log 선택
  3. 로그 보기에서 관련 커밋 표시
  4. 상황에 맞는 메뉴에서 Combine to one commit 선택합니다.

커밋 결합

이 함수는 필요한 모든 단일 git 단계를 자동으로 실행합니다. 불행히도 Windows에서만 사용할 수 있습니다.



답변자 : trudolf


이 기사를 기반으로 이 방법이 내 사용 사례에 더 쉽다는 것을 알았습니다.

내 'dev' 브랜치는 96 커밋만큼 'origin/dev'보다 앞서 있었습니다(그래서 이러한 커밋은 아직 원격으로 푸시되지 않았습니다).

변경 사항을 적용하기 전에 이러한 커밋을 하나로 묶고 싶었습니다. 저는 분기를 'origin/dev' 상태로 재설정하는 것을 선호합니다(이렇게 하면 96개 커밋의 모든 변경 사항이 미단계 상태로 유지됨). 그런 다음 변경 사항을 한 번에 커밋합니다.

 git reset origin/dev git add --all git commit -m 'my commit message'


답변자 : aabiro


커밋을 결합하려는 분기에서 다음을 실행합니다.

 git rebase -i HEAD~(n number of commits back to review)

예시:

 git rebase -i HEAD~2

이렇게 하면 텍스트 편집기가 열리고 이러한 커밋을 함께 병합하려면 'squash'로 각 커밋 앞의 '선택'을 전환해야 합니다. 문서에서:

p, 선택 = 커밋 사용

s, squash = 커밋을 사용하지만 이전 커밋에 병합

예를 들어, 모든 커밋을 하나로 병합하려는 경우 '선택'이 첫 번째 커밋이고 이후의 모든 커밋(첫 번째 커밋 아래에 위치)은 'squash'로 설정되어야 합니다. vim을 사용하는 경우 삽입 모드에서 :x 를 사용하여 편집기를 저장하고 종료합니다.

그런 다음 리베이스를 계속하려면:

 git add . git rebase --continue

커밋 기록을 다시 작성하는 이것과 다른 방법에 대한 자세한 내용은 이 유용한 게시물을 참조하세요.



답변자 : Martin Thoma


Anomies 답변 은 좋지만 이에 대한 불안감이 느껴져 몇 가지 스크린샷을 추가하기로 결정했습니다.

0단계: 자식 로그

git log 현재 위치를 확인하십시오. 가장 중요한 것은 스쿼시하고 싶지 않은 첫 번째 커밋의 커밋 해시를 찾는 것입니다. 그래서 만 :

여기에 이미지 설명 입력

1단계: git rebase

제 경우에는 git rebase -i [your hash] 실행하십시오.

 $ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d

2단계: 원하는 것을 선택/스쿼시

제 경우에는 첫 번째 커밋에서 모든 것을 스쿼시하고 싶습니다. 순서는 처음부터 끝까지이므로 git log 에서와 정확히 반대입니다. 제 경우에는 다음을 원합니다.

여기에 이미지 설명 입력

3단계: 메시지 조정

커밋을 하나만 선택하고 나머지를 스쿼시했다면 커밋 메시지 하나를 조정할 수 있습니다.

여기에 이미지 설명 입력

그게 다야 이것을 저장하면( :wq ) 완료됩니다. git log 로 살펴보십시오.



답변자 : rashok


절차 1

1) 커밋 짧은 해시 식별

 # git log --pretty=oneline --abbrev-commit abcd1234 Update to Fix for issue B cdababcd Fix issue B deab3412 Fix issue A ....

여기서 git log --oneline 도 짧은 해시를 얻는 데 사용할 수 있습니다.

2) 마지막 두 커밋을 스쿼시(병합)하려는 경우

 # git rebase -i deab3412

3) 병합을 위한 nano 그리고 아래와 같이 생겼습니다.

 .... pick cdababcd Fix issue B pick abcd1234 Update to Fix for issue B ....

4) 단어 pickabcd1234 앞에 있는 squash 이름을 바꿉니다. 이름을 변경한 후에는 아래와 같이 변경되어야 합니다.

 .... pick cdababcd Fix issue B squash abcd1234 Update to Fix for issue B ....

nano 편집기를 저장하고 닫습니다. ctrl + o 를 누르고 Enter 를 눌러 저장하십시오. 그런 다음 ctrl + x 를 눌러 편집기를 종료합니다.

6) 그런 다음 nano 편집기가 다시 열립니다. 필요한 경우 업데이트하십시오.

7) 이제 성공적으로 스쿼시되었으므로 로그를 확인하여 확인할 수 있습니다.

 # git log --pretty=oneline --abbrev-commit 1122abcd Fix issue B deab3412 Fix issue A ....

8) 이제 repo로 푸시합니다. 분기 이름 앞에 + 기호를 추가하십시오. 강제로 밀어붙이는 것을 의미합니다.

 # git push origin +master

ubuntu 셸에서 git 사용을 기반으로 합니다. 다른 OS( Windows 또는 Mac )를 사용하는 경우 위의 명령은 편집기를 제외하고 동일합니다. 다른 편집기를 얻을 수 있습니다.

절차 2

  1. 먼저 커밋에 필요한 파일을 추가합니다.
 git add <files>
  1. --fixup 옵션을 사용하여 커밋하고 이 커밋을 병합(스쿼시)해야 OLDCOMMIT
 git commit --fixup=OLDCOMMIT

fixup1 <OLDCOMMIT_MSG> 하여 HEAD 위에 새 커밋을 만듭니다.

  1. OLDCOMMIT 대한 새 커밋을 병합(스쿼시)합니다.
 git rebase --interactive --autosquash OLDCOMMIT^

여기서 ^ OLDCOMMIT 대한 이전 커밋을 의미합니다. 이 rebase 명령은 편집기(vim 또는 nano)에서 대화형 창을 엽니다. 여기서는 아무것도 할 필요가 없으며 저장하고 종료하면 충분합니다. 전달된 옵션은 자동으로 최신 커밋을 이전 커밋 옆으로 이동하고 작업을 fixup (스쿼시와 동일)으로 변경하기 때문입니다. 그런 다음 rebase가 계속되고 완료됩니다.

절차 3

  1. 마지막 커밋에 새로운 변경 사항을 추가해야 하는 경우 --amend git-commit 과 함께 사용할 수 있습니다.
 # git log --pretty=oneline --abbrev-commit cdababcd Fix issue B deab3412 Fix issue A .... # git add <files> # New changes # git commit --amend # git log --pretty=oneline --abbrev-commit 1d4ab2e1 Fix issue B deab3412 Fix issue A ....

여기서 --amend cdababcd 대한 새 변경 사항을 병합하고 새 커밋 ID 1d4ab2e1

결론

  • 첫 번째 절차의 장점은 여러 커밋을 스쿼시하고 재정렬하는 것입니다. 그러나 아주 오래된 커밋에 대한 수정 사항을 병합해야 하는 경우 이 절차가 어려울 것입니다.
  • 따라서 두 번째 절차는 커밋을 아주 오래된 커밋에 쉽게 병합하는 데 도움이 됩니다.
  • 그리고 세 번째 절차는 마지막 커밋에 대한 새로운 변경 사항을 스쿼시하는 경우에 유용합니다.


답변자 : user1376350


이를 수행하는 가장 쉬운 방법은 마스터를 기반으로 새 분기를 만들고 기능 분기 merge --squash

 git checkout master git checkout -b feature_branch_squashed git merge --squash feature_branch

그러면 모든 변경 사항을 커밋할 준비가 된 것입니다.



답변자 : Sandesh Kumar


Golden Repository( golden_repo_name )에서 복제된 원격 브랜치( feature-branch 라고 함)에 있는 경우 커밋을 하나로 스쿼시하는 기술은 다음과 같습니다.

  1. 황금 리포지토리를 확인하세요

     git checkout golden_repo_name
  2. 다음과 같이 그것(골든 리포지토리)에서 새 분기를 만듭니다.

     git checkout -b dev-branch
  3. 이미 가지고 있는 로컬 브랜치와 스쿼시 병합

     git merge --squash feature-branch
  4. 변경 사항을 커밋합니다(이것은 dev-branch에 들어가는 유일한 커밋입니다)

     git commit -m "My feature complete"
  5. 분기를 로컬 저장소로 푸시

     git push origin dev-branch


답변자 : Albert Ruelan


예를 들어 https://bitbucket.org 와 같은 분기(원격 리포지토리)의 단일 커밋에 대한 마지막 3개의 커밋을 스쿼시하려는 경우

내가 한 것은

  1. git reset --soft HEAD~3
  2. git commit
  3. git push origin <branch_name> --force


답변자 : Ayan


마지막 10개의 커밋을 1개의 단일 커밋으로 스쿼시하려면:

 git reset --soft HEAD~10 && git commit -m "squashed commit"

스쿼시된 커밋으로 원격 브랜치를 업데이트하려는 경우:

 git push -f


답변자 : ana


다음은 실행 후 다음에 따라야 할 또 다른 시각적 예입니다. git rebase -i HEAD~3

다음은 세 개의 마지막 커밋에 대해 git rebase를 실행한 후 수행할 작업에 대한 시각적 예입니다.

출처: https://www.git-tower.com/learn/git/faq/git-squash/



답변자 : Ariel Gabizon


정말 편리할 수 있는 것:
스쿼시하려는 커밋 해시를 찾으십시오(예: d43e15 .

이제 사용

 git reset d43e15 git commit -am 'new commit name'


답변자 : William Denniss


모든 커밋을 단일 커밋으로 만들고 싶다면(예: 프로젝트를 처음 공개적으로 릴리스할 때) 다음을 시도하십시오.

 git checkout --orphan <new-branch> git commit


답변자 : ColinM


현재 스쿼시하려는 브랜치에 있고 master는 원래 브랜치이며 최신 커밋에는 사용하려는 커밋 메시지와 작성자가 포함되어 있는 경우 항상 작동하는 간단한 한 줄짜리 라이너:

 git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}


답변자 : Cascabel


이것은 매우 멍청하지만 일종의 멋진 방식으로 링에 던져 보겠습니다.

 GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo

git-rebase-todo (대화형 리베이스 프롬프트)인 경우 첫 번째 "선택"을 제외한 모든 것을 "squash"로 변경하고 그렇지 않으면 vim을 생성하는 git용 새 "편집기"를 제공합니다. 찌그러진 커밋 메시지를 편집하라는 메시지가 표시되면 vim이 표시됩니다. (분명히 나는 foo 브랜치에서 마지막 5개 커밋을 스쿼시하고 있었지만 원하는 대로 변경할 수 있습니다.)

그래도 Mark Longair가 제안한 대로 했을 것입니다.



답변자 : William Entriken


경고: "마지막 X 커밋"이 모호할 수 있습니다.

 (MASTER) Fleetwood Mac Fritz Add Danny Lindsey Stevie Kirwan Buckingham Nicks Add Christine Perfect Buckingham Nicks LA1974 Bill < YOU ARE EDITING HERE Clinton (CHECKED OUT, CURRENT WORKING DIRECTORY)

https://github.com/fleetwood-mac/band-history 리포지토리의 매우 간략한 역사 MASTER ) Fleetwood Mac 커밋에 병합하기 위한 풀 요청을 열었습니다.

pull 요청을 열었고 GitHub에서 다음을 볼 수 있습니다.

네 가지 커밋:

  • 대니 키완 추가
  • 크리스틴 퍼펙트 추가
  • LA1974
  • 빌 클린턴

아무도 전체 저장소 기록을 읽는 데 신경 쓰지 않을 것이라고 생각합니다. (실제로 저장소가 있습니다. 위의 링크를 클릭하세요!) 이 커밋을 스쿼시하기로 결정했습니다. 그래서 git reset --soft HEAD~4 && git commit 합니다. 그런 다음 git push --force 를 GitHub에 올려서 PR을 정리합니다.

그리고 무슨 일이? Fritz에서 Bill Clinton으로 전송되는 단일 커밋을 방금 수행했습니다. 어제 당신이 이 프로젝트의 Buckingham Nicks 버전을 작업하고 있다는 사실을 잊어버렸기 때문입니다. 그리고 git log 는 GitHub에서 보는 것과 일치하지 않습니다.

이야기의 교훈

  1. 정확한 당신이 얻고 싶은 파일, 찾기 git checkout
  2. 기록을 유지하려는 정확한 이전 커밋을 찾고 git reset --soft that
  3. 메이크업 git commit 에로에서 직접 그 뒤틀림을


답변자 : Pulkit Bansal


많은 답변이 git rebase 명령을 기반으로 하지만 내 경험상 git 초보자에게는 다소 복잡하고 고급입니다.

마지막 3개의 커밋을 squish하고 싶다고 가정해 봅시다. 다음 단계는 다음과 같습니다.

  • 현재 커밋 ID를 git log -1 --oneline 사용하고 현재 상태의 commit-id를 기록해 두십시오(git reset에 문제가 있는 경우를 대비하여).
  • Go back 3 commits git reset --soft HEAD~3 을 사용하여 3개의 커밋으로 돌아갈 것입니다.
  • 새 커밋 수행 : 이제 git commit -m <NEW_SINGLE_MESSAGE> 를 수행하면 메시지 아래에 세 개의 커밋이 자동으로 결합됩니다.

git reset에 문제가 있는 경우 git reset --soft <ORIGINAL_COMMIT>



답변자 : Zsolt Z.


중간 커밋의 커밋 메시지에 신경 쓰지 않는다면 다음을 사용할 수 있습니다.

 git reset --mixed <commit-hash-into-which-you-want-to-squash> git commit -a --amend


답변자 : arush436


GitLab으로 작업하는 경우 아래와 같이 Merge Request에서 Squash 옵션을 클릭하면 됩니다. 커밋 메시지는 병합 요청의 제목이 됩니다.

여기에 이미지 설명 입력



답변자 : allenjom


이와 같은 워크플로와 관련된 질문에 대한 답변은 어떻습니까?

  1. 여러 로컬 커밋, 여러 병합 FROM master ,
  2. 마지막으로 원격으로 푸시,
  3. PR 및 검토자에 의해 마스터로 병합. (예, 개발자가 merge --squash 를 병합하는 것이 더 쉬울 것이지만 팀은 프로세스가 느려질 것이라고 생각했습니다.)

이 페이지에서 그런 워크플로를 본 적이 없습니다. (제 눈일 수도 있습니다.) rebase 올바르게 이해하면 여러 병합에 여러 충돌 해결 이 필요합니다. 나는 그것에 대해 생각조차하고 싶지 않습니다!

그래서 이것은 우리에게 효과가 있는 것 같습니다.

  1. git pull master
  2. git checkout -b new-branch
  3. git checkout -b new-branch-temp
  4. 로컬에서 많은 편집 및 커밋, 정기적으로 마스터 병합
  5. git checkout new-branch
  6. git merge --squash new-branch-temp // 모든 변경 사항을 스테이지에 넣습니다.
  7. git commit 'one message to rule them all'
  8. git push
  9. 검토자는 PR을 수행하고 마스터에 병합합니다.


답변자 : slisnychyi


간단한 솔루션:

git reset --soft HEAD~5

git commit -m "commit message"

git push origin branch --force-with-lease



답변자 : Ethan


더 일반적인 솔루션은 'N' 커밋을 지정하는 것이 아니라 스쿼시하려는 분기/커밋 ID를 지정하는 것입니다. 이것은 특정 커밋까지 커밋을 계산하는 것보다 오류가 발생하기 쉽습니다. 태그를 직접 지정하거나 실제로 계산하려는 경우 HEAD~N을 지정할 수 있습니다.

내 워크플로에서 분기를 시작하고 해당 분기에 대한 첫 번째 커밋은 목표를 요약합니다(즉, 일반적으로 기능에 대한 '최종' 메시지로 공개 리포지토리에 푸시합니다). 내가 하고 싶은 것은 git squash master 를 첫 번째 메시지로 되돌리고 푸시할 준비가 된 것입니다.

별칭을 사용합니다.

 squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i

이렇게 하면 삭제된 기록이 삭제되기 전에 덤프됩니다. 되돌리려는 경우 콘솔에서 이전 커밋 ID를 가져와 복구할 수 있는 기회를 제공합니다. (Solaris 사용자는 GNU sed -i 옵션을 사용하고 Mac 및 Linux 사용자는 이 옵션을 사용하는 것이 좋습니다.)



답변자 : Yoaz Menda


git rebase -i HEAD^^

여기서 ^의 수는 X입니다.

(이 경우 마지막 두 커밋을 스쿼시)



출처 : Here


출처 : http:www.stackoverflow.com/questions/5189560/squash-my-last-x-commits-together-using-git">

반응형