git rebase를 어떻게 효과적으로 사용합니까
대부분의 개발자들이 자주 사용하지 않거나 모르는 중급/고급 개념을 설명해 드리겠습니다.
나는 본고에서 개발자가 상대적으로 적게 사용하는
rebase
명령을 토론할 것이다.우리 시작합시다.
다시 기초를 정하다
기술적으로 터미널을 재정비하면 현재 지점의 역사 기록과 기본 지점(대다수의 경우 주 지점)이 최신이도록 기본 지점을 조합하거나 이동하는 데 도움이 된다.
리디렉터는
squash the commits into one commit
및 split into multiple commits
에 도움이 되며, 복구된 모든 깨끗한 기록을 추적하고 싶으면 fix/align-div-vertically
에도 사용할 수 있습니다.제가 아래 그림을 빌려 당신에게 기조를 재정립하는 기본 원리를 설명하겠습니다
B---C---D fix/align-div-vertically
/
--A---E---F master
가정자(A-F)는 산열을 제출한다는 것을 나타낸다.지점A
은 주 지점의 제출 해시B, C, and D
를 토대로 만들어졌습니다. 계속 처리하고 있습니다. 해시pull request (PR)
로 며칠 동안 제출했습니다(매일 제출한다고 가정).현재 이 문제를 해결했습니다. 변경 사항을 마스터에 통합하고 single commit
squashing
로 만들기를 희망합니다.이것은 E
를 통해 실현할 수 있다. 나는 다음 절에서 설명할 것이다.또한 마스터 분기는 다른 개발자가 커밋
F
과 F
를 사용하여 업데이트되었습니다. 그림에서 보듯이 마스터 분기의 PR을 만들기 전에 분기의 모든 커밋을 마스터 분기의 최신 커밋rebase
위에 올려야 합니다.지점에서 주 노드의 모든 제출을 실현하려면 aliases
git 명령을 사용해야 합니다.주소 재지정 후 제출 트리는 이렇습니다.
B---C---D fix/align-div-vertically
/
--A---E---F master
기본 주소를 다시 정하기 전에, 로컬 마스터가 원격 저장소를 사용하여 업데이트할 수 있도록 마스터에 서명하고 원격에서 변경 사항을 끌어와야 합니다.$(fix/align-div-vertically) git checkout master
$(master) git fetch -p
$(master) git pull origin master
Branch point is enclosed within the parenthesis, for eg,
$(master)
indicates that we are currently in the master branch
위의 명령은
fix/align-div-vertically
의 도움말만 입력하면 실행할 수 있습니다. 더 많은 정보는 저의 이전 블로그를 보십시오.$(master) git cm && git f && git pom
Using short-circuiting (&& between multiple commands) works with
MacOS
and inLinux
distribution, if you are on windows make sure you execute each command separately.For the remainder of this article I'll use full commands to avoid confusion with aliases and to deviate from what I want to explain here.
remote를 사용하여 로컬 주 지점을 업데이트한 후
merge conflicts
에 서명하고 다음 명령을 실행합니다$(master) git checkout fix/align-div-vertically
$(fix/align-div-vertically) git rebase master
위의 명령은 현재 지점의 제출 기록을 찾고, 주 제출을 사용하여 현재 지점이 주 제출의 이전 제출 위에 위치하도록 기지를 다시 설정합니다.변경된 파일이 다른 개발자에 의해 업데이트되었고git가 자동으로 통합되지 않으면, 터미널을 다시 설정하면 merge conflicts
될 수 있지만, 최종적으로는 kdiff3
될 수 있습니다. 수동 또는 B
시각화 도구를 사용해서 충돌을 해결해야 할 수도 있습니다.리베이스는 현재 지점
C
,D
과fix/align-div-vertically
의 제출을 한 번에 적용합니다. 합병할 때 제출할 때마다git가 정지될 수 있습니다. 이 경우 최대 3회까지 적용됩니다. 왜냐하면 저희는 merge conflicts
지점에서 3회 제출했기 때문입니다.해결 rebase
Git CLI는 대부분의 충돌을 해결할 수 있는 지능이 충분합니다. 때로는 Git가 지능적이지 않아서 모든 병합 충돌을 해결할 수 없습니다. 저는 처음에 대부분의 병합 충돌을 수동으로 해결하여 최신 Git CLI보다 더 많은 파일을 얻을 수 밖에 없었습니다. 지금은 더 강력한 CLI로 대부분의 병합 충돌을 처리했습니다.제출할 때마다 멈추면 병합 충돌을 해결하고 다음 명령을 실행하여 재정립을 계속해야 한다(최대 3회, 병합 충돌이 없으면 한 번만 실행할 수 있다)
$(fix/align-div-vertically) git rebase --continue
기본 주소를 성공적으로 재정의한 후,git 로그를 보면, 역사는 다음과 같습니다.$(fix/align-div-vertically) git log --oneline -10
# commit history should look like this
D Commit message-d
C Commit message-c
B Commit message-b
F Commit message-f
E Commit message-e
A Commit message-a
You all know how the commit hash looks, it shows the first 7 chars in hexadecimal format, for eg,
62ef387
모든 합병 충돌이나 곤혹을 해결할 수 없다고 생각하고 나중에 다시 진행하기를 원한다면, 도움말 아래 전체
rebase
과정을 중단할 수 있습니다$(fix/align-div-vertically) git rebase --abort
인터랙티브 베이스를 사용하여 커밋을 단일 커밋으로 압축
만약
fix/align-div-vertically
제출할 때마다 멈추기를 원하지 않는다면 (만약 합병 충돌이 발생하고, 다시 시작하는 과정에서 한 번만 멈추기를 원한다면), 주 노드를 사용하여 다시 제출하기 전에 interactive rebase
압축을 사용하여 --interactive
분할된 모든 제출을 하나로 압축할 수 있습니다.대화형 재주소는 다음과 같은 방식으로 진행할 수 있다. 간단히 말하면 옵션
-i
또는 A
을 사용할 수 있다.$(fix/align-div-vertically) git rebase -i A
현재 지점의 모든 제출을 하나의 제출로 압축하고 제출 산열A
을 기초로 하기 때문에 우리는 B
을 제출할 수 있다. 이것은 주 제출 산열A
위의 첫 번째 제출이다.다른 창을 열 것입니다. 기본적으로
vi/vim
편집기가 열립니다. switching modes(ESC)
텍스트와 insert(i)
텍스트를 알아야 합니다. save the content and quit(:wq)
편집기를 좋아하지 않으면 git config --global core.editor
도움말 아래 보기 좋은 텍스트 편집기를 기본 편집기로 설정할 수 있습니다. (git 문서 참조)대화식rebase의 내용은 다음과 같습니다. 이 문서를 작성할 때 사용하는 Git CLI 버전은
vi/vim
입니다.pick B Commit message-b
pick C Commit message-c
pick D Commit message-d
# Rebase A..D onto A (3 commands)
#
# 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
# b, break = stop here (continue rebase later with 'git rebase --continue')
# 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.
#
# However, if you remove everything, the rebase will be aborted.
#
편집기에 열거된 제출 순서를 검사하면 현재 지점에서 제출한 순서 2.26.2
, vi
, B
, C
에 따라 열거하지만, 제출 해시 D
는 열거하지 않습니다. 이것은 압축의 기초이기 때문입니다.편집기의 내용은 사용자가 사용할 수 있는 명령과 기능에 대한 안내
A
를 제공합니다.git에서 기본적으로 모든 제출 해시를 추가하기 전에 사용 가능한 옵션 pick
, reword
, squash
, fixup
등을 선택해야 합니다. 편집기의 주석 부분을 참고하십시오.이런 상황에서 우리는
squash
또는 약칭s
을 사용해야 한다.제출C
과D
의B
를 pick
로 변경한 후 선택squash
을 기본으로 제출C
과D
는 다음과 같이 제출해야 한다.pick B Commit message-b
squash C Commit message-c
squash D Commit message-d
# And the remainder of the content, don't change anything, leave as it is.
완료되면 편집기를 저장하고 종료합니다. 합병 충돌이 있을 수 있으면git는 제출할 때마다 멈출 수 있습니다. (매일 사용하지 않으면 merge
마스터와 합병하지 않으면 합병 충돌이 거의 일어나지 않습니다.)사용git merge
도 단점이 있습니다. 필요하시면 다른 댓글에서 논의하겠습니다.rebase
가 아니라 merge
를 사용하여 지점에 깨끗한 기록을 가지고 있어야 한다.만약rebase가 멈추고 충돌을 해결하라고 요구한다면 어떻게 해야 하는지 아십니까
$(fix/align-div-vertically) git rebase --continue
리베이스가 성공하면 압축된 제출에 대한 새로운 제출 메시지를 요청하는 다른 창을 열 것입니다. 제출 메시지를 업데이트하거나 보류할 수 있습니다. 완료되면 제출 해시를 사용하여 B'
대신 B
제출을 할 수 있습니다.Be aware that the git rebase will
re-write the commit history
once it is successful, you won't be able to see the same commit hash as that ofB
once you squashedC
,D
andB
into one commit, that is why I represented it asB'
in the below diagram
제출한 메시지를 압축
B'
제출한 메시지처럼 B's
또는 squash
로 바꾸려면 fixup
로 바꾸십시오. 요컨대, 다시 주소를 지정하는 데 성공하면 다른 제출 요청 창을 열지 않습니다.pick B Commit message-b
f C Commit message-c
f D Commit message-d
# And the remainder of the content, don't change anything, leave as it is.
현재 제출 트리는 이렇게 보이지만, 최신 제출 해시 f
를 토대로 최신 주 제출을 사용하여 주소를 다시 설정하지 않았습니다. B' fix/align-div-vertically
/
--A---E---F master
일단 성공하면, 마스터를 계속 사용하고 기본 주소를 다시 설정할 수 있습니다. 그러면 마스터의 최신 제출 해시 F
에서 우위를 차지할 수 있습니다.$(fix/align-div-vertically) git rebase master
Make sure you have switched to master branch and pulled the latest changes from remote to local master branch before rebasing with the master, I've mentioned this already in the top.
현재 마스터와의 재기화 과정에서 있다면 한 번
F
만 멈출 수 있습니다. 왜냐하면 우리의 지점resolve merge conflicts
에는commit이 있기 때문입니다.압축 제출을 할 때
fix/align-div-vertically
분기를interactive rebase에 전달할 수 있지만, 더욱 자세하게 생각하거나 조작해야 한다는 것을 알아야 합니다.압력을 가하기 전에 주 지점의 변경 사항을 끌어당기지 마십시오. 그러면 로컬 주 지점의 제출 해시가 master
가리키고, 원격 변경 사항을 끌어당기면 로컬 주 지점에서 해시를 제출할 것입니다. A
$(fix/align-div-vertically) git rebase -i master
현재, 해시 F
를 제출하지 않고 상호작용 베이스를 실행할 때 master
를 매개 변수로 전달할 수 있습니다.완료되면 마스터로 돌아가서 원격에서 변경 사항을 가져오고 지점을 사용하여 기본 주소를 다시 설정합니다.
A
를 사용하여 단일 제출을 multiple commits
로 나눌 수 있는 방법이 있다. 내가 보기에 이것은 어떤 개발자가 가장 원하는 기능도 아니다. 나는 지금까지 이런 상황을 만난 적이 없다. 나는 6년의 경험에서 적어도 한 번은 이 기능을 사용해야 하지만 나는 확실히 interactive rebase
수천 번을 사용했다.내가 언급한 바와 같이git rebase는 완전한 역사 기록을 다시 작성할 것입니다. 모든 제출
squshing
, B
또는 C
의 인코딩이나 제출 부분을 보기/검사할 수 없습니다. 걱정하지 마십시오.git는 로컬 지점의 D
또는 reflog
여러 제출 get back the history
을 하나로 통합하는 강력한 도구를 제공합니다.변경 사항을 주 파일reset the history
에 통합한 후에만 로컬 복사본이 변경되지 않음(삭제되지 않음)될 수 있습니다.squashing
에서 분기를 삭제했지만 로컬 복사본이 있고 파일 시스템PR
에서 삭제되지 않은 경우에는 걱정할 필요가 없습니다.나는 다음 문장
GitHub UI
에서 이 점을 어떻게 하는지 설명할 것이다.만약 당신이 그것을 적게 설명하거나 원시적인 형식으로 해석하고 싶다면, 당신은 나의 github-repo 내용을 방문할 수 있지만, 그것은 내가 매일 사용하는 손수 쓴 노트이며, 내가 블로그에 쓴 설명도, 맞춤법과 문법에 대해 너무 많은 관심을 가지지 않았다.그것 또한 당신의 참고로 삼을 수 있습니다. 만약 당신이 그것이 유용하다고 생각하고, 또 다른 유용한 내용이 있다면, 당신의 친구와 공유해 주십시오.이것은 점점 커지고, 리베이스에 대한 많은 설명을 해 왔다. 만약 당신이 이전에 시도해 본 적이 없다면, 시도해 보세요.이것은 정말 많은 시간을 절약할 수 있다.
지금 이대로만약 당신이 유용하다고 생각한다면, 평론을 남기고 친구와 공유하세요.만약git나 전단/후단과 관련된 모든 화제를 보도하고 싶다면 저에게 알려주세요.
즐거움, 미소 유지.
Reference
이 문제에 관하여(git rebase를 어떻게 효과적으로 사용합니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kpunith8/how-to-use-git-rebase-effectively-145e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)