개발 워크플로 #

Make your own copy (fork) of Matplotlib 에 따라 이미 Matplotlib 리포지토리 의 포크된 복사본이 있습니다. 포크 를 설정했습니다 . Configure git에 따라 git을 구성 했습니다. 이제 실제 작업을 할 준비가 되었습니다.

워크플로 요약 #

다음에서는 업스트림 Matplotlib main분기를 "트렁크"라고 합니다.

이러한 작업 방식은 읽기 쉬운 기록과 함께 작업을 체계적으로 유지하는 데 도움이 됩니다. 그러면 프로젝트 관리자(귀하일 수 있음)가 수행한 작업과 수행 이유를 쉽게 확인할 수 있습니다.

일부 설명 은 linux git workflowipython 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-upstreamgit >= 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

더 자세히 #

  1. 일부 변경

  2. 어떤 파일이 변경 되었는지 확인합니다 ( 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")
    
  3. 실제 변경 사항이 무엇인지 확인하십시오 ( git diff ).git diff

  4. 버전 제어에 새 파일을 추가합니다 ( git add 참조 ).git add new_file_name

  5. 수정된 모든 파일을 리포지토리의 로컬 복사본에 커밋하려면 다음을 수행하십시오 . 에 대한 옵션에 유의하십시오 . 플래그 는 명령줄에 메시지를 입력할 것이라는 신호일 뿐입니다. 깃발 - 당신은 믿음을 가질 수 있습니다 - 또는 왜 -a 깃발을 보십니까? — 그리고 얽힌 작업 사본 문제 의 유용한 사용 사례 설명 . git commit 매뉴얼 페이지도 유용할 수 있습니다 .git commit -am 'A commit message'-amcommitma

  6. 변경 사항을 github에서 분기된 리포지토리로 푸시하려면 a를 수행합니다 ( git push 참조 ).git push

변경 사항을 검토하거나 병합하도록 요청 #

다른 사람에게 코드를 검토하고 병합을 고려하도록 요청할 준비가 되었으면 다음을 수행하십시오.

  1. 포크된 리포지토리의 URL로 이동합니다. 예를 들어 https://github.com/your-user-name/matplotlib.

  2. 페이지 왼쪽 상단 근처의 '분기 전환' 드롭다운 메뉴를 사용하여 변경 사항이 있는 분기를 선택합니다.

    ../../_images/branch_dropdown.png
  3. '풀 리퀘스트' 버튼을 클릭합니다:

    ../../_images/pull_button.png

    변경 사항 세트의 제목과 수행한 작업에 대한 설명을 입력합니다. 복잡한 변경이나 마음에 들지 않는 일부 코드와 같이 특별히 주의를 기울여야 하는 것이 있으면 말하십시오.

    요청을 병합할 준비가 되지 않았다고 생각되면 풀 요청 메시지에 그렇게 말하세요. 이것은 여전히 ​​예비 코드 검토를 얻는 좋은 방법입니다.

당신이 하고 싶은 다른 일들 #

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

'관리자' 버튼을 클릭하고 다른 사람을 공동 작업자로 저장소에 추가합니다.

../../_images/pull_button.png

이제 모든 사람들이 다음을 수행할 수 있습니다.

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

잘못되면 위에서 설명한대로 다시 복구가 가능합니다 .