Welcome to Our Website

Git Interactive Rebase,Squash,Amend 및 히스토리 재 작성의 다른 방법

“master 위에 rebase 하면 pull 요청을 병합 할 것입니다.”

“커밋을 함께 스쿼시하여 깨끗하고 뒤집을 수있는 githistory 를 얻을 수 있습니까?”.

“커밋의 메시지를 다시 작성하여 문제를 더 잘 설명하고 어떻게 해결할 수 있습니까?”.

이와 같은 질문은 일반적으로 풀 요청에서 묻습니다. 왜 그들의존재,수행 방법 및 가능한 문제.,

바꾸어 말하면 마지막 커밋 메시지

중 하나의 간단한 역사를 다시 쓰는 우리가 할 수 있습니다 git 변화 lastcommit 메시지입니다. 커밋을 한 직후에 itsdescription 에서 오타를 찾거나 변경 집합을 설명하는 더 좋은 방법을 찾는다 고 가정 해 봅시다. 을 thecorrection 를 실행:

git commit --amend 

을하 편집기실시 마지막 커밋 메시지,그래서 당신은 그것을 수정할 수 있습니다. 저장 후 새 커밋동일한 변경 사항과 새 메시지로 만들어 커밋을 이전 메시지로 바꿉니다.,

이것은 추적하는 것을 잊어 버린 파일을 포함 시키거나 방금 커밋 한 파일에 포함시키는 데 유용 할 수 있습니다. 이렇게 추가할 수 있습니다 changesand 다음을 수행할 수:

git add README.md config/routes.rb git rm notes.txt git commit --amend 

고객께서는 편집 commit 메시지,새로운 commit 포함됩니다 changesspecifiedgit addgit rm. 작성자를 편집할 수도 있습니다. 나는 이것이 내가 할 수있는 유일한 방법이라고 생각한다., 을 변경할 수 있습니다 마지막 커밋 ofyour 저장소를 포함한 새로운 파일을 변경 및/또는 개선하는 thecommit 메시지입니다. 그러나”위험”이라는 제목의이 블로그 게시물의 마지막 섹션을 이해하기 전에 모든 것을 수정하기 시작하지 마십시오.

Reword 다른 커밋 메시지

지금 이것에 대해 말하고 싶지만,우리는 전에 더 일반적인툴을 이해해야합니다. 계속 지켜봐주십시오! 다른 모든 것을 쉽게 될 것입니다 일단 우리가에 대해 읽을 수 있습니다…

대화형 리베

git rebase다시 적용약 하나 byone,기 위해서는,현재 지점에 다른입니다., 그것은 여러 optionsand 매개 변수를 허용하므로 stackoverflow 또는 GitHub 주석과 git man 페이지 사이에서 thegap 을 해소하기에 충분한 빙산 설명의 일각입니다.

허용되는 흥미로운 옵션은--interactive(-i짧게)입니다. Thislist 는 명령을 허용하여 사용자가베이스 작업을 시작하기 전에 목록을 편집 할 수 있도록합니다.예를 들어 보겠습니다.,

Reword 다른 커밋 메시지,take2

이 블로그의 마지막 4 개의 커밋 중 하나를 reword 하고 싶다고 가정 해 봅시다. 나는 다음을 실행git rebase -i HEAD~4,그리고 여기에 무엇보:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # 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 

우리는 네 개의 마지막 커밋 이전에서 최신입니다. 아래 코멘트를 참조하십시오.커밋 목록? 설명 잘 했어,힘내! 이 작업을 수행하려면 다음 단계를 따르고 다음 단계를 수행해야 합니다. 이 경우 커밋을 그대로 다시 적용하고 itscontents 또는 메시지를 변경하지 않습니다. 이 파일을 저장(및 실행)하면 저장소에 대한 변경 사항이 없습니다.,

말하는 경우에는reword(r)에서 commit 편집하고 싶습니다:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

때 나는 저장하고 종료한 편집기의 명령에 따라 설명 명령,landingmyself 으로 편집시 으면 나는 개정 commit3e7ee36. 편집 thatcommit 메시지를 저장하고 종료 편집,및 출력은 다음과 같습니다.

이 갈렙이 말하에서 자신의 commit 메시지는”모든 강조 표시 여부,”youare 아이거나지 않습니다.

성취 잠금 해제! 이제 원하는 anycommit 의 메시지를 변경할 수 있습니다., 당신은 그렇게 할 수 있습니다,그냥”위험”섹션을 이해했는지 확인하십시오.

스쿼시 commits 함께

다른 두 명령’head’우리를 제공합습니다:

  • squash(s에 대한 짧은)를 혼합한다 commit 으로 이전(theone 시스템은 줄기)
  • fixup(f에 대한 짧은)와 같은 역할을 하는”스쿼시”지만,폐기 이 commit’smessage

우리는 작업을 계속 개상 예를 들어 우리는 workedbefore., 우리가 저지른 것을,내 자신에 대한 이 블로그 게시물 andthree 다른 사람에서 갈렙이,어떤 관련이 있었다 자신의 이전 게시물에 PGP

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

게 말하는 내가 원하는 융합 갈렙의 커밋 함께하기 때문에,그들이 속한 같은 논리적 집합, 그래서 우리는 할 수 있습니다git revert경우 쉽게 찾아 우리 weprefer 하지 않는 사람들에 변경이 있습니다. 우리는 첫 번째 커밋 메시지를 유지하고 두 개의 후속 커밋을 이전 커밋으로 스쿼시하고 싶을 것입니다., 나는 변화picksquash적절한 경우:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

저장,그리고 나는 땅으로 편집을 결정하 commit 메시지의 meldedthree 커밋(들이 어떻게 연결 한 후 다른):

# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'. 

I 를 제거하기로 결정한 제삼 commit 메시지를 추가 더 관련 참고하여 두 번째 commit 메시지입니다. 편집기를 저장하고 네 개의 커밋이 변환되었습니다.두 가지로:갈렙에서 하나,그리고 내 후. 좋은!,

우리가 사용할 수 있는fixup명령으면 우리는 이전에 볼 수 없었는 우리가 원하는 내용을지만,commit 메시지의 세 번째다. 는 경우,thecommands 처럼 보이는 것이다:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

저장하면,편집기가 포함되어 있는 세 번째 commit 메시지 alreadycommented 우리를 위해 밖으로.

저장하고,출력:

결과는 동일:2 커밋을 대신 4,각각의 단,다른 블로그 게시물.

성취 잠금 해제! 이제 커밋을 함께 병합 할 수 있습니다. 항상 위험 섹션을 염두에 두어야합니다.,

리베이스에서 최고의 마스터

우리는 포크 오픈 소스 라이브러리 작업을 시작 기능을 지점,그리고 마스터에서 상류 프로젝트 앞으로 이동. 우리의 역사는 다음과 같

 A---B---C feature / D---E---F---G upstream/master 

라이브러리 관리자에게 요청으로”리베이스에서 최고의 마스터”그래서 우리는 해결 mergeconflicts 사이에 발생할 수있는 모두 가지고,우리의 집합이다.관리자는 것처럼 역사를 확인하고 다음과 같다.

 A'--B'--C' feature / D---E---F---G upstream/master 

우리는 다시 우리의약에 의해 하나,하나를 위해서는,위의 업스트림 마스터입니다.,리베이스 명령에 대한 설명처럼 들립니다! 알 명령 wouldland 으로 우리가 원하는 시나리오:

# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature 

성과 잠금이 해제됩니다! 귀하의 기능 분기가 적용됩니다.원래 포크의 최신 마스터의 상단.

고 그래서 우리가 얻을 수 있습니다…

험:당신은 역사를 다시 쓰기

--force에 마지막git push명령? 즉,우리가 덮어 쓰고 있음을 의미합니다.레포지션의 역사., 이것은 항상 안전하에서 커밋 우리가 공유하지 않는 읍 withother 은 팀 구성원에서,또는 지사는 우리에 속하십시오(내 이니셜에서 예제의 이 블로그 게시물).

하지만 당신이 강제로 밀어 버전 이미와 공유 팀(commitsthat 외부의 존재는 저처럼 내가 변경 사항을 PGP commitsthat 가되어 이미 공용),다음 모두는 지점의 동기화됩니다.

역사를 다시 쓰다는 뜻이 기존 커밋을 만들고 새로운 것들,thatmay 매우 비슷하지만이 다릅니다., 는 경우 다른 기업에서 당신의 previouscommits,그리고 당신은 다시 작성 및 강제로 밀어약 팀 memberswill 을 다시 자신의 작업을 병합하는 경우에(은 그들이 그 잠재적 손실).

에 thoughtbot 는 접두사를 가지로 우리의 이니셜로,신호는 thosecommits 얻을 수 있습니다 다시 작성하고 다른 사람을 추가해서는 안 됩 커미 지점에 있습니다. 토지를 마스터 또는 공유 브랜치로 커밋 할 때 우리는 다시 다시 작성하지 않습니다.

그렇게 다시 작성 git 기록을 제공해 다시 작성이 커밋에서만 존재 yourrepository,또는 당신과 당신의 팀이나 다른베이스 작동 ofthem.,

성취 잠금 해제! 당신은 지금 agood 시민 인 동안 rebase 하는 방법을 알고있다.피>

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다