git コマンドを✅
もうちょっと早くプルリクを切って講師の方に相談に乗ってもらえればよかったと後悔している23期スバルです。
gitに関してのお話です。
気づいたらmainブランチで作業していることに気づいた時って絶望ですよね。
こんな感じで複数の変更をしている最中に、あれ、ブランチ切ったっけ、、?と思ってVScodeの左下をみたらmainになってたなんてしょっちゅうあります。
そんな時、今までは、変更箇所を全て元に戻す⇨ブランチ切る⇨作業に入るといった風に対処していました。
どうやら変更箇所を退避させて、新しいブランチを切ってからその変更を戻す事ができるgitコマンドにあるそうです。
もしかしてもっと他にも便利なコマンドがあるのでは?と思ったので、今回はgitコマンドに関して学習していきます。
Gitとは
分散型バージョン管理システム。アプリ作成の軌跡をオンライン上で管理する事ができるので、エンジニアが場所を問わず仕事をする事ができるようになった。
Gitでできること
git にはさまざまなコマンドが用意されていて、例えば下記のようなことをする事ができる。
- 古いバージョンに簡単に戻せる
- 新旧のファイルを一元管理できる
- 編集した履歴を複数人で共有できる
- 複数人で修正した部分を一つに統合できる
git コマンド
status
編集したファイルをコンソール上に表示する。
例えばroutes.rbを編集していた場合、git statusコマンドを打つと
modified: config/routes.rbという表記がコンソールに表示される。
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: config/routes.rb
no changes added to commit (use "git add" and/or "git commit -a")
add
編集した内容をインデックスに追加する。
更新したいファイルを選択する。後述するcommitで編集作業をローカルリポジトリに記録する。
commit
commit コマンドを使うことによって、編集した内容をセーブする事ができる。
もしcommitをしないまま編集をした場合、ctrl + zを大量連打しないといけなくなる。
なんとしても避けたい。
push
commitされたローカルファイルの状態をリモート環境にあるファイルに反映するコマンド。
pull
git fetchの省略形。
取得したブランチヘッドを現在のブランチにマージする事ができる。
プルリクエストを行い、開発ブランチがメインブランチにマージされた時に、メインブランチにチェックアウトしてから行う事が多い。
勢いよく差分が更新されていく様が気持ちいい。
stash
コミットしていない変更がある状態で上記のコマンドを実行すると、変更した部分が退避されます。ワーキングディレクトリ上は差分がない状態になります。「コミットしていない変更」とは、addしたものもaddしていないものもどちらも含まれます。-u は --include-untracked の略です。新規作成ファイル(追跡対象に含まれていないファイル)も退避することができます。
git stash -u を実行すると編集中の内容を一旦別の場所に切り出す事ができる。
$ git stash -u
Saved working directory and index state WIP on main: a25e5b3 Merge pull request #66 from subaru-hello/pullrequest_for_create_alcohol_logic
Subarunookpuro3:Preliquo subaru$ git stash list
stash@{0}: WIP on main: a25e5b3 Merge pull request #66 from subaru-hello/pullrequest_for_create_alcohol_logic
新しくcreate_relationships_seedブランチを作成し、退避させた変更を元に戻してみます。
git checkout -b create_relationships_seed
Switched to a new branch 'create_relationships_seed'
Subarunookpuro3:Preliquo subaru$ git stash apply stash@{0}
Removing db/migrate/20211124222100_change_column_of_analyze.rb
Removing db/migrate/20211124214452_remove_shutatus_from_analyze.rb
On branch create_relationships_seed
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: app/frontend/pages/AlcoholAll.vue
modified: app/frontend/pages/Result.vue
modified: db/fixtures/04_alcohol.rb
deleted: db/migrate/20211124214452_remove_shutatus_from_analyze.rb
deleted: db/migrate/20211124222100_change_column_of_analyze.rb
modified: public/uploads/user/avatar/1/sample.png
Untracked files:
(use "git add <file>..." to include in what will be committed)
db/fixtures/05_relationship.rb
no changes added to commit (use "git add" and/or "git commit -a")
git checkout -bで新しいブランチを作成し、
git stash apply stash@{0}で先程退避させたブランチを持ってきています。
元に戻す事ができました。
【git stash】コミットはせずに変更を退避したいとき - Qiita
revert
特定のコミットを消す事ができる。
例えばgit showと組み合わせて使う。
git show で出した過去のコミットを無かったことにする事ができる。
$ git show
commit 25152da21c58f5fb2a60cd110ef447e93f2f6f99 (HEAD -> main, origin/main, origin/HEAD, heroku/main)
$ git revert 25152d
rebase
git rebaseはざっくり歴史の元を改変するコマンド。分岐元を変更することができる。
具体的に下図のような歴史があったとして...(a)
(a)
A---B---C sake
/
D---E---F---G master
↑を下記のコマンド(のどちらか)を実施することで
$ git rebase master
$ git rebase master sake
こんな感じ↓に変更する事ができる。...(b)
(b)
A'---B'---C' sake
/
D---E---F---G master
rm
ワークツリーとインデックスからファイルを削除する事ができる。
git rmの主なオプション
--cached インデックスからの削除だけを実行する(ワークツリーのファイルは保持する)
-f コミット前やインデックスに追加する前のファイルであっても削除する
-q 実行時のメッセージを減らす
--ignore-unmatch 対象のファイルが存在しなくても、エラーメッセージを表示しない
-n 実行せずに実行する内容だけを表示する
checkout
ブランチの切り替えを行う事ができる。
よく使うのが -b オプション。
-b の後に新しいブランチ名をつけることでワークツリーを変更させる事ができる。
git checkout -b <新しいブランチ名>
まとめ
- gitとは分散型バージョン管理システム。gitのおかげでオンライン上での仕事がやりやすくなったそう。
心境
明日MVPをリリースするぞ!!!