Git使い方まとめ(随時更新)

Posted by user on Thursday, January 31, 2019

TOC

はじめに

Gitの使い方で検索することが多いため、大まかな流れを記録する。

GitHubを一人で使用する前提として記載するため注意。

GitHubへの接続設定(GitHub初回接続時のみ)

GitHubへのアップロード時のユーザー設定を以下の通り修正する。

git config --global user.name "somuriengineer"
git config --global user.email "somuriengineer@gmail.com"

ローカル資源をGitHubにアップロードする手順

GitHub上で空リポジトリを作成

GitHub上のリポジトリがない場合は

こちらを参考に作成します。

ローカルリポジトリの作成(初期化)

以下コマンドにより「.git」ディレクトリが作成される。同ディレクトリはリポジトリ構成を表す。

以下コマンドで作成したディレクトリをリポジトリ管理するための準備ができた状態になります。

cd {プロジェクトのリポジトリ}
git init

コミット対象資源の整理(ステージングエリアへの配備)

以下コマンドによりローカルリポジトリに資源をコミットします。

git addコマンドにより対象資源が作業ディレクトリからステージングエリアに置かれます。

vi .gitignore # *.logなど、リポジトリ管理対象外の資源を記載する
echo ".DS_Store" >> .gitignore
git add . # 対象資源を制限する場合は 「.」以外で設定

ローカルリポジトリへの配備(コミット)

ステージングエリアに置かれた資源は後述のcommitコマンドによりローカルリポジトリに格納されます。

git commit -m "Initial Commit" # 2回目以降は -a オプションも付けることで、既知のファイル変更を全てコミットする。(-aは--all、-mは--message=の略)
コミットコメントが沢山ある場合は -mオプションを付けないでgit commitのみコマンドを入力します。エディタが開くため、1行目に要約、2行目空行、3行目以降に詳細な内容を記載します。 ## リモートリポジトリへプッシュ 以下コマンドによりoriginという名前でリモートリポジトリ(今回はGitHubのリポジトリ)を追加します。 2行目によりリモートリポジトリが何か確認できます。なお、削除は「git remote rm origin」です。
$ git remote add origin https://github.com/somurieengieer/DownloaderPalettePhotos.git
$ git remote -v
以下コマンドによりリモートリポジトリ(origin)のmasterブランチへプッシュします。-uは –set-upstreamの略。push先のブランチをデフォルトでpushやpullの対象とする。
$ git push -u origin master # ローカルファイル(master)をリモート(origin)にアップロード
上記コマンドを毎回実施するのは面倒であるため、以下コマンドによりmasterブランチを追跡ブランチに設定できます。
$ git push --set-upstream origin master
以降は以下コマンドでpushできます。
$ git push

状況確認やadd/commitの取り消し

commitの取り消し

add 範囲を間違えてcommitしてしまった時は以下何れかのコマンドにて取り消す。(直近のgit commitがなかったことになり、追加修正されていたファイルは全てステージングエリアから除外されます。ファイルは修正後の状態は維持するので再度add、commitします)

$ git reset HEAD^
補足ですが、resetの後に以下オプションがあります。基本的には–softかオプションなしを使います。 * –soft commitだけなかったことにする(ステージングエリアには残す * オプションなし commitとaddをなかったことにする * –hard commitとaddとファイル修正内容をなかったことにする ※commit対象資源の編集した内容が全部消えます また、HEAD^は、「最新の1つ前のコミット位置に戻す」を意味します。(HEADは最新のコミット位置です) ## ステージングエリアから取り除く 間違えてファイルをステージングエリアに置いてしまった場合(add filename)、以下コマンドでステージングエリアから取り除きます。(アンステージング)
$ git reset HEAD filename.txt
※filename.txtをHEAD(最新の状態)に戻し、commitとaddをなかったことにする動きです ## ワーキングディレクトリの追跡対象外ファイルを修正前に戻す ワーキングディレクトリのうち、追跡対象外のファイルの一覧を以下コマンドで確認します。
$ git clean -n
実行は以下コマンドです。(追加したファイルが削除されるため注意)
$ git clean -f
上記はファイルに対しての実行です。ディレクトリに対して同処理を実行する場合は以下コマンドを使用します。
$ git clean -nd
$ git clean -df

commitログ・リポジトリステータスの確認

以下コマンドによりリポジトリの状況を確認します。ローカルリポジトリにコミットし忘れている資源がないかを確認できます。

$ git log
$ git status
git logには以下のようなオプションもあります。
$ git log --since=2018-01-30 --until=2018-10-30  # 範囲指定
$ git log -n3 #直近3件だけ表示
$ git log --graph --decorate --oneline  # コミット履歴を視覚化して表示

commitし忘れたファイルがあった時

コミットする対象資源が漏れていた場合は以下のように対応します。

$ git add forgottenFile1.txt
$ git commit --amend
コミットメッセージが開くので、メッセージを修正すればOKです。 余計なものもcommitしてしまった場合は前述のcommit resetで一旦戻すのが良いです。 ## ステージング済ファイルとリポジトリに管理されているファイルとの差分確認 確認には以下コマンドを使用します。
$ git diff filename.txt

コミットの打ち消し

直近のコミットに対して、履歴は残しておきたいが資源の状態を元に戻したい場合、以下コマンドを使用します。

$ git revert [取り消したいコミットID]

ワーキングディレクトリの修正したファイルを戻す

ワーキングディレクトリで修正したファイルをチェックアウトブランチの最新版にしたい場合は以下コマンドを使用します。

$ git checkout filename.txt

ワーキングディレクトリの削除したファイルを戻す

ワーキングディレクトリで誤ってファイルを削除してしまいもとに戻したい場合は以下コマンドを使用します。

$ git reset HEAD filename.txt
$ git checkout HEAD filename.txt

リポジトリ全体の操作

ワーキングディレクトリ全体を指定の状態に戻す

以下コマンドによりワーキングディレクトリ全体を指定のバージョンに変更できます。HEAD

部分はブランチ名やコミットIDでも指定可能です。

追跡対象外ファイルは指定の状態に戻りません。(完全に指定のバージョンに戻すにはgit clean -n、git clean -nfコマンドも行う必要があります)

git checkout HEAD   # 直近のコミット状態に戻す

featureブランチで試しに機能を実装・うまくできたら取り込む

試しに機能を実装するにはブランチを作成してマージで取り込みます。以下の通りの手順で行います。

  • $ git checkout develop # ブランチ作成元のブランチをチェックアウト
  • $ git checkout -b feature01 # feature01のブランチを作成(一時的な機能作成用ブランチ)
  • feature01で機能を作成
  • $ git checkout develop # feature01の機能を取り込みたい先のブランチをチェックアウト
  • $ git merge feature01 # feature01を取り込む

コンフリクト発生時の対応

git merge feature01をした時にコンフリクトが発生することがあります。

まず、以下⌘によりコンフリクトが発生したファイルを特定します。

$ git status
# On branch develop
# You have unmerged paths.
#   (fix conflicts and run "git commit")
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#    both modified:      featureFile.1
#
no changes added to commit (use "git add" and/or "git commit -a")
次に、コンフリクトが発生したファイルを開きます(featureFile.1)。 以下のようになっており、マージ先(develop)の中身がaiueo4~1、マージ元(feature01)の中身がaiueo123であることを表しています。不要な方及び不要な行(<<<<<<<<<< HEAD aiueo4~1 ======= aiueo123 >>>>>>> feature01 その後以下の通りコミットします。
$ git add .
$ git commit -m "conflicts fixed等"
$ git push origin develop

既存のプロジェクトへの参画

既にGitHub上にリモートリポジトリがあり、開発が進んでいる場合は以下の手順で作業をします。大まかな流れは以下を参考。

https://qiita.com/firstVersion/items/cba23e6f71b0699b7d75

既存のGitHubリポジトリをローカルにクローン

まずはGitHub上のリモートリポジトリからローカルリポジトリをセットアップします。以下コマンドによりGitHubリポジトリをローカルに取得します。

$ git clone URL
$ git checkout develop   # developからブランチを作成する場合、developへ移動
$ git checkout -b feature_name   # 機能などの作業用ブランチ(feature_name)を作成してチェックアウト

リモートリポジトリの更新取り込み

ローカルリポジトリの更新内容をリモートリポジトリに反映する(push)前にリモートリポジトリの更新を取り込みます。(origin/masterを更新します)

まずは以下コマンドで 現在チェックアウト中のブランチの最新情報を取得します。

$ git fetch   # 現在チェックアウト中のブランチの最新情報を取得
$ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean
git statusコマンドによってorigin/masterよりmasterがコミット1つ分遅延していることがわかります。 このコミットによって差分が発生していないかを以下コマンドによって確認します。
$ git diff master origin/master
衝突(コンフリクト)が発生している場合は この遅延しているコミットを取り込むために、mergeコマンドを使用します。
$ git merge origin/master   # masterブランチにorigin/masterをマージ
なお、上記のfetchとmergeを一度に実行するのがpullです。上記の作業を以下コマンドのみで実行できます。
$ git pull

自分のfeatureブランチを作成した後マージ先の更新を取り込んでからプルリクエスト

developブランチからfeatureブランチを作成し、プリリクエストを送る前にdevelopの更新を取り込みたい場合、以下の手順で作業します。

まず、以下の通り現状を確認します。上から順に、develop、feature、feature、developの履歴です。

$ git log --graph --oneline develop feature -n 4
* 4126b94 developBranch modified
| * 505ef05 feature2 added
| * 9fe7969 feature1 added
|/  
* 0556b49 feature_rebase2 commit
2つ目、3つ目の履歴を直近のdevelopブランチの後に付け変えたいため、featureブランチをチェックアウトし、rebaseコマンドでdevelopブランチの最新版の後ろにfeatureブランチの履歴を付け替えます。
$ git checkout feature
$ git rebase develop
First, rewinding head to replay your work on top of it...
Applying:feature1 added
Applying: feature2 added
再度ログを確認すると、順番が入れ替わっています。
$ git log --graph --oneline develop feature -n 4
* 4ffccf1 feature2 added
* 0b905f1 feature1 added
* 4126b94 developBranch modified
* 0556b49 feature_rebase2 commit

まとめてコミット(rebase -i)

developブランチからfeatureブランチを作成し、履歴が複数になったためまとめてコミットしたい場合、以下の手順でコミットをまとめます。以下の例ではfeatureの1回目と2回目のログをまとめて1つの履歴とし、ログメッセージも修正します。

$ git log --graph --oneline
* fa0cd25 ff3_2.txt added      # featureで2回目のコミットログ
* 1afb324 ff3_1.txt added      # featureで1回目コミットログ
* 7a8ae4b feature_ff2_2.txt added     # featureブランチを切る前のdevelopのコミット
* ~~~~ログが続く~~~~
$ git rebase -i 7a8ae4b
ファイルが開くため、以下の通り修正 []修正前]
pick 1afb324 ff3_1.txt added
pick fa0cd25 ff3_2.txt added
[修正後] rはreword(コミットを利用するがコミットメッセージを変更する) fはfixup(コミットメッセージを破棄し、直前のコミットに統合する)、3つ以上ログがある場合はそれらもfにします。
r 1afb324 ff3_1.txt added
f fa0cd25 ff3_2.txt added
設定を保存するとログメッセージ「ff3\_1.txt added」を編集する画面が表示されるため、メッセージを修正します。(今回は「ff3\_1.txt and ff3_2.txt added」にします) ログメッセージを保存すると以下のようなメッセージが出ます。 ※修正を間違えたら「$ git rebase –abort」で直前のrebaseをなかったことにして修正をやり直します。
2 files changed, 2 insertions(+)
create mode 100644 ff3_1.txt
create mode 100644 ff3_2.txt
Successfully rebased and updated refs/heads/feature_ff2.
再度ログを確認すると以下の通り1つにまとまっています。
$ git log --graph --oneline -n 6
* d940e7a ff3_1.txt and ff3_2.txt added
* 7a8ae4b feature_ff2_2.txt added
* 6ae8814 feature_ff2.txt added

その他備忘メモ

  • コミットIDは40桁あるが、リポジトリ内であれば頭4桁程度で識別可能($ git show 1234 の検索コマンドで識別できていた)

git関連用語

  • HEAD 現在のリポジトリの最新位置を指す。インデックスとも呼ばれる
  • HEAD^ HEADの1つ前の履歴
  • masterはローカルの作業リポジトリ、origin/masterはリモートリポジトリに紐付いている(リモートの更新はfetchなどをしないと取り込まれない)

地味に覚えておきたいコマンドまとめ

Command Description
git commit -am “comment” git add .、git commit -m “comment”と同じ

参考サイト