チーム開発では、合理的かつ明確な Git 使用プロセスに従うことが非常に重要です。
そうしないと、全員がまとまりのないコミットを大量に送信することになり、プロジェクトの調整と維持がすぐに困難になってしまいます。
以下はThoughtBotのGit利用仕様のプロセスです。私はそこから多くのことを学びましたので、同じように Git を使用することをお勧めします。
ステップ 1: 新しいブランチを作成する
まず第一に、新しい機能を開発するたびに、別のブランチを作成する必要があります (これに関しては、「Git ブランチ管理戦略」を参照できます)。
# 获取主干最新代码 $ 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: コミットをマージする
ブランチの開発が完了すると、多数のコミットが存在する可能性がありますが、トランクにマージするときは、コミットを 1 つだけ (多くても 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はコミットのマージに使用できます。まず、マージする必要があるコミットの前の動詞を squash (または 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 つだけ残ります。 2 行目と 3 行目のコミットは 1 行目のコミットにマージされます。送信情報には、これら 3 つのコミットの送信情報も含まれます。
# 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
3行目の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
実行結果は同じですが、2行目と3行目のコミットが1行目のコミットにマージされます。ただし、新規投稿情報では、コミット情報の3行目がコメントアウトされます。
# 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。