팀 개발에서는 합리적이고 명확한 Git 사용 프로세스를 따르는 것이 매우 중요합니다.
그렇지 않으면 모든 사람이 무질서한 커밋을 제출하게 되고 프로젝트 조정 및 유지 관리가 금방 어려워질 것입니다.
다음은 ThoughtBot의 Git 사용 사양 프로세스입니다. 나는 그것으로부터 많은 것을 배웠고 Git을 같은 방식으로 사용하는 것이 좋습니다.
1단계: 새 브랜치 생성
우선 새로운 기능을 개발할 때마다 별도의 브랜치를 생성해야 합니다(이를 위해 "Git Branch 관리 전략"을 참조하세요).
# 获取主干最新代码 $ git checkout master $ git pull # 新建一个开发分支myfeature $ git checkout -b myfeature
2단계: 브랜치 커밋 제출
브랜치를 수정한 후 커밋을 제출할 수 있습니다.
$ git add --all $ git status $ git commit --verbose
git add 명령의 all 매개변수는 모든 변경 사항(새 생성, 수정 및 삭제 포함)을 저장한다는 의미입니다. Git 2.0부터는 all이 git add의 기본 매개변수이므로 대신 git add를 사용할 수도 있습니다.
git status 명령은 변경된 파일을 보는 데 사용됩니다.
git commit 명령의 verbose 매개변수는 diff 결과를 나열합니다.
3단계: 제출 메시지 작성
커밋을 제출할 때 완전하고 간결한 제출 메시지를 제공해야 합니다. 다음은 샘플입니다.
Present-tense summary under 50 characters * More information about commit (under 72 characters). * More information about commit (under 72 characters).
첫 번째 줄은 50단어 이내의 요약이고, 그 다음 빈 줄에는 변경 이유, 주요 변경 사항, 주의가 필요한 문제가 나열됩니다. 마지막으로 해당 URL(예: 버그 티켓)을 제공하세요.
4단계: 트렁크와 동기화
브랜치 개발 과정에서는 항상 트렁크와 동기화가 필요합니다.
$ git fetch origin $ git rebase origin/master
5단계: 커밋 병합
브랜치 개발이 완료된 후 많은 커밋이 있을 수 있지만 트렁크에 병합할 때 커밋만 갖고 싶은 경우가 많습니다. 하나(또는 최대 2~3개)의 커밋은 명확할 뿐만 아니라 관리하기도 쉽습니다.
그럼 여러 커밋을 어떻게 병합할 수 있나요? 이를 위해서는 git rebase 명령이 필요합니다.
$ git rebase -i origin/master
git rebase 명령의 i 매개변수는 대화형을 나타냅니다. 이때 git은 다음 단계를 위한 대화형 인터페이스를 엽니다.
다음은 Tute Costa의 예를 사용하여 커밋 병합 방법을 설명합니다.
git rebase 명령의 i 매개변수는 대화형을 나타냅니다. 이때 git은 다음 단계를 위한 대화형 인터페이스를 엽니다.
다음은 Tute Costa의 예를 사용하여 커밋 병합 방법을 설명합니다.
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
위의 대화형 인터페이스는 먼저 현재 브랜치의 최신 커밋 4개를 나열합니다(낮을수록 최신 커밋입니다). 각 커밋 앞에는 작업 명령이 있습니다. 기본값은 pick입니다. 이는 이 줄의 커밋이 선택되어 리베이스되어야 함을 의미합니다.
4개의 커밋 아래에는 사용할 수 있는 명령을 나열하는 많은 댓글이 있습니다.
pick:正常选中 reword:选中,并且修改提交信息; edit:选中,rebase时会暂停,允许你修改这个commit(参考这里) squash:选中,会将当前commit与上一个commit合并 fixup:与squash相同,但不会保存当前commit的提交信息 exec:执行其他shell命令
위 6가지 명령 중 squash와 fixup을 사용하여 커밋을 병합할 수 있습니다. 먼저 병합해야 하는 커밋 앞의 동사를 스쿼시(또는 s)로 변경합니다.
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
이 변경으로 인해 실행 후 현재 브랜치에는 커밋이 2개만 남게 됩니다. 두 번째와 세 번째 줄의 커밋은 첫 번째 줄의 커밋으로 병합됩니다. 제출 정보에는 이 세 가지 커밋의 제출 정보도 포함됩니다.
# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting
세 번째 줄의 squash 명령을 fixup 명령으로 변경하면.
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
실행 결과는 동일합니다. 두 번째 및 세 번째 줄의 커밋이 첫 번째 줄의 커밋으로 병합됩니다. 그러나 새로운 제출 정보에서는 커밋 정보의 세 번째 줄이 주석 처리됩니다.
# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: # Hey kids, stop all the highlighting
squash 및 fixup 명령을 명령줄 매개변수로 사용하여 커밋을 자동으로 병합할 수도 있습니다.
$ git commit --fixup $ git rebase -i --autosquash
사용법은 이 글을 참고하세요. 여기서는 설명하지 않습니다.
6단계: 원격 창고로 푸시
合并commit后,就可以推送当前分支到远程仓库了。
$ git push --force origin myfeature
git push命令要加上force参数,因为rebase以后,分支历史改变了,跟远程分支不一定兼容,有可能要强行推送(参见这里)。
第七步:发出Pull Request
提交到远程仓库以后,就可以发出 Pull Request 到master分支,然后请求别人进行代码review,确认可以合并到master。