2012年9月19日水曜日

Git初心者によるGit講座~問題とその対処法~

このエントリーをはてなブックマークに追加

はじめに


はじめまして、アルバイトの齋藤です。
1週間ほど前にエンジニアのアルバイトとして入社し、現在はGitとRuby on Railsについて学びながら日々精進しています。

Gitを全く知らなかった私は、問題への対処法を書籍やWebで調べつつGitを勉強してきました。
まだまだGit初心者な私ですが、今回はそんなGit初心者がつまずかないための方法、またつまずいたときの対処方法を紹介していきたい思います。

目次

  • ありがちなミスとその対処法
  • ブランチの作成、切り替え
  • ミスを減らすためには

ありがちなミスとその対処法


その1.誤ってaddした場合
$ git status
# ...
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       modified:   testA
#       modified:   testB

$ git reset HEAD testA
Unstaged changes after reset:
M       testA  # testAのadd取り消し
上の例は、testAを誤ってaddした場合の対処法が書かれています。
addの取り消しは、(use "git reset HEAD ..." to unstage)
と表示されているので覚える必要もないでしょう。

またaddしたファイルすべてを取り消したい場合は、
以下にあるように、"git reset HEAD"とすることで取り消すことができます。
$ git reset HEAD
Unstaged changes after reset:
M       testA  # testAのadd取り消し
M       testB  # testBのadd取り消し

その2.誤ってcommit した場合
$ git commit -m 'commit testA and testB'
da89b0f] commit testA and testB
 2 files changed, 2 insertions(+), 1 deletion(-)

$ git reset --soft HEAD^ # 1つ前のHEADに戻る

$ git status
# ...
# Changes to be committed:
#       modified:   testA
#       modified:   testB
上の例は、testAとtestBを誤ってcommitした場合の対処法が書かれています。
commitの取り消しを行う、 "git reset --soft HEAD^" とは、
--softは、ファイルが修正された状態を維持することを表し、
HEAD^は、1個前のコミットの状態を表します。
つまり、ファイルをそのままの状態で1個前のコミットまで戻す(reset)することができます。

またcommitのコメントを書き換えたい、またはタイプミスした場合
以下のコマンド "git commit --amend" を使うことで直前のコミットを修正することができます。
またオプションの "-m 'コメント'" とすることでいちいちエディタを開くことなくコメントを打つことができます。
$ git log
...
    git is herd

$git commit --amend -m 'git is hard'

$ git log
...
    git is hard

その3.正しいbranchに切り替え忘れた場合
$ git status
# ...
# Changes not staged for commit:
#       modified:   testA
#       modified:   testB

$ git branch
* master
  ...

$ git stash save
Saved working directory and index state WIP on master: 0349083 test1
HEAD is now at 0349083 test1

$ git status  # 誤ったbranchのaddは取り消される
# ...
nothing to commit (working directory clean)
上の例は、test1ブランチに行うはずの修正をmasterブランチで行ったしまった場合の対処法が書かれています。
一度修正ファイルをaddし、その後 "git stash save" をします。
その後のgit statusからわかるように、addは取り消され、修正ファイルも直前のコミットに戻ります。

git checkoutでブランチを切り替え、 "git stash pop" をすることで、別ブランチで行っていた修正ファイルを移すことができます。
$ git checkout test1  # 正しいbranchに切り替え
$ git stash pop
# Changes not staged for commit:
#       modified:   testA
#       modified:   testB

その4.修正したファイルを元に戻す
$ vim testA  # testAを修正
$ vim testB  # testBを修正
$ git checkout testA # testAのみ修正を戻す

$ vim testA  # testAを再度修正
$ git reset --hard HEAD  # testAとtestBの修正を戻す
上の例では、修正ファイルをすべて元に戻すときの場合が書かれています。
コミットを取り消すときの --soft HEAD とは違い、 --hard HEADをします。
--hardは、ファイルも同様にHEADの状態まで戻すことを表します。

ブランチの作成、切り替え


その1.リモートブランチに切り替え
$ git branch -a
* master
  ...
  remotes/origin/test2

$ git checkout -b test2 origin/test2  # "ローカルブランチ名" origin/"リモートブランチ名"
Branch test2 set up to track remote branch test2 from origin.
Switched to a new branch 'test2'

$ git branch
  ...
* test2  # 新しく作成されたローカルブランチ
masterブランチからtest2リモートブランチに切り替える場合、上記の方法で行います。

もし切り替えるべきリモートブランチが見つからなかった場合、
以下の "git fetch" をすることでリモートブランチが更新され、表示されるようになります。
$ git fetch  # リモートブランチの更新
$ git branch -a

その2.新しくリモートブランチを作成
$ git branch -a
  ...
  test3
  ...
  remotes/origin/test2
新しくリモートブランチを作成する場合は下記の方法で行います。
今回は、例としてtest3というローカルブランチをリモートブランチに追加します。

branch -r とはリモートブランチのみを表示するオプションです。
$ git push origin test3
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:
 * [new branch]      test3 -> test3

$ git branch -r
  ...
  origin/test3  # 新しく作成されたリモートブランチ

ミスを減らすためには


その1.ファイルを変更する前に確認すること
$ git branch
* master
  ...
その2.commitpushする前に確認すること
$ git status
# ...
# Changes not staged for commit:
#       modified:   testA

$ git diff
...
その1、その2ともに当たり前のことではありますが、
現在のブランチの確認、statusによるファイルの状況などを随時確認することで
誤ったaddやcommitを減らせると思います。
またdiffを用いて、ファイルの修正部分を確認するのも忘れないようにしましょう。



一緒に働きたい方、絶賛 募集中

京都で開発してみたいというエンジニアの皆さん、ご応募お待ちしています!
技術力を伸ばしたい学生さん、アルバイトも可能なのでご応募お待ちしています!
大阪、滋賀、神戸から通勤実績あり

3 件のコメント:

  1. I can't imagine a hero of my future book now. But I hope that this useful source will inspire me on writing title and the main character will appear in my head)

    返信削除
  2. Thanks for sharing, nice post! Post really provice useful information!

    Giaonhan247 chuyên dịch vụ mua đồ chơi fisher price chính hãng, mua đồng hồ elsa anna và mua đồng hồ bé trai skmei chính hãng cho bé trên trên Ebay, Amazon uy tín.

    返信削除