🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

最低限の知識でGitの運用をする

仕事で前向きに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/contrib/completion at master · git/git · GitHub

※使ってる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