Git初心者が作業する方法

この手の記事無限にあると思うけど、友人のためにまとめときます

おことわり

何か間違ってたら @RyoNkmr_ までお願いします

想定読者

  • 作業環境に git 導入済み
  • git 使って開発したいけど git のコマンドが全然わからん
  • GitHub にアカウントを持っている
  • GitHub に 作業環境の SSH 公開鍵を登録してある

書かないこと

  • 想定読者の環境にする方法
  • Git って何
  • Conflict の解消方法
  • GitHub って何

    • Pull Request の出し方
  • SSH について
  • origin/master をぶっ壊しそうな操作

    • git rebase
  • 初心者が知る優先度が低いこと

    • empty commit とか

1 から Git と GitHub を使った開発の準備

git も GitHub も触ったこと無いって人が独学でやるっていうなら多分これ。既存プロジェクトへの参加ならスキップして次へ

1. (GitHub) リポジトリの作成

GitHub にログイン後、画面右上の「+」をクリック First, press the plus button at right of the global navigation

"New Repository" からリポジトリ作成画面を開く Then select

新規作成するリポジトリの情報を入力する Fill the inputs about your new repository

項目 説明
Repository template わからないなら No template でよい
Owner わからないなら <あなたの名前> でよい
Repository name (必須) 作る予定の物の名前を入れる。半角英数、決まらないなら欄の下に How about xxxxx? と勧めてくれるので、気に入ったらクリックすればその名前が入る
Description わからないなら空欄でよい
Public / Private 全世界に作業内容と作ってるものの中身を公開してもいいなら Public 見せたくないなら Private. 無料プランで Private でも最大 3 人まで 他の GitHub ユーザーを共同作業者として招待できる
Initialize this repository with a README いらない チェックしない
Add .gitignore いらない None
Add a licence 作るもののライセンスを決める。わからないなら None 、好きなやつを選ぶ

2. (GitHub) リモートリポジトリの URL を控える

作成直後の画面上部の URL

Repository created

リポジトリ作成時に Initialize this repository with a README にチェックしてた場合は、画面右緑色ボタン Clone or download より確認できる

Repository with a README

3. (Git) GitHub で作ったリモートリポジトリをローカルに登録する

GitHub から手元の環境に戻って git の作業に入る。


(手元に特に何のソースも文章もない場合)

既に何かある場合は次へ。適当に README.md を下記コマンドで作るか、

echo "# My project" >> README.md

Ruby on Rails なら rails new . なり npm なら npm init してファイルを生成する


多少順番が前後してるけど、前項の画像見ると全部書いてある
それぞれのコマンドが何やってるのか知りたい場合、一旦作業全部覚えてから復習してください。

手順 操作 説明
1 GitHub でリポジトリ作成 -
2 ファイルを作る 変更が無いと push できない
3 git init ローカルの git repository を初期化する
4 git remote add origin リモートリポジトリのURL リモートリポジトリの登録。URL は GitHub 上で確認できる
5 git add . commit 対象の変更を stage する。ここでは作ったファイルが new file として追加される
6 git commit -m "変更についての説明" stage した変更を現在のブランチに積む。-m 忘れると vi や nano 開いちゃうので初心者は注意
7 git push -u origin master ローカルブランチ (初期状態なら master) の commit をリモートのmasterブランチに反映する。commit の積み方が矛盾してると怒られて Push できない。初回は -u つけないと push できない
8 作業する 後で説明します

origin とか -u -m が気になるかもしれないけど、更にわからん概念とか名前が出てきて進まなくなるので、一旦これはそういうものだと覚えるといいです。コマンドとオプションの意味は調べるのは全部終わってからにしましょう。 ちなみに本当は変更がなくても push できるんですけど初心者には必要ないです。忘れていいです。


既存プロジェクトで開発準備

プロジェクトのリポジトリ画面右、緑色ボタン Clone or download よりリモートリポジトリの URL を確認

Repository with a README

手順 操作 説明
1 git clone リモートリポジトリのURL リモートリポジトリをローカルにまるごとコピーする。URL は GitHub 上で確認できる
2 作業する 後で説明します

Git を使った開発作業

前項までで省略した 作業する の中身です。普段の開発作業は基本この流れになるので繰り返して覚えましょう。

手順 操作 説明
1 git checkout master master ブランチに移動する
2 git pull リモートの master 最新状態をローカルの master に引っ張ってくる
3 git checkout -b ブランチ名 (最新の master の頂点を根にして) 新たなブランチを作成しつつ、それに移動する
4 ある程度作業する コミットの大きさはプロジェクトとかの文化や作業者の好みによる。初心者は「その作業に名前がつけられる」まで作業したらコミットすると良い
5 git add . 余計なものいじってなければプロジェクトのルートディレクトリ以下の変更をすべて stage していいはず
6 git commit -m "変更についての説明" stage した変更を現在のブランチに積む。繰り返すけど、-m 忘れると vi や nano 開いて右往左往するので、忘れない要注意。ミスったら操作方法検索するなり聞くなりしてください。
7 4〜6 を繰り返す -
8 git push -u origin HEAD 今いるローカルブランチ の commit をリモートの同名ブランチに反映する。初回は -u つけないと push できない
9 4〜6 を繰り返す -
10 git push 今いるローカルブランチ の commit をリモートの同名ブランチに反映する。

こんなときどうすれば!

git push したら upstream がないって怒られて失敗した

fatal: The current branch readme has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin ブランチ名

書いてあるとおりに打つか、git push -u origin HEAD でいいです。この場合の HEAD は「現在のローカルブランチと同名」という意味です。

わざわざ手打ちするとミスる確率が無駄に上がるので HEAD を使ってください。

ブランチ名間違えた。今いるブランチ名を変更したい。

git branch -m 新ブランチ名

新しいブランチ作るの忘れて、間違えて master に commit してしまった

commit が 1 つだけなら git reset --soft して commit だけ取り消してチェックアウト&そこでコミットすればよい

git reset --soft HEAD~
git checkout -b 新ブランチ名
git commit -m "コミットメッセージ"

あるいはローカルの master を一旦別名に変更する。 upstream が master 向いたままになってるので一旦外す

git branch -m 新ブランチ名
git branch --unset-upstream

A から一旦他のブランチ B に切り替えて作業して、 再びA 戻りたい

git checkout ブランチ名 で既存ブランチに切り替えられます

手順 操作 説明
1 git checkout A A ブランチに移動する
2 作業する ブランチ A 上でやりたいことやる
3 git add . 作業内容全部 stage にいれる
4 git commit -m "Aで作業した内容" 作業内容を commit する
5 git checkout B B ブランチに戻る

やりがちなのは A で作業したはいいけど git commit 忘れて、変更内容を B に持ってきて、そのまま混ぜて作業してしまうケース。commit 積んだあとの修正は面倒なので気をつける。場合によっては歴史改変が必要になって初心者お手上げになる。その場合は周りの強い人に助けてもらうと良い。

git checkout -b ブランチ名 したら fatal: A branch named 'ブランチ名' already exists. って怒られてブランチが作れない

既にローカルに同名ブランチが存在している場合は、新規作成&切り替えオプションである -b が失敗します。

別のブランチ名にするか、あるいは、その既存ブランチが GitHub 上で mastermerge 済みであることが確かならば、リセット(上書き新規作成)&切り替えオプションの -B を使いましょう:

git checkout -B ブランチ名`

master に merge 済みのローカルブランチを一括で消したい

git checkout master && git fetch -p
git branch --merged master | grep -vE '(master|develop)' | awk '{print $2}' | xargs -I % git branch -d %

特定のディレクトリやファイルだけ stage したい

git add ディレクトリやファイルのpath

直前の commit に変更を追加したい

git add 変更があったファイル # カレントディレクトリ以下全てで良かったら git add .
git commit --amend --no-edit

直前の commit に変更を追加してコミットメッセージも変更したい

git add 変更があったファイル # カレントディレクトリ以下全てで良かったら git add .
git commit --amend -m "新しいコミットメッセージ"

直前の commit の commit message を変更したい

git commit --amend -m "新しいコミットメッセージ"

いくつか前に commit した内容を歴史改変したい

初心者が試行錯誤するとその過程で、消しちゃいけないものが消えたり、自分の作業内容ならまだしも同僚の仕事が無になったり、とにかく悪いことになりがちなので強い人に助けを求めましょう。 もしくは、歴史改変用のリポジトリを別に作って練習してみましょう。 git resetgit rebase で検索すると良いです。

GitHub 上で他の人のブランチが リモートの(origin) master に取り込まれたらしく、こちらの作業ブランチが古くなってしまった

outdated branch になって、(GitHub のリポジトリの設定) 次第で作っていた Pull Request の merge が Block されてしまうことがあります。 git pull origin master でローカル作業ブランチに最新 master の差分を取り込むのが初心者にはおすすめです。

# 作業ブランチにいるとして
git pull origin master # origin/master の最新状態の差分を取り込んで、手元の作業ブランチを最新化する
git push # リモートに上げる

git rebase でやる方法もあるんですが、初心者はやめておきましょう。おすすめしません。