何者
ITベンチャーでインターンをしている大学生です。
業務中にgitの操作でよく詰まるのでおさらいしてみます
この記事で得られる情報
- 以下についてふわっとわかる
- git branch
- git switch
- git merge
始めに用意
- githubでリポジトリを作成
- 僕は名前をgit_testにしました
- https://github.com/kajiyai/git_test
- ローカルでgit clone
- 何かのファイルを作ってadd, commit
- 僕は1.txtファイルに”はじめてかいてみた”と書きました
- git push
- user nameとpasswordが求められる
- passwordはプロフィールのsettings>developer toolからpersonal access keyを作成し、入力すると通る
現状
リモート、ローカル共に以下
ブランチ
- master
コミット
- 1.txt
git logの読み方
コミット <ハッシュ値>(HEAD - > ローカルブランチ, リモートブランチ )
コミット作成者: メールアドレス
コミット作成時点
HEAD - > は現在自分がいるコミットを指すポインタです
詳しくは以下の記事で紹介されています。
https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa
ケース1: えらいおじさんがリモートでブランチをはやす
はじめに
リモートでgreatman1ブランチをmasterブランチからはやすえらいおじさんがいます。
えらいおじさんに、「このブランチからさらにブランチを切って作業しろ!ブランチ名は分かりやすいように!」と言われました。
作業内容は、”2.txt”ファイルを作成し、「にかいめかいてみた」と書くこと、とメールで言われました。
大まかな流れは、以下のようになります。
- えらいおじさん < masterブランチからgreatman1ブランチをはやす
- 僕 < greatman1ブランチをローカルに持ってくる
- 僕 < greatman1ブランチからtext2ブランチを新しく作成する
- 僕 < 「2回目かいてみた」という内容の“2.txt”ファイルを作成する
- 僕 < text2ブランチをpushする
- 僕 < プルリクエストを立てる
- えらいおじさん < チェックして文句を言う
- 僕 < 修正する
- えらいおじさん < マージする
ステップ1:えらいおじさんがmasterブランチからgreatman1ブランチをはやす
この時点でローカルでgit log してみた
ステップ2:ローカルにgreatman1ブランチを持ってくる
ここで僕はローカルでgreatman1(リモートと同じ名前の)を切り、そのブランチでリモートの内容をpullする、という事をやってしまいました。gitは、リモートとローカルで完全に履歴が等しくないとpushするときにエラーを出します。履歴が等しいかをどのように判別するかというと、コミットのハッシュ値で判断します(おそらく)。ですので、リモートのブランチをそのままローカルに持ってきたいところです。そこで次のコマンドを打ちます
# ローカルにリモートの状態を反映させます
$ git fetch
さて、いよいよリモートのgreatman1ブランチをローカルに作ります
参考(https://qiita.com/bitarx/items/ad47c9b91ae9c8272b3f)
(* checkoutコマンドはswitchコマンドとrestoreコマンドに機能分けされたので、なるべくswitchコマンドを使用するようにしています。)
# リモート
git switch -c greatman1
ステップ3:greatman1ブランチからtext2ブランチを新しく作成する
どうやらgitでは、ブランチを作成するタイミングでどこのブランチにいるか、という事が重要らしいのです。ですので、git branch コマンドで今どこにいるのか確認してからブランチを作成します。
# 今いるブランチを確認
git branch
# text2ブランチを新たに作成
git switch -c text2
ステップ4:テキストファイルの作成
# エディタ(vscodeなど)で2.txtファイルを作成し、保存する
# 一応、今いるブランチを確認
git branch
# text2ブランチにいることを確認し、add,commit
git add 2.txt
git commit -m "にかいめかいてみまし
ステップ5:テキストファイルのpush
ステップ4で2.txtファイルを作成し、コミットを作成しました。このコミットをリモートにpushしていきたいと思います。今作業中のブランチはtext2です。このブランチはリモートには存在しませんが、作成したいリモートのブランチ名を指定することでpushするときに作成されます。現在作業中のブランチ名を流用するのが一般的かと思います。
# git push origin <リモートブランチ名>
git push origin text2
githubのページに行くと、上の画像のようにpushされたぞ、という表示が出ています。
これまでリモートになかったtext2ブランチも作られています。
ステップ6:プルリクエストを立てる
プルリクエストは、pullをrequestすることです。自分が書いたコードの正当性をここで主張します。
下の画像(再掲)の緑のボタン(compare &pull request)を押して、修正箇所を書いたりします
下のような画面に映り、タイトルやコメントを残します。
ここでプルリクエストをマージしたいブランチはどこか指定できるので、ここはgreatman1にしておきましょう。プルリクエストとコミットは別の話なので注意しましょう。
ステップ7:えらいおじさんに文句を言われる
えらいおじさんがプルリクエストをみて話しかけてきました。
えらいおじさん < 私は「にかいめかいてみた」と記述して下さいと指示したはずですが、メール確認しました?
僕 < 「2回目かいてみた」と書きました。一生懸命打ちましたが、ダメでしょうか?
えらいおじさん <ふむ、 漢字で書いてあるじゃないか、「2回目」を「にかいめ」に修正しなさい。
僕 < はい(白目)
アカウント一つでえらいおじさん役が出来なかったです。
重大な注**私はいかなるご指摘、コメントも文句だとは思っていません。これは例え話です
ステップ8:修正する
えらいおじさんに言われたとおりに修正します。
# ブランチの確認
git branch
# vscodeで2.txtファイルの修正
git add 2.txt
git commit -m "えらいおじさんのいうとおりにしました"
git push origin text2
ステップ9:えらいおじさんがマージする
えらいおじさんは僕の修正を見て満足そうにうなずき、マージしてくれました。
おまけ
gitのoriginってなんだっけ?
gitがリモートリポジトリにデフォルトでつける名前の事
参考: https://reasonable-code.com/git-origin/
gitでpushするたびにpasswordを聞かれるのが面倒
.envにaccess token コピペすることで対策しました。
リモートのブランチを削除したいとき
この記事を作成する時には使用しました。
通常の開発でも、リリースした機能のリモートブランチを削除するのではないかと思います。