仕事で前向きにGit運用していくことになりました。
あくまでGitを使いこなす!とかではなく、最低限の運用ができるようになることを目標として。
CUIすらちんぷんかんぷんの素人に、Gitコマンド叩けっていうのは乱暴すぎると思うの・・。
というわけでそんな中、一通りこれだけ覚えてればどうにかなるやね、っていうコマンドのメモ。
こういう時どうすれば?みたいなのも、遭遇した限りメモ。
前提
特定の単一branchでの作業を想定。
branchの切り替えを含めた運用や他のbranchによって伸びたmasterの取り込みとかは無視。
そういう難しそうなところは、最低限の範囲外として見てます。
基本の流れ
- git status
- git add
- git commit
- git pull --rebase
- git push
正確なコマンドは後述するけど、流れとしてはたったコレだけ。
status
git status
何回叩いても何も起こらない初心者にも優しいコマンド。
管理下のファイルの状況を知らせてくれます。
割と頻繁に叩いて、commitする単位をこまめに把握したいところ。
add
修正したファイルを、Git管理するためにステージングするコマンド。
# ファイル単品 git add hoge.html # ディレクトリごと git add example # ディレクトリごと(しかも複数) git add example sample test # 拡張子で git add *.html # 修正されたファイル全部 git add -A
ここで注意すべきは、自分が修正した覚えのないファイル。
よってディレクトリごとやファイルごと、きっちりstatusをチェックしながらaddすべし。
commit
ステージングしたならば、それらを記録!commmit!
# 普通のパターン(叩くとエディタが起動) git commit # エディタを起動せず、1行で済ませたいならこっち git commit -m 'Commit message.' # addしなくても、修正したファイル全部commitしたいならコレ git commit -a
何を修正したかの差分をオマケで見れるvオプション付きが個人的に好きです。
pull rebase
ここがちょっとややこしいかも。
自分の環境:リポジトリで変更した内容を、他の環境でも取り込めるよう一旦送りたい。
そのためには、今このタイミングで、自分の環境とpush先の環境は同じ状態である方がすっきりするよね。
---自 分--- □□■ ← いま変更したやつ □□□ ← なんだかpush先のがちょっと更新されてるぽい ---push先---
じゃあまず、push先の変更を取り込もう!
# push先の変更点をまずは取り込む git pull --rebase origin hoge
hogeは作業してるbranch名で。
そうすると、
---自 分--- □□☆■ ← いま変更したやつをpushする前に ↑ pulして同期 □□☆ ---push先---
あとはもう、
---自 分--- □□□■ ← いま変更したやつを ↓ pushしたら □□□■ ← すっきり更新完了! ---push先---
なんかスマート!
push
というわけでpushのコマンド。
# 何事もなかったかのように、hogeブランチにpush git push origin hoge
これだけで最低限の運用はできるんじゃなかろうか。
その他覚えてて得するコマンドたち
pullしたらなんかコンフリクトした
- statusでコンフリクトしたファイル特定
- ファイル修正
- もっかいadd
- rebase続きから
これだからGitとかイヤ!ってなる代名詞のコンフリクトさん。
さくっと直しましょう。
コンフリクトするわけ
- pull = 他の環境での変更を取り込む
- 自分が変更してたやつが、他の環境でも変更されてた
- Gitさんが上手いこと折り合いをつけようとしてくれる(いいひと!
- 互いの変更が被ってなければセーフ、被ってたらコンフリクト
というわけ。
どのファイルがコンフリクトしてるかは、安心コマンドでわかります。
# 困ったらコレ! git status # both modified: test.html # ↑こんな表示のがあるはず
そのファイルを開いて、おかしなところを修正。
そしたら再度addします。
やり方はいつもと一緒。
それが済んだら、
# やりかけのrebaseをこんてにゅー git rebase --continue
あとは上記の手順と同じでpushできるはずです。
pull --rebaseしようとしたらおこられた
複数人で作業してる場合、よくあります。
pull --rebaseするためには、自分の環境がクリーン(全部commitされてるなど)である必要があります。
- 一旦commit
- だれかがファイル修正しちゃった
- commitされてないファイルあるからpull --rebaseできません! ← (´;ω;`)
そんな時はすみやかにaddからの再commitしてやりましょう。
従来通り普通にcommitしても良いですが、直前のcommitに含める方が良い気がしますよね。
その場合のコマンドがコレ。
# いまaddした漏れファイルをさっきのcommitに含める git commit --amend
普通にpullする
pushするためにはpull --rebaseで綺麗にしてからというのが理想です。
ただちょっとした変更をサクッと取り込みたい場合、いちいちcommitするのはなぁ・・ってなります。
# 普通に変更点を取り込み git pull origin hoge
まぁ別にこれが悪いことではないので、臨機応変にいきたいところ。
コンフリクトしたファイルがあるようなら、次にcommitする時までに修正するだけです。
緊急回避コマンド
ちょっと緊急でpushして欲しいやつがある!って言われた場合にどうするか。
- 急いでadd/commit/pull/push もしくは、
- 緊急回避してpush
そんなコマンドがありますのよ。
# いまの状態を一旦脇に避けて、何事もなかったかのように git stash save
そしたらpushしてあげて、
# さっきまでの状態に戻す git stash pop
何事もなかったかのように作業再開です。
変更したくないファイルを変更して保存してもーた
# 最後にcommitした時には戻れる git checkout HEAD test.html # ディレクトリごと戻す git checkout HEAD example
なんか間違えたファイルをadd/commitしてもーた
# addし間違えたのを取り消したい(addと同じように指定 # git rm --cached test.html しちゃうとファイルは残るがGit管理下から外れるので git reset HEAD test.html # commitをなかったことにしたい(ファイルは編集されたまま git reset --soft HEAD^ # commitをなかったことにしたい(ファイルも元に戻す git reset --hard HEAD^
おまけ
CUIでコマンドを叩くにあたっての便利機能、入力補完をGitでも。
※使ってるGitのバージョンと、↑のバージョンは合わせないとエラーになる場合があります。
bashならgit-completion.bashです。
こいつだけでダメな場合は、git-prompt.shも読み込んでください。
そしたらば入力補完ができるようになる上に、bashの環境変数PS1で、(__git_ps1)が使えるようになります!
ようは、
# git-completion.bashをsource # git-promptをsource # すると、プロンプトにブランチ名の表示が出るように! PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
とりあえずはここまで。
意外に長くなったけど良いメモになった気がするw