Gitコマンドについて調べる【git push】

git push

git pushは、ローカルリポジトリにcommitした履歴をリモートリポジトリにアップロードするものです。ここでやっと自分のコードの修正がローカルからリモートにいくので、他の開発者から自分の変更が見えるようになります。

$ git push [リモートリポジトリ] [ローカルのブランチ名]:[リモートのブランチ名]

例)

$ git push ssh://git@github.com/kimromi/example.git master:master

上のコマンドは、ssh://git@github.com/kimromi/example.gitに接続し、ローカルのmasterブランチをリモートのmasterブランチにpushするというものです。ただ通常はgit cloneした時に「origin」という名前でリモートリポジトリが設定されているので、「origin」を指定できます。リモートリポジトリ名を確認するにはgit remote -vで確認することができます。

# リモートリポジトリにoriginを指定
$ git push origin master:master

# リモートリポジトリに何が設定されているか確認
$ git remote -v

また、ローカルのブランチ名とリモートのブランチ名が同じときは省略して指定することができます。この形をよく使うと思います。

# master:master と同じ名前なのでmasterと省略できる
$ git push origin master

originmasterも省略できる

$ git push

でプッシュすることもできます。ただ挙動についてはpush.defaultの設定によって変わるので注意が必要です。push.defaultの設定については以下のエントリがわかりやすかったです。

qiita.com

私はsimpleに設定しています。

$ git config --global push.default simple

オプション

-f--force

リモートリポジトリの状態を強制的に現在のローカルリポジトリの状態に合わせます。

$ git push -f origin master

もしもローカルが古い状態であった場合や、チームで開発している場合などは使用を避けたほうが良いです。コミットが消えてしまったり他の開発者の履歴も消してしまう場合があります。

-u--set-upstream

-uをつけてpushすると、push先のブランチをTracking Branch(Upstream Branch)として登録するよう設定されます。Tracking Branchは日本語では追跡ブランチと言われ、現在のローカルブランチがどのリモートプランチを追跡しているか(ちょっと違うけど)の設定を持っています。これを設定されているとデフォルトでpushやpullの対象になります。

$ git push -u origin master

追跡ブランチの説明は以下のエントリーがわかりやすかったです。

snowlong.hatenablog.com

Gitコマンドについて調べる【git commit】

git commit

git addにてステージング領域に追加されたファイルをローカルリポジトリにコミットするコマンドです。

$ git commit

git commitコマンドを実行すると、テキストエディタが表示されます。表示されたテキストエディタにはコミットメッセージを入力します。

  • 1行目 : コミットの全体的な説明
  • 2行目 : 空白行
  • 3行目以降 : コミットの詳細な説明

コミットメッセージの入力は必須なので、何も入力しないまま終了するとcommitはされません。2行目、3行目以降の入力は任意であるため、1行目の全体的な説明のみの入力でもOKです。

オプション

-m--message

テキストエディタを起動せず、コマンドで1行のコミットメッセージを入力してcommitすることができます。これはよく使用すると思います。

$ git commit -m '[コミットメッセージ]'
$ git commit --message '[コミットメッセージ]'

-a--all

-aをつけると、git addせずステージング領域に追加していないファイルをaddして、commitします。要するにaddしなくても-aをつけてcommitすれば自動でaddしてくれるものです。ただ、新規追加されgitの管理内になっていないものはaddされません。(git add -uと同じ)

$ git commit -a

-mと組み合わせるとgit add -ugit commitが1行のコマンドできて便利です。

# 変更したファイルをaddしてcommitする
$ git commit -a -m '[コミットメッセージ]'

--allow-empty

ファイルを何も変更せずaddしていない状態でもcommitのみ実行することができます。

$ git commit --allow-empty

何が便利かというと、これから何か機能を追加したり修正したりする際に仕様が曖昧なときなどに、とりあえず先にPullRequestを作ってそこで仕様について議論したりしながら開発を進めるということができます。

--amend

amendは「修正する、改める」という意味です。--amendをつけてcommitすると直前のコミットをやり直すことができます。

# 直前のコミットにREADMEの修正も含めたかったが忘れてしまっていた
$ vi README.md         # README.mdを修正
$ git add README.md    # README.mdをadd
$ git commit --amend   # --amendをつけてcommitすることで直前のコミットに含めることができる

Gitコマンドについて調べる【git add】

git add

ステージング領域に追加し、コミット対象にするコマンドです。

ファイル指定

$ git add [ファイルパス]

ファイルをスペース区切りで複数指定することもできます。

$ git add readme1.md readme2.md

ファイル形式指定

ワイルドカードが使用できます。カレントディレクトリ内でワイルドカードに一致するファイルがすべてaddされます。

$ git add *.md

複数指定も可能。

$ git add *.md *.txt 

ディレクトリ指定

ディレクトリ内のすべての変更がaddされます。指定したディレクトリ内の下の階層の変更もすべてaddされます。

$ git add [ディレクトリ名]

こちらも複数指定ができます。

$ git add docs lib

また、.(ドット)を指定するとカレントディレクトリ以下のすべての変更がaddされます。

$ git add .

オプション

-A--all

git管理内のすべての変更がaddされます。カレントディレクトリが先頭のディレクトリでなくてもです。また、新規追加・削除したファイルもすべてaddされます。

$ git add -A
$ git add --all

-u--update

既にgit管理内にあるファイルのみで、変更があった部分のみをaddします。ですので新規追加されたファイルは対象になりません。

$ git add -u
$ git add --update

-f--force

.gitignoreに書かれている管理対象外のファイルも強制的にaddします。オプションの前または後にどのファイルをaddするかの記述が必要です。.gitignoreに書いている意味が無いのであまり使う機会がないような。

$ git add -f -A
$ git add . --force

-p--patch

ファイルすべてをaddするのではなく、ファイル内でaddしたい部分を自分で選択しながらaddすることができます。hunkと言われる変更のかたまりごとにaddするかを訪ねてくるので、yでaddし、nでaddしない事ができます。

$ git add -p -A
$ git add . --patch

-n--dry-run

dry runと言われる、コマンド実行はしますが実際には反映されずどういったことが起こるかを知ることができるようなものがあります。

実際にはaddはされませんが、どのファイルがaddされるか一覧で見ることができます。

$ git add -n -A
$ git add . --dry-run

addを取り消すには?

git resetコマンドを使用します。内容については次回以降。