Git の基本操作

2020年5月3日

適当に書いたので、違ったらすみません。

git の初期操作

git の開始

  • git init : 新規のフォルダで開始する場合
  • git clone : すでにあるリポジトリからファイルをコピーしてきて開始する場合

git でファイルをリモートリポジトリに入れるまで

  • git add .
  • git commit
  • git push origin master
    • master を origin に push するという意味
    • origin がリモート名
    • master がブランチ名

push

  • git push <リモート名> <ブランチ名>
  • よく使うもの : git push origin master
  • -u を付けると次回から git push だけでよくなる
    • git push -u origin master

ローカルディレクトリでの操作

ファイルを消したい/ファイル名を変えたい

  • git rm <file> :ファイル削除
  • git rm -r <dir> :ディレクトリの削除
  • git mv <old_name> <new_name> :ファイル名の変更

元に戻したい

  • ステージをきれいにしたい(どちらも同じ? stage から消える)
    • git reset HEAD .
    • git restore –stage .
  • stage に戻したい
    • git restore <file>
  • コミットしたものに戻したい(作成したファイルは残っている)
    • git checkout — .
  • 完全に特定の commit に戻したい
    • git log で戻したい commit のハッシュ値を探す
    • git reset –hard <hash>

リモートの操作

追加・削除・名前の変更

  • 追加:git remote add origin https://github.com/<username>/<リポジトリ>
    • origin は慣習的に使われる名称
  • 削除:git remote rm <リモート名>
  • 名前の変更:git rename <old_name> <new_name>
  • 確認
    • git remote
    • git remote -v
    • git remote show <リモート名>
      • git remote origin

fetch ・ merge ・ pull

fetch と merge

  • git fetch <リモート名>
    • git fetch origin
    • remotes/<リモート名>/<ブランチ名> で保存される
  • git merge
    • ワークディレクトリに反映される

手順

  • ワークディレクトリの切り替え
    • git checkout remotes/origin/master
  • ワークディレクトリを元に戻す
    • git checkout master
  • ローカルディレクトリに反映
    • git merge origin/master
    • リモートの master ブランチをローカルのmasterブランチにマージしている

pull

  • git pull <リモート名> <ブランチ名>
  • git pull origin master
    • git pull だけでも良い
    • 以下2つを実行したのと同じ意味
      • git fetch origin/master
      • git merge orign master
  • 現在のブランチにマージするので、ブランチに注意

ブランチ

基本操作

  • ブランチの作成:git branch <ブランチ名>
    • git branch new_branch
  • ブランチ一覧
    • git branch
    • git branch -a
      • ※ リモートも表示する
    • git log –oneline –decorate
  • ブランチの切り替え
    • git checkout <ブランチ名>
  • ブランチを作成して、そのブランチに切り替える
    • git checkout -b <ブランチ名>
  • ブランチ名の変更
    • git branch -m <new_name>
  • ブランチの削除
    • git branch -d <branch_name>
  • ブランチの強制削除
    • git branch -D <branch_name>

変更削除の例

  • git checkout old_banch
  • git brach -m new_branch
  • git checkput master
  • git branch -d new_branch

マージ

基本操作

  • git merge <ブランチ名>
  • git merge <リモート名/ブランチ名>
  • マージには 3 つのパターンがある
    • Fast Forward
      • 早送りになるマージ
      • 枝分かれしなかったときのマージで、ポインタを進めるだけ
      • マージのコミットファイルは、1つの親コミットへのポインタを持っている
    • Auto Merge
      • 基本的なマージ
      • 新しいコミットファイルが作成される
      • マージのコミットファイルは、2つの親コミットへのポインタを持っている
    • Conflict
      • 競合が起こっており、自動では解決できなかった

コンフリクトの解決

  • ファイルの内容を書き換える
    • <<<<<<<< ======== >>>>>>>> の行を取り除く
  • 手順
    • git checkout master
    • git merge new_branch でコンフリクト発生
    • git status でコンフリクトを確認する
    • コンフリクトが起こっているファイルを編集(最終形にする)
    • git add <filename>
    • git commit

GitHub

手順

  • master ブランチを最新に更新
    • git checkout master
    • git pull origin master
  • ブランチを作成
    • git checkout -b new_branch
  • ファイルを変更
  • コミット
    • git add .
    • git commit -m “commit message を書く"
  • プッシュ
    • git push origin new_branch
  • プルリクエストを送る
    • ブラウザからプルリクエストを作成する
      • base: master
      • compare: new_banch
    • レビューを依頼
  • コードをレビュー
  • プルリクエストをマージ
    • 確認が終わったら merge ボタンを押す
    • squash and merge だと途中のコミットをまとめることができる
    • ブランチの削除
      • ブラウザのプルリクエストの画面から Delete branch を実行

タグ

タグの表示

  • タグ一覧(アルファベット順に表示される)
    • git tag
    • git tag -l “パターン"
  • 特定タグの詳細表示
    • git show <タグ名>
    • タグを作成した人、日時、注釈、コミット情報などが表示される

タグの作成

  • タグの作成
    • git tag <タグ名>
    • git tag -a <タグ名> -m “メッセージ"
  • タグをリモートリポジトリに反映する
    • git push <リモート名> <タグ名>
    • git push origin v1.0.0
  • タグを一斉にリモートリポジトリに反映する
    • git push –tags

stash

  • 作業の一時避難
    • git stash
  • stash の確認
    • git stash list
  • stash の復元
    • git stash apply
      • ※ stage が復元されない
    • git stash apply –index
      • ※ stage も復元する
    • git stash apply <stash名>
      • 特定のshash の復元
  • stash の削除
    • 最新のstash を削除
      • git stash drop
    • 特定の stash の削除
      • git stash drop <stash 名>
    • stash 全部を削除
      • git stash clear

リベース

※ git push したものは、履歴が壊れるのでリベースしてはならない。間違えてリベースすると push ができなくなるため、手作業でリモートとローカルのコミット状態をそろえる必要がある。実質やり直し。

マージとの違いは、履歴が直線になるため履歴がすっきりする。ただし、マージの方がコンフリクトの解消が楽である(コンフリクトは1回しか発生しない)。

リベースでコンフリクトが発生すると、各コミット毎にコンフリクトを解消する必要がある。

push していない状態でローカルを最新化するときはリベースが良い?間違えると危なそうだから使わない?

手順

  • new_branch をmaster に取り込む
    • git checkout new_branch
    • git rebase master
  • master をリベースしたところまで進める
    • git checkout master
    • git merge new_branch
  • push して new_branchを削除する
    • git push origin master
    • git branch -d new_branch

リベースで履歴を書き換える

※ push した場合は、これはやったらダメ。

  • git rebase -i HEAD~5
    • -i は –interactive の略。対話リベースでモード
    • ~ は HEADをいくつ遡るか指定する
  • エディタ上で pick を edit に書き換える
    • pick だとそのまま commit を適用していく
    • ここでコメントを編集しない
  • git commit –amend
    • ここでコメントを編集する
  • git rebase –continue

リベースで色々やる

  • コミットの削除
    • git rebase -i HEAD~3
    • エディタ上でコミットの行を消す
    • git rebase –continue
  • コミットの順番を変更する
    • git rebase -i HEAD~3
    • エディタ上でコミットの行を入れ替える
    • git rebase –continue
  • コミットをまとめる
    • git rebase -i HEAD~3
    • エディタ上 pick を squash に書き換える
    • git rebase –continue
  • コミットを分割する
    • git rebase -i HEAD~3
    • エディタ上 で、分割したいコミットの pick を edit に書き換える
    • git reset HEAD^
      • edit まで戻し、stage していない状態にする
    • file1 を修正
    • git add file1
    • git commit -m “modify file1"
    • file2 を修正
    • git add file2
    • git commit -m “modifyfile2"
    • git rebase –continue

その他

ローカルブランチをきれいにしてやり直す

  • git branch -D master
  • git fetch
  • git branch master origin/master
  • git merge origin/master

ローカルブランチに反映し、不要になったブランチを削除

  • git checkout master
  • git pull origin master
  • git branch -d pull_request_branch

開発

Posted by ikubo