開発ワークフロー#
Make your own copy (fork) of Matplotlibに従って、 Matplotlibリポジトリの独自のフォーク コピーを既に持っています。フォークをセットアップしました。Configure gitに従って git を構成しました。これで、実際の作業の準備が整いました。
ワークフローの概要#
以下では、上流の Matplotlibmain
ブランチを「トランク」と呼びます。
main
ブランチを何にも使用しないでください。削除することを検討してください。新しい一連の変更を開始するときは、トランクから変更を取得し、そこから新しい機能ブランチを開始します。
分離可能な一連の変更ごとに新しいブランチを作成します—「1つのタスク、1つのブランチ」( ipython git workflow )。
変更の目的に合わせてブランチに名前を付けます (例:
bugfix-for-issue-14
または )refactor-database-code
。回避できる可能性がある場合は、作業中にトランクやその他のブランチを機能ブランチにマージしないでください。
トランクからマージすることに気付いた場合は、トランクのリベースを検討してください
行き詰まった場合は、 Matplotlib メーリング リストで質問してください。
コードレビューを依頼してください!
この作業方法により、作業を適切に整理し、履歴を読みやすくすることができます。これにより、プロジェクトのメンテナー (あなたかもしれません) が、あなたが何をしたのか、なぜそれをしたのかを簡単に確認できるようになります。
説明については、 Linux git ワークフローとipython git ワークフローを参照してください。
メインブランチを削除することを検討してください#
奇妙に聞こえるかもしれませんが、自分のブランチを削除すると、自分がmain
どのブランチにいるのかという混乱を減らすのに役立ちます。詳細については、githubのメインの削除を参照してください。
トランクのミラーを更新します#
最初に、リポジトリをアップストリーム リポジトリにリンクしていることを確認してください。
時々、上流 (トランク) の変更を 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 の独自のリポジトリにプッシュします。origin
git push origin my-new-feature
--set-upstream
git >= 1.7 では、次のオプションを使用して、リンクが正しく設定されていることを確認でき
ます。
git push --set-upstream origin my-new-feature
これ以降、git はそれがgithub リポジトリ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 のフォークされたリポジトリにプッシュするには、次を実行します( git pushを参照)。
git push
変更のレビューまたはマージを依頼する#
コードのレビューとマージの検討を誰かに依頼する準備が整ったら、次のようにします。
フォークしたレポの URL に移動します
https://github.com/your-user-name/matplotlib
。ページの左上近くにある [Switch Branches] ドロップダウン メニューを使用して、変更を加えたブランチを選択します。
[プル リクエスト] ボタンをクリックします。
一連の変更のタイトルと、行ったことの説明を入力します。複雑な変更や気に入らないコードなど、特に注意したいことがあれば教えてください。
リクエストをマージする準備ができていないと思われる場合は、プル リクエスト メッセージでその旨を伝えてください。これはまだ、予備的なコード レビューを取得するための良い方法です。
あなたがやりたいかもしれないいくつかの他のこと#
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 を介して共有してください。
Make your own copy (fork) of 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
この段階で、trunk を機能ブランチにマージすることを検討しますが、履歴がごちゃごちゃになるため、このページではそうしないように厳しくアドバイスされていることを思い出してください。ほとんどの場合、トランクが少し先を行っていることを心配する必要はありません。ただし、トランクの変更が変更に影響する場合があり、それらを調和させる必要があります。この状況では、リベースを実行することをお勧めします。
rebase は変更 (A、B、C) を受け取り、それらが の現在の状態に行われたかのように再生しますtrunk
。つまり、この場合、A、B、C で表される変更を取得し、それらを G の上で再生します。リベース後、履歴は次のようになります。
A'--B'--C' cool-feature
/
D---E---F---G trunk
詳細については、涙なしのリベースを参照してください。
トランクでリベースするには:
# 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の man ページを参照してください。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
を 1 つに結合します。
私たちは次のようにします:
# 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) 最後の 3 つのコミットを 1 つに折りたたむことを意味します。エディタを保存して終了します。
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
うまくいかなかった場合は、上記で説明したように回復が可能です。