gitの基礎勉強-ローカルリポジトリでの操作-

はじめに

gitを用いてソースをウェブに公開しつつ管理をしていて、commitの変更の仕方はどうしたら良いのかと困ったことがあったので、gitの扱い方を改めて勉強してみました。

git

今回は勉強用に以下のファイル構造のファイルを用意した

.
└── git-practice.rb

git を新規作成

git initをすることで初期化された.gitを作成しれくれます。

$ git init

gitの状態を見る

git statusでgitの状態を見ることができて、変更がなければ以下の状態でオールグリーンになる。

$ git status
On branch master
nothing to commit, working tree clean

変更が前回から変更があるファイルが存在する時は以下のコメントが返ってくる。

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    git-practice.rb

nothing added to commit but untracked files present (use "git add" to track)

上記の文で正しい状態ならgit addをすることでコミット準備が整う。

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   git-practice.rb

ローカルリポジトリにコミットする

コミットをすることでgitの変更ツリーに登録される。

$ git add .
$ git commit -m "first commit"

コミットメッセージの変更

--amendオプションを使うことで1つ前のコミットメッセージを変更できる。

$ git commit --amend -m "update commit message"

gitのログを見る

git logでgitでのログを確認することができる。 取れる値は

  • commitハッシュ値
  • 作者: (email address)
  • コミットした日付
  • コミットメッセージ
$ git log

-p オプションをつけることで前回との差分を取得でき、上記以外に以下のように更新情報が入る。

--- /dev/null
+++ b/git-practice.rb
@@ -0,0 +1 @@
+p "Hello World"

上記の差分だけ欲しい時はgit diffがある。

$ git diff

前回のコミット内容全てとの差分が欲しい時はHEADを指定する。 ※前回のコミット時にはなかったファイルの追加については比較されない。

$ git diff HEAD

git commitを消す方法

git revertを用いることでcommitを消すことができる。

やり方はgit logでcommitのハッシュを取得してきて、そのハッシュ値revertをかけると良い。(基本的にはHEADで1つ前だけをrevertする)

$ git log

$ git revert ハッシュ値

git revertが失敗したら--abortオプションを使うことで前回のrevertがなかったことになる。

$ git revert --abort

Git revertとresetについて - Qiita

コミットログごと全て消す場合

git reset --hardを用いることで、指定したコミットから最新のコミットまでのコミットログを消します。

$ git reset --hard コミットハッシュ値

謝ってgit resetで全て消してしまった場合の対応git reflogで戻りたいHEAD番号を取得して元に戻す。

以下では1個前のreset時の記録を無かったことにする。

$ git reflog
$ git reset --hard HEAD@{1}

`git reflog` についてまとめてみる · GitHub

ブランチの切り替え

git branchでブランチを作成して、git checkoutでブランチを切り替える。

$ git branch branch-name
$ git branch branch-name

ブランチのマージ

masterブランチに移動してマージしたいブランチをマージする。

$ git checkout master
$ git merge --no-ff branch-name

コンフリクトの対応

mergeを行なっていたらコンフリクトに会うこともあります。 その時のエラーログは以下のようになってコンフリクトを起こしていることを教えてくれます。

Auto-merging git-practice.rb
CONFLICT (content): Merge conflict in git-practice.rb
Automatic merge failed; fix conflicts and then commit the result

対応としてはgit diffをとることで対応の箇所が出てきます。

diff --cc git-practice.rb
index dc1042d,13b9d2f..0000000
--- a/git-practice.rb
+++ b/git-practice.rb
@@@ -2,4 -2,4 +2,8 @@@ p "こんにちは
  p "revertで消します"
  p "practice-branchで修正した"
  
++<<<<<<< HEAD
 +p "test-aで追加"
++=======
+ p "test-bで追加"
++>>>>>>> test-b

今回はtest-bを残すとして、対応のファイルのHEADと===の間と>>>を消してあげて以下の状態にしてコミットします。

p "test-bで追加"

終わりに

今回はローカルで行う操作のまとめを行いましたが、次はリモートを用いたgit操作を学び直したいと思います。