Git コマンド逆引き集(随時更新)

2021年1月16日

Git を使っていて、「あの操作をするのにどうするんだっけ?」ということが増えてきたので、備忘録代わりにまとめていきます。基本的には IDE を使って Git を操作することが多いので、IDE のメニューから操作できるものについては触れません。また、私自身が使うのに必要なものだけをまとめるので網羅性に欠けるかもしれませんが、ご容赦を。

既存のディレクトリを Git で管理してリモートリポジトリと紐づける

cd /path/to/project
git init
git remote add origin https://github.com/example/test.git
git add *
git commit -m 'First Commit'
git push -u origin master

リモートリポジトリと紐づけるコマンドは、3行目の git remote add コマンドになります。git push-u オプションは、git push のデフォルトの送信先を指定するもので、git remote add で origin と名付けたリモートリポジトリの master ブランチをデフォルトの送信先に指定しています。これによって、以後は git push のみでプッシュできるようになります。

ディレクトリ名を指定して git clone する

git clone https://github.com/example/test.git git_test

git clone は、デフォルトでリモートリポジトリ名でディレクトリを作成しますが、複数のプロジェクトを扱っていると、名前が競合してしまうことがあります。そのような場合は、git clone の第二引数にディレクトリ名を指定することで任意のディレクトリ名で clone してくることができます。

リモートリポジトリを変更する

git remote set-url origin https://github.com/example/test.git

コミット履歴などを引き継ぐ必要がなければ上記のみで OK で、この後に git push すれば、新しいリモートリポジトリに転送することができます。

リモートリポジトリを移行する

git clone --mirror {old_url} tmp
cd tmp
git push --mirror {new_url}

コミット履歴やタグなどを引き継いで移行する場合は上記の方法となります。移行後は移行時に作成した tmp ディレクトリは削除して構いません。その後改めて git clone {new_url} すればよいと思います。

強制的に pull する

git fetch
git reset --hard origin/{branch_name}

git push には強制的にローカルの内容で push する --force オプションがありますが、git pull には、ローカルの変更を無視して強制的にリモートの内容で pull するオプションはありません。そこで git fetch で最新のリモートリポジトリの状態を取得し、ローカルリポジトリを指定したブランチの状態に強制的に戻す git reset --hard を使います。

git commit 時に記録される名前やメールアドレスを変更する

git config --global user.email example@example.com
git config --global user.name "YAMADA Taro"

上記のコマンドで変更されるのは、ログインしているユーザーが git を操作したときのデフォルト値で、~/.gitconfig が更新されます。上記の例のように、スペースが含まれる場合には、ダブルクォーテーションで値を囲みます。

リポジトリごとに設定を変更したい場合は、そのリポジトリのディレクトリに移動して

git config --local user.email example@example.com
git config --local user.name "YAMADA Taro"

とします(--local は省略可)。この場合は、{repository_dir}/.git/config が更新されます。リポジトリのディレクトリでない場所で実行すると、fatal: not in a git directory のエラーとなります。

ファイルを Git の管理から外すが、ファイルは残したい

git rm --cached test.txt

git rm--cached オプションを付けることで、Git の管理から外しつつ、ローカルのファイルを残すことができます。ただ、この状態で push してしまうと、他のユーザーの test.txt は消えてしまうので、注意が必要です。
他のユーザーも test.txt を引き続き利用したい(ただし、Git では管理したくない)という場合には、.gitignore に test.txt を追記して push したうえで、いったん test.txt をディレクトリの外に退避させて pull した後に元に戻すという微妙な手順を踏むことになります。

「ファイルの変更を Git で管理したいけど、ローカルファイルは変更されたくない」という場合には

git update-index --skip-worktree test.txt

で追跡から外すことができます。仮にリモートリポジトリのファイルが変更された後に pull してもローカルのファイルは上書きされません。元に戻したいときは

git update-index --no-skip-worktree test.txt

を実行します。

コミットをなかったことにする

直前の commit だけを取り消す(add はそのまま)

git reset --soft HEAD^

単に取り消すだけでなく、commit しなおすのであれば

git commit --amend

でも可。

add も取り消す(変更されたファイルはそのまま)

git reset --mix HEAD^

git reset のデフォルトオプションは --mix なので

git reset HEAD^

でも同じ結果になります。

直前の commit の状態にファイルも戻す

git reset --hard HEAD^

git コマンドのヘルプを確認する

git push -h
git help commit

git コマンドのオプションや引数を確認したいときは -h を付けます。さらに詳細なヘルプを確認したいときは、git help コマンドを使います。

この記事を書いた人

グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。詳しい業務内容はこちら。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。