基本的なコマンドを含めて備忘録として残しておく

実際のコード

基本的な流れ

  1. Git 初期化
git init
  1. Git 接続先設定
git remote add {Fork 元リモート名} {Fork 元接続先URL}
git remote add {Fork 先リモート名} {Fork 先接続先URL}
  1. 最新ソース取得
git pull {Fork 元リモート名} {ブランチ名}
  1. トピックブランチ作成
git checkout -b topic/#{issue番号}-作業者名
  1. 開発
  2. ステージングにあげる
git add -A
# untracked files を除いてステージングに挙げる場合は以下
git add -u
  1. コミットする
git commit -m "コメント"
  1. プルリクエストを投げる
git push {Fork 元リモート名} {ブランチ名}

※修正がある場合はgit addから先を繰り返し

その他

ローカルの修正を元に戻す

一部ファイルのみ戻す場合
※半角空白で区切ることで複数ファイル指定可

git checkout {ファイル1(ファイルパス付)} {ファイル2(ファイルパス付)}

全て元に戻す場合

git checkout .

untracked files をまとめて削除(削除対象表示)
※untracked files は変更ではないため以下を行う

git clean -n

# ディレクトリも含める場合
git clean -dn

untracked files をまとめて削除

git clean -f

# ディレクトリも含める場合
git clean -df

直前のコミットのコメントを修正

git commit --amend -m "直前のコミットのコメントを修正"

コミットをまとめる

# 2つ前までのコミットを修正
$ git rebase -i HEAD~~
#=> squash or s に編集
#=> コメントを修正

最新資産へのマージ

$ git pull --rebase origin master

# コンフリクトを修正
# コンフリクトの修正をマージする
$ git add -A
$ git rebase --continue
#=> ※git commitではないので注意

$ git push -f {リモート名} {ブランチ名}
#=> ※強制更新になるため注意

rebase しない場合は以下
例. topic ブランチに master ブランチをマージ

$ git checkout master
$ git fetch {リモート名}
$ git pull {リモート名} master
$ git checkout topic
$ git merge master

# コンフリクトを修正
# コンフリクトの修正をマージする
$ git add -A
$ git push -f {リモート名} topic
#=> ※強制更新になるため注意

git の状態を一つ前に戻す ※ローカルの変更はそのまま

git reset --soft HEAD^

git の状態を一つ前に戻す ※ローカルの変更も戻す

git reset --hard HEAD^

stash の一覧を表示

git stash list

stash 内のファイル一覧を表示

git stash show stash@{N}

stash の差分を表示

git diff HEAD stash@{N}
# or
git stash show -p stash@{N}

stash の差分を表示(ファイル指定)

git diff HEAD stash@{N} -- app/hoge.rb

stash の最新を適用

git stash pop

stash N 番目を適用

git stash pop stash@{N}

stash を全削除

git stash clear

stash の最新を削除

git stash drop

stash N 番目を削除

git stash drop stash@{N}

stash されたファイルの内、指定したファイルを復元

stash list で表示された stash list 番号およびファイル名を指定して取り出す
例. stash list 番号 0 の app/hoge.rb ファイルを復元する

git checkout stash@{0} app/hoge.rb

untracked files を復元させる場合は以下

git checkout stash@{0}^3 app/hoge.rb

untracked files を含めて退避

git stash save -u "untracked files を含めて退避"

Fork 元の任意ブランチを親としてトピックブランチを作成

git checkout -b {new ブランチ名} {Fork 元のリモート名}/{Fork 元のブランチ名}

プルリクエストの取り下げ(プルリクエスト出す直前に取り消し)

git push --delete {Fork 先リモート名} {ブランチ名}
#=> `github` 上の 「Compare & pull request」ボタンが消える

プルリクエストの取り下げ(プルリクエスト出した直後に取り消し)

git push --delete {Fork 先リモート名} {ブランチ名}
#=> `github` 上は「close」扱いになる

リモートブランチの削除

git push --delete {Fork 先リモート名} {ブランチ名}

github 上の プルリクエストブランチをローカルに持ってくる

プルリクエストで push された branch を指定してもってくる

$ git fetch {リモート名}
# 例. ブランチ sample_branch を持ってくる場合
$ git checkout -b {new ブランチ名} origin/sample_branch

もしくは、以下のやり方もある
プルリクエストを行うと github 上では、 pr/{連番}/headpr/{連番}/merge というブランチが作られるためそれを使用する

$ git fetch {リモート名} '+refs/pull/*:refs/remotes/pr/*'
  * [new ref]    refs/pull/9/head -> pull/1/head
  * [new ref]    refs/pull/9/merge -> pull/1/merge
  * [new ref]   refs/pull/10/head -> pull/10/head
  ... (abbrev)

# 例. プルリクエスト 10 を持ってくる場合
$ git checkout -b {new ブランチ名} pull/10/head

プルリクエスト後に追加でコミットされたものを取得する場合は以下を行う
※コンフリクト修正のために force push している可能性があるため --rebase を指定

# 例. ブランチ sample_branch を持ってくる場合
$ git pull origin sample_branch --rebase

master ブランチ以外を削除する

git branch | grep -v master | xargs git branch -D

master および develop ブランチ以外を削除する

git branch | grep -v "master\|develop" | xargs git branch -D

特定のコミットをマージする

  1. git log を実行して merge する対象のコミット番号を控える
    ※★で囲まれた部分
  2. git cherry-pick {1 で控えたコミット番号}

マージコミットを revert する

  1. git log を実行して revert する対象のコミット番号を控える

【以下、例】

commit 2c5f38104b1b1896d82b3eca80b9ce39ce1548cd
  1. git revert -m 1 {1 で控えたコミット番号}
    -m の後ろの数字はどちらを正とするかを表している
    ※main branch を正にする場合は 1
    another_branch を正にする場合は 2 を指定
    【以下、例】
commit 341058af5e0d673e15fe8a14111e7c759191bd9f (origin/revert_commit, revert_sample)
Merge: 5c863c9 9828ee6 ← 5c863c9: 1(revert_sample), 9828ee6: 2(another_branch)
  1. git log -p で差戻の内容が正しいことを確認
  2. git push origin revert_sample

タグ追加

$ git tag -a {タグ名} -m "{コメント}"
$ git tag で確認
$ git show {タグ名} で確認
$ git push origin {タグ名}

Author 修正

$ git commit --amend --author="{ユーザ名}"
$ git rebase --continue
$ git log --pretty=full

すでにプッシュしている場合は -f が必要になる

$ git push origin hoge

Git ブランチ切り替え時の注意点

git checkout コマンドを使用すると移動元のブランチの修正を引き継いで切り替えを行う
上記のため、git status コマンドで差分として上がらず github に上げた際に不要なソースが混じってしまう可能性があるため注意する
対策としては以下のようにチェックアウト元を指定して新規でブランチを作成する

git checkout -b {作成するブランチ名} {チェックアウト元ブランチ名}