チーム開発未経験者のgitの使い方

はじめに

私は2023年にエンジニアとして採用をしていただいて、現場に配属された それまでチーム開発はおろかまともにgitも使っていなかったので、「○○してください」と言われたときに「git ○○」と検索をしていた。

配属されたときによく見た「初心者のためのgitの使い方」などには求めている内容が見つからなかったので、一年目に覚えておくと困らないコマンドについて紹介する

超初級編

ここは他の記事にもあるので、あえて簡潔に書く

  • ワークツリー (Working Directory):プロジェクトの作業ディレクトリで、実際にファイルを変更・編集する場所
  • ステージングエリア (Staging Area) / インデックス (Index):コミットする変更を準備する場所。ステージングエリアに追加されたファイルは、次のコミットに含まれます。
  • リポジトリ (Repository):ローカルリポジトリとリモートリポジトリの2つがある

  • 以下の画像の中が自分の頭の中にスッと入ってきたので、添付しておく

  • 変更した内容を確認

    • ワークツリーで変更された内容を確認するには、git status コマンドを使用する
    • またそこで変更があったファイルをgit diffコマンドで確認する
  • 変更した結果をステージングにあげる

    • git add <file name>で編集しただファイルをgit commitに追加
    • git addでは編集したファイルをステージングに追加
  • 変更した結果をリモートリポジトリにあげる

    • git commitでaddしたファイルをコミット化する
  • 個人的によく使うコマンドの流れ

git status                     //変更したファイルを確認
git diff                         //変更した実装の差分を確認(typoないことなど確認)
git add .                      //「.」で変更したすべてのファイルをステージングにあげる
git commit -m "xxx"       //コミット名をつける
git log                        //コミットした内容を確認できる
git push                     // リモートリポジトリにアップする

こう言われたらこのコマンド

「mainブランチからブランチ切って作業してください」

  • 並列で作業するために、ブランチというものが存在します。
  • 基本的には、機能ごとやissueごとだと思いますが、そのあたりはチームのルールを参照してください
  • git branch
    • 自分が今いるブランチがわかるコマンド
    • 以下は、mainブランチにいることを示します
$ git branch
* main
  issue1
  • git checkout xxxxx:ブランチを切る
    • ブランチを切るにはcheckoutを使います
    • 上の例では、既に存在するブランチに対して、ブランチの変更のために使うコマンドです
  • git checkout -b new_branch:ブランチを作成する
    • ブランチは誰かが作成しなければいけません
    • そのため、新しいブランチを作成する場合、使用するコマンドです

「ローカルのブランチ多いですね、pushしたブランチがmergeされたら削除していいですよ」

  • おそらくあなたのブランチはこうなっているはずです。
$git branch
>main
*test
develop_1
develop_2
develop_3
develop_4
develop_5
develop_6
develop_7
  • git branch -D develop_1:任意のブランチを削除したい

    • -Dオプションで削除することが可能です
    • 削除するブランチにいると削除できないので、他のブランチに移動しておく
  • ブランチ関連では、checkoutを使用する時とbranchを使用する時があり少し苦労しました

「20commit遅れてます。rebaseしてください」

  • 開発スピードが遅いとブランチを切った時点からmergeしたい時に、他の人が大量のコミットを追加していることがあります。
  • git rebase <コミットハッシュ>:これでベースにしたいコミットを変更することができます。
  • rebaseは、ベース(もとになるコミット)をつけかえるものです

「あ、コンフリクトしてます!」

  • コンフリクト直せればgitわかるマン(自称)ぐらいになれそうです。
  • git rebaseすると、ターミナルのメッセージにconflictという文字が出てきて、失敗するはずです
  • 以下のコマンドで修正できます
  • git rebase --continue:これでコンフリクト作業を直すというモードになります
  • git rebase --abort:これでミスった時にもとに戻れます、逃げられます!

  • コンフリクトが起きるとどちらが正しいのかをこちらで判断しなければなりません

  • しっかり見極めて修正しましょう
<<<<<<<<<<HEAD^
red
==========
>>>>>>>>>>388d0g09d08d
blue
  • よくやる流れ
$git rebase -i <コミットハッシュ>
$git rebase --continue
$git grep "<<<<<"    //コンフリクトする場所を探す
//直す
$git grep "<<<<<"   //直ったか確認する

私「これ不要になった、だるい、消したい」

  • 変更した点を削除したい
$git status
>test1.md
>test2.md
>test3.md
...
  • 私はgit resetをよく使います
  • 例)test1.mdだけ消す
$git add test1.md
$git commit -m "削除"  // git logすると削除が一番上にくる

$git reset --hard HEAD^
  • git reset --hard HEAD^
    • HEAD^にある変更点もすべて削除する
    • 上記の例だとtest1.mdが変更されてないことになる

私「この追加を最新のコミットにまとめたいな」

  • git reset --soft HEAD^
    • HEAD^にあるコミットのファイルをステージングにおろす
    • git addしたときと同じ状態
    • 個人的には、最新のコミットと追加しようとするファイルを同じコミットにまとめたいときに使う
$ git add test2.rb
$git commit -m "最新のコミット"

//test2.rbを変更した「最新のコミット」とほぼ同じ内容
$git reset --soft HEAD^
$git status  // test2.rbがステージングにある状態
$git add test2.rb
$ git commit -m "一緒にしたコミット"

おまけ

  • git log --oneline:git logだとログが詳細に出てくるので、logの情報を1行で出すコマンド
  • git reset <ファイル名>:ミスってaddしてしまったファイルをステージングから削除する
  • git diff --stat --name-only <コミットID A> <コミットID B>:コミットID AからコミットID Bまでの差分のファイルが標示される
  • git reset --hard origin/xxx:リモートリポジトリのxxxブランチのHEAD^と同じ内容になる
    • git reset --hardはブランチにも使用できる
  • aliasを使用する
    • 私はgit pushgit phgit checkoutgit cogit branchgit bなどにしています