푸시 된 후 커밋을 스쿼시하는 방법은 무엇입니까?
이것은 여러 커밋을 스쿼시하는 것에 대한 좋은 설명을 제공합니다.
http://git-scm.com/book/en/Git-Branching-Rebasing
그러나 이미 푸시 된 커밋에는 작동하지 않습니다. 로컬 및 원격 저장소에서 가장 최근의 커밋을 어떻게 스쿼시합니까?
편집 : 내가 할 때 git rebase -i origin/master~4 master
첫 번째를로 유지하고 pick
다른 세 개를로 설정 squash
한 다음 종료하십시오 (emacs의 cx cc를 통해).
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
여기서 2f40은 pick
커밋입니다. 그리고 이제 4 개의 커밋 중 어느 것도에 나타나지 않습니다 git log
. 커밋 메시지를 입력 할 수 있도록 편집기를 다시 시작해야했습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
스쿼시와 로컬로 커밋
git rebase -i origin/master~4 master
그런 다음
git push origin +master
차이 사이 --force
와+
의 문서에서 git push
:
참고
--force
때문에 그것을 사용하여 가압되는 모든 심판에 적용push.default
되도록 설정matching
혹은 구성 여러 목적지로 푸시remote.*.push
(이들 원격 상대방 뒤에 엄격 로컬 심판을 포함한) 현재의 분기 이외 심판을 덮어 쓸 수있다. 하나의 브랜치에만 푸시를하려면 참조+
스펙 앞의를 사용 하여 푸시합니다 (예 :git push origin +master
푸시를master
분기 로 강제 ).
지점에서 나는 이렇게 할 수있었습니다 (마지막 4 커밋에 대해)
git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
받아 들일만한 대답과는 약간의 차이가 있었지만, 나는 스쿼시하는 데 많은 어려움을 겪고 마침내 그것을 얻었습니다.
$ git rebase -i HEAD~4
- 대화식 화면이 열리면 스쿼시 하려는 모든 커밋의 상단에 pick 을 squash 로 바꿉니다.
- 저장하고 편집기를 닫습니다
esc --> :wq
다음을 사용하여 리모컨으로 미십시오.
$ git push origin branch-name --force
문제의 많은 단지를 작성하여 방지 할 수 있습니다 branch
에 대한 작업에 & 하지 작업 master
:
git checkout -b mybranch
다음 remote
은 이미 푸시 된 커밋 및 remote
푸시 된 커밋 / local
커밋 만 혼합에서 작동합니다 .
# example merging 4 commits
git checkout mybranch
git rebase -i mybranch~4 mybranch
# at the interactive screen
# choose fixup for commit: 2 / 3 / 4
git push -u origin +mybranch
또한 도움이 될만한 끌어 오기 요청 메모 가 있습니다.
git rebase -i master
에디터 vm을 열면 다음과 같은 메시지가 나타납니다.
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
여기에서는 다른 모든 커밋에 대한 선택을 "f"(픽스 업용 스탠드)로 변경했습니다.
git push -f origin feature/feature-branch-name-xyz
이것은 한 커밋에 대한 모든 커밋을 고치고 다른 모든 커밋을 제거합니다. 나는 이것을했고 그것은 나를 도왔다.
하나의 브랜치에서 두 개의 커밋을 스쿼시하기 위해 다음 중 하나를 수행했습니다.
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
기본적으로 여기에는 최신 커밋의 커밋 메시지가 이전 커밋에 대한 주석으로 포함됩니다.
1) 자식 rebase -i HEAD ~ 4
To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)
2)이 시점에서 편집기는 커밋 목록과 함께 두 번째 및 다음 커밋을 변경하고 pick을 squash로 바꾼 다음 저장합니다.
출력 : refs / heads / branch-name을 성공적으로 리베이스하고 업데이트했습니다.
3) git push origin refs / heads / branch-name-포스
출력 : ... remote : remote : branch-name에 대한 병합 요청을 작성하려면 다음을 방문하십시오. remote : http : // xxx / sc / server / merge_requests / new? merge_request % 5Bsource_branch % 5D = sss remote : to ip : sc /server.git + 84b4b60 ... 5045693 branch-name-> branch-name (강제 업데이트)
Gitlab 또는 Github으로 작업 할 때 이런 방식으로 문제가 발생할 수 있습니다. 위의 방법 중 하나를 사용하여 커밋을 스쿼시하십시오. 내가 가장 선호하는 것은 :
git rebase -i HEAD~4
or
git rebase -i origin/master
커밋에 대한 스쿼시 또는 수정을 선택하십시오. 이 시점에서 git status로 확인하십시오. 메시지는 다음과 같습니다.
On branch ABC-1916-remote
Your branch and 'origin/ABC-1916' have diverged,
and have 1 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
그리고 당신은 그것을 당기고 싶은 유혹을받을 수 있습니다. 그렇게하지 않으면 이전과 같은 상황에 처하게됩니다.
대신 다음을 사용하여 원점으로 푸시하십시오.
git push origin +ABC-1916-remote:ABC-1916
+는 하나의 브랜치에만 푸시를 허용합니다.
참고 URL : https://stackoverflow.com/questions/5667884/how-to-squash-commits-in-git-after-they-have-been-pushed
'development' 카테고리의 다른 글
Vim and Ctags 팁과 요령 (0) | 2020.02.13 |
---|---|
compileSdkVersion과 targetSdkVersion의 차이점은 무엇입니까? (0) | 2020.02.13 |
배열의 길이를 어떻게 찾습니까? (0) | 2020.02.13 |
T-SQL : 조인을 통해 삭제할 행 선택 (0) | 2020.02.13 |
레일에서 스캐 폴딩 실행 취소 (0) | 2020.02.13 |