% cat

Gitの忘れがちだけど絶対に使うであろうコマンド達

ベーシックでは、Gitを使ったバージョン管理システムを導入しています。一部のプロジェクトでは先行して導入していたものの、全社的にはまだまだ…といったわけで、よくGitコマンドについて質問されるので、ここで軽くまとめておきたいと思います。

普段は git add / commit / push / pull しかしてない…っていう人向けです。

addしたファイルを取り消す

$git reset HEAD ファイル名

更新内容自体は取り消さず、addしてインデックスに登録するのを取り消します。

更新したファイルの更新内容を取り消す

$git checkout ファイル名

commitする前限定です。

他ブランチの特定のコミットだけマージしたい

$git cherry-pick コミットID

とても便利なコマンドですが、cherry-pickを多用するような運用スタイルになっていたら問題なので、ブランチの切り方などを見なおしたほうが良いでしょう。

コミットしたけど失敗した!コミットをやり直したい。

$git commit --amend

その他:ファイルをaddし忘れた・コミットメッセージをミスったなど。ただし、リモートリポジトリへpushする前に限る。

コミットを取り消して、指定の位置まで戻りたい

$git reset コミットID

指定したコミットIDのコミットを取り消すのではなく、そこまで戻るという意味。ただし、リモートリポジトリへpushする前に限る。

全てをなかったコトにして戻りたい

$git reset --hard コミットID

指定したコミットまで、全ての更新をなかったコトにします。ただし、リモートリポジトリへpushする前に限る。

コミットをハードリセットしてしまった…死にたい

上記 git reset --hard でコミットを闇に葬ってしまってから、しまった!となったオッチョコチョイなエンジニアのためにもgitは配慮してくれています。すべての行動は記録されているのです。

$git reflog
7a4b4b6 HEAD@{0}: reset: moving to 7a4b4b6e31a6f4c908ee41dfc29bd132b53bcf68
f6f79b0 HEAD@{1}: commit: aaa
$git reset --hard HEAD@{1}

reflogで行動履歴が出るので、戻りたい所を指定します。

意気揚々とマージしようとしたら、コンフリクト嵐、いったんマージをなかったコトにしたい

よっしゃ他のブランチとマージしたるぜ!とmergeなりrebaseなりしたら、コンフリクトの嵐…。いったん見なかったことにして元に戻したい。そんな時あると思います。

$git reset --hard ORIG_HEAD

まぁ、どっかで綺麗にマージしなきゃいけないんですけどね。

リモートブランチからmaster以外のブランチをローカルに新しくもってきたい

リモートリポジトリ上で master / develop / hoge.. など色々なブランチで運用している場合、新規で入ってきたエンジニアはcloneしてくるだけでは、通常masterしか存在してないのです。そこで、開発用developブランチに切り替えたいという時は、こんな感じで。

$git fetch
$git branch -a
* master
  remotes/origin/develop
  remotes/origin/master
$git checkout -b develop origin/develop

origin/develop(リモートブランチ)をdevelop(ローカルブランチ)として作って、ついでにチェックアウトするよって意味です。

リモートブランチを追加する

リモートブランチを後からadd(追加)/ rm(削除)するのは簡単。

$git remote add origin git@example.com:git_test
$git remote -v

pushしようとしたら、リモートリポジトリが先行していて怒られた

$git push
To git@exmaple.com:git_test
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@exmaple.com:git_test'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

チーム開発しているとよくある光景ですね。俺の更新ファイルがアップできん!みたいなの。こんな時は2つの回避方法があります。一つは、pushする前にpullする。お手軽です。よほどのコンフリクトがなければ、自動マージしてくれます。ただし、マージコミットが発生して後から見返すと、マージコミットだらけて分かりにくくなります。

$git pull --rebase
$git push

まぁ、安易にpullする前に、fetchしてどんな更新が先行しているのか確認するのがベストです。

最新記事

BananaCI というツールを運用しています

こんにちは。[@endotakuya](https://github.com/endotakuya) です。 突然ですが皆さんは CI/CD 、してますか? オンプレミス型の Jenkins や Drone 、クラウド型の Cir...

endotakuya
2018年12月06日

シグナルと kill コマンドについてちゃんと調べてみた

開発中にプログラムが固まった時に `kill プロセスID` って打ったことがある方は多いかと思います 僕もそうで、 kill コマンドはプロセスを強制終了するためのコマンドだと思っていました ですが puma のログ...

tkhr0
2018年12月06日

Rails における弊社の CSS 設計

Hi. [rigani_c](https://twitter.com/rigani_c) です。 本記事では Rails における弊社 CSS チームの CSS 設計を、私の思想と併せて話します。 Sprockets を使うケ...

rigani
2018年12月02日