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 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操作を学び直したいと思います。