개발 워크플로 #
Make your own copy (fork) of Matplotlib 에 따라 이미 Matplotlib 리포지토리 의 포크된 복사본이 있습니다. 포크 를 설정했습니다 . Configure git에 따라 git을 구성 했습니다. 이제 실제 작업을 할 준비가 되었습니다.
워크플로 요약 #
다음에서는 업스트림 Matplotlib main
분기를 "트렁크"라고 합니다.
main
귀하의 지점을 아무 것도 사용하지 마십시오 . 삭제를 고려하십시오.새로운 변경 세트를 시작할 때 트렁크에서 변경 사항을 가져오고 새 기능 분기 를 시작하십시오.
각각의 분리 가능한 변경 세트에 대해 "하나의 작업, 하나의 분기"( ipython git workflow ) 에 대해 새 분기를 만듭니다 .
변경을 위해 분기 이름을 지정하십시오(예:
bugfix-for-issue-14
또는refactor-database-code
).피할 수 있다면 작업하는 동안 트렁크나 다른 분기를 기능 분기에 병합하지 마십시오.
트렁크에서 병합하는 경우 트렁크 기반 리베이스를 고려하십시오.
막히면 Matplotlib 메일링 리스트 에 질문하십시오 .
코드 리뷰를 요청하세요!
이러한 작업 방식은 읽기 쉬운 기록과 함께 작업을 체계적으로 유지하는 데 도움이 됩니다. 그러면 프로젝트 관리자(귀하일 수 있음)가 수행한 작업과 수행 이유를 쉽게 확인할 수 있습니다.
일부 설명 은 linux git workflow 및 ipython git workflow 를 참조하십시오 .
메인 브랜치 삭제 고려 #
이상하게 들릴 수 있지만 자신의 main
분기를 삭제하면 현재 있는 분기에 대한 혼동을 줄이는 데 도움이 됩니다. 자세한 내용 은 github 에서 main 삭제를 참조하세요.
트렁크 미러 업데이트 #
먼저 리포지토리를 업스트림 리포지토리에 연결 했는지 확인하십시오 .
때때로 github에서 업스트림(트렁크) 변경 사항을 가져와야 합니다.
git fetch upstream
이것은 가지고 있지 않은 커밋을 풀다운하고 원격 브랜치가 올바른 커밋을 가리키도록 설정합니다. 예를 들어 'trunk'는 (remote/branchname)이 참조하는 브랜치입니다. upstream/main
마지막으로 확인한 이후 커밋이 upstream/main
있는 경우 가져오기를 수행한 후 변경됩니다.
새 기능 분기 만들기 #
코드를 변경할 준비가 되면 새 분기를 시작해야 합니다. 관련 편집 모음을 위한 분기를 '기능 분기'라고도 합니다.
각 관련 변경 세트에 대해 새 분기를 만들면 분기를 검토하는 사람이 수행 중인 작업을 더 쉽게 볼 수 있습니다.
브랜치의 변경 사항이 무엇인지 자신과 다른 사람들에게 상기시키기 위해 브랜치에 대한 유익한 이름을 선택하십시오. 예를 들어 add-ability-to-fly
, 또는
bugfix-for-issue-42
.
# Update the mirror of trunk
git fetch upstream
# Make new feature branch starting at current trunk
git branch my-new-feature upstream/main
git checkout my-new-feature
일반적으로 Matplotlib 의 공개 github
포크 에 기능 분기를 유지하려고 합니다 . 이렇게 하려면 이 새 분기를 github 저장소로 git push 합니다. 일반적으로(이 페이지의 지침을 따르고 기본적으로) git에는 github 리포지토리에 대한 링크가 있습니다 . 다음을 사용하여 github에서 자신의 리포지토리를 푸시합니다.origin
git push origin my-new-feature
--set-upstream
git >= 1.7에서 다음 옵션 을 사용하여 링크가 올바르게 설정되었는지 확인할 수 있습니다
.
git push --set-upstream origin my-new-feature
이제부터 git은 그것이 github repo의 브랜치 my-new-feature
와 관련되어
있음을 알게 될 것입니다.my-new-feature
편집 워크플로 #
개요 #
# hack hack
git add my_new_file
git commit -am 'NF - some message'
git push
더 자세히 #
일부 변경
어떤 파일이 변경 되었는지 확인합니다 ( git status 참조 ). 다음과 같은 목록이 표시됩니다.
git status
# On branch ny-new-feature # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # INSTALL no changes added to commit (use "git add" and/or "git commit -a")
실제 변경 사항이 무엇인지 확인하십시오 ( git diff ).
git diff
버전 제어에 새 파일을 추가합니다 ( git add 참조 ).
git add new_file_name
수정된 모든 파일을 리포지토리의 로컬 복사본에 커밋하려면 다음을 수행하십시오 . 에 대한 옵션에 유의하십시오 . 플래그 는 명령줄에 메시지를 입력할 것이라는 신호일 뿐입니다. 깃발 - 당신은 믿음을 가질 수 있습니다 - 또는 왜 -a 깃발을 보십니까? — 그리고 얽힌 작업 사본 문제 의 유용한 사용 사례 설명 . git commit 매뉴얼 페이지도 유용할 수 있습니다 .
git commit -am 'A commit message'
-am
commit
m
a
변경 사항을 github에서 분기된 리포지토리로 푸시하려면 a를 수행합니다 ( git push 참조 ).
git push
변경 사항을 검토하거나 병합하도록 요청 #
다른 사람에게 코드를 검토하고 병합을 고려하도록 요청할 준비가 되었으면 다음을 수행하십시오.
포크된 리포지토리의 URL로 이동합니다. 예를 들어
https://github.com/your-user-name/matplotlib
.페이지 왼쪽 상단 근처의 '분기 전환' 드롭다운 메뉴를 사용하여 변경 사항이 있는 분기를 선택합니다.
'풀 리퀘스트' 버튼을 클릭합니다:
변경 사항 세트의 제목과 수행한 작업에 대한 설명을 입력합니다. 복잡한 변경이나 마음에 들지 않는 일부 코드와 같이 특별히 주의를 기울여야 하는 것이 있으면 말하십시오.
요청을 병합할 준비가 되지 않았다고 생각되면 풀 요청 메시지에 그렇게 말하세요. 이것은 여전히 예비 코드 검토를 얻는 좋은 방법입니다.
당신이 하고 싶은 다른 일들 #
github에서 브랜치 삭제 #
git checkout main
# delete branch locally
git branch -D my-unwanted-branch
# delete branch on github
git push origin :my-unwanted-branch
:
앞에 있는 콜론에 유의하십시오 my-unwanted-branch
. 참조:
https://help.github.com/articles/pushing-to-a-remote/#deleting-a-remote-branch-or-tag
단일 저장소를 공유하는 여러 사람 #
다른 사람들과 함께 같은 저장소나 같은 브랜치에 커밋하는 작업을 하고 싶다면 github를 통해 공유하세요.
Matplotlib 의 자신만의 사본(포크) 만들기 에서와 같이 먼저 Matplotlib를 계정에 포크 합니다.
그런 다음 포크된 저장소 github 페이지로 이동합니다.
https://github.com/your-user-name/matplotlib
'관리자' 버튼을 클릭하고 다른 사람을 공동 작업자로 저장소에 추가합니다.
이제 모든 사람들이 다음을 수행할 수 있습니다.
git clone https://github.com/your-user-name/matplotlib.git
https
또는 로 시작하는 링크 git@
는 읽기-쓰기이며
git@
ssh 프로토콜을 사용한다는 점을 기억하십시오.
그런 다음 공동 작업자는 평소와 같이 해당 저장소에 직접 커밋할 수 있습니다.
git commit -am 'ENH - much better code'
git push origin main # pushes directly into your repo
리포지토리 탐색 #
저장소 브랜치 및 커밋의 그래픽 표현을 보려면 다음을 수행하십시오.
gitk --all
이 분기에 대한 커밋의 선형 목록을 보려면 다음을 수행하십시오.
git log
github 저장소 의 네트워크 그래프 시각화 도우미를 볼 수도 있습니다 .
마지막으로 Fancy 로그 출력 lg
별칭은 리포지토리의 합리적인 텍스트 기반 그래프를 제공합니다.
트렁크 # 기반 리베이스
하고 싶은 일이 생각났다고 가정해 봅시다. 트렁크의 미러를 업데이트하고 라는
새 기능
분기cool-feature
를 만듭니다 . 이 단계 트렁크는 어떤 커밋에 있습니다. 이를 E라고 부르겠습니다. 이제 cool-feature
브랜치에서 새로운 커밋을 만들고 A, B, C라고 부르겠습니다. 변경 사항에 시간이 걸리거나 잠시 후에 다시 돌아올 수 있습니다. 그 동안 트렁크는 커밋 E에서 커밋(말하자면) G로 진행되었습니다.
A---B---C cool-feature
/
D---E---F---G trunk
이 단계에서 트렁크를 기능 브랜치로 병합하는 것을 고려하고 이 페이지에서 히스토리가 지저분해지기 때문에 그렇게 하지 말라고 엄격하게 조언한다는 것을 기억하십시오. 대부분의 경우 검토를 요청할 수 있으며 트렁크가 조금 앞서 있다고 걱정할 필요가 없습니다. 그러나 때로는 트렁크의 변경 사항이 변경 사항에 영향을 미칠 수 있으므로 이를 조화시켜야 합니다. 이 상황에서는 리베이스를 수행하는 것이 좋습니다.
rebase는 변경 사항(A, B, C)을 가져와서 의 현재 상태에 적용된 것처럼 재생합니다 trunk
. 즉, 이 경우 A, B, C로 표시된 변경 사항을 가져와 G 위에서 재생합니다. 리베이스 후 기록은 다음과 같습니다.
A'--B'--C' cool-feature
/
D---E---F---G trunk
자세한 내용은 rebase without tear 를 참조하세요.
트렁크에서 리베이스를 수행하려면:
# Update the mirror of trunk
git fetch upstream
# go to the feature branch
git checkout cool-feature
# make a backup in case you mess up
git branch tmp cool-feature
# rebase cool-feature onto trunk
git rebase --onto upstream/main upstream/main cool-feature
이미 branch 에 있는 이 상황에서 cool-feature
마지막 명령은 다음과 같이 더 간결하게 작성할 수 있습니다.
git rebase upstream/main
모든 것이 좋아 보이면 백업 분기를 삭제할 수 있습니다.
git branch -D tmp
상태가 좋지 않으면 엉망진창 에서 복구 를 살펴봐야 할 수도 있습니다 .
트렁크에서도 변경된 파일을 변경한 경우 해결해야 하는 병합 충돌이 발생할 수 있습니다 . "설명" 섹션 끝에 있는 몇 가지 지침은 git rebase 매뉴얼 페이지를 참조하세요. git 사용자 설명서에 병합에 대한 관련 도움말이 있습니다 . 병합 해결을 참조하세요 .
엉망진창에서 복구 #
때로는 병합 또는 리베이스를 엉망으로 만듭니다. 다행스럽게도 git에서는 이러한 실수를 복구하는 것이 비교적 간단합니다.
리베이스 중에 엉망이 된 경우:
git rebase --abort
리베이스 후에 엉망이 된 것을 발견한 경우:
# reset branch back to the saved point
git reset --hard tmp
백업 분기를 만드는 것을 잊은 경우:
# look at the reflog of the branch
git reflog show cool-feature
8630830 [email protected]{0}: commit: BUG: io: close file handles immediately
278dd2a [email protected]{1}: rebase finished: refs/heads/my-feature-branch onto 11ee694744f2552d
26aa21a [email protected]{2}: commit: BUG: lib: make seek_gzip_factory not leak gzip obj
...
# reset the branch to where it was before the botched rebase
git reset --hard [email protected]{2}
커밋 히스토리 재작성 #
메모
자신의 기능 분기에 대해서만 이 작업을 수행하십시오.
당신이 만든 커밋에 부끄러운 오타가 있습니까? 아니면 당신이 몇 번의 잘못된 출발을 했다면 당신은 후손들이 보지 않기를 바랄 것입니다.
이는 대화식 리베이스 를 통해 수행할 수 있습니다 .
커밋 기록이 다음과 같다고 가정합니다.
git log --oneline
eadc391 Fix some remaining bugs
a815645 Modify it so that it works
2dec1ac Fix a few bugs + disable
13d7934 First implementation
6ad92e5 * masked is now an instance of a new object, MaskedConstant
29001ed Add pre-nep for a copule of structured_array_extensions.
...
분기 의 6ad92e5
마지막 커밋입니다 . cool-feature
다음과 같이 변경한다고 가정합니다.
커밋 메시지
13d7934
를 좀 더 합리적인 것으로 다시 작성하십시오.커밋
2dec1ac
,a815645
,eadc391
을 하나로 결합합니다.
우리는 다음과 같이 합니다.
# make a backup of the current state
git branch tmp HEAD
# interactive rebase
git rebase -i 6ad92e5
그러면 다음 텍스트가 포함된 편집기가 열립니다.
pick 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
pick a815645 Modify it so that it works
pick eadc391 Fix some remaining bugs
# Rebase 6ad92e5..eadc391 onto 6ad92e5
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
원하는 것을 달성하기 위해 다음과 같이 변경합니다.
r 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
f a815645 Modify it so that it works
f eadc391 Fix some remaining bugs
이는 (i) 에 대한 커밋 메시지를 편집
13d7934
하고 (ii) 마지막 세 커밋을 하나로 축소하려는 것을 의미합니다. 이제 편집기를 저장하고 종료합니다.
Git은 커밋 메시지를 편집하기 위한 편집기를 즉시 불러옵니다. 수정 후 출력을 얻습니다.
[detached HEAD 721fc64] FOO: First implementation
2 files changed, 199 insertions(+), 66 deletions(-)
[detached HEAD 0f22701] Fix a few bugs + disable
1 files changed, 79 insertions(+), 61 deletions(-)
Successfully rebased and updated refs/heads/my-feature-branch.
이제 역사는 다음과 같습니다.
0f22701 Fix a few bugs + disable
721fc64 ENH: Sophisticated feature
6ad92e5 * masked is now an instance of a new object, MaskedConstant
잘못되면 위에서 설명한대로 다시 복구가 가능합니다 .