LoginSignup
809
805

More than 3 years have passed since last update.

現場で使うGitのテクニック

Last updated at Posted at 2014-12-23

treby
Git Advent Calendar 201423

Git使2

git使

稿GitGitHub




Gitgit init

git clone
$ git clone git@github.com:reddit/reddit.git

GitHubreddit/reddit


git-flowgithub-flowGitHubfork


$ git remote add self git@github.com:treby/reddit.git

reddit/redditfork()treby/redditself

mastermastergit pull origin masterfeaturegit push self feature/foobarPull Request

各リポジトリのイメージ図
git remote -v
$ git remote -v
origin  git@github.com:reddit/reddit.git (fetch)
origin  git@github.com:reddit/reddit.git (push)
self    git@github.com:treby/reddit.git (fetch)
self    git@github.com:treby/reddit.git (push)

履歴に残す自分の情報の設定

要するにgit configの事なのですが設定していないとコミットする際にデフォルトで、

  • 名前: マシンに設定された名前
  • メールアドレス: 【ユーザ名】@【ホスト名】

という情報が使われます。(コミット自体ができないかと思いきや、できるのはできるんですね)

$ git commit -m 'Test Commit' 
[master 0acfdcb] Test Commit
 Committer: Hiroaki Ninomiya <treby@yourhost>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

そこで、コミットのAuthor情報などに使われる自分の情報を設定してあげます。

$ git config --global user.name "treby"
$ git config --global user.email "treby@example.net"

とまあ通常であれば、大抵のケースではこれ一回行えば良いのですが、プロジェクトによってAuthorを変えたいという場合が生じることがあります。一つのマシンで仕事のコードと趣味のコード、両方を書くようなケースですね。

gitがコミットの際に付与する情報はデフォルトでは上記で設定した情報ですが、もちろんリポジトリごとに設定することもできます。やり方は簡単で設定したいプロジェクトのコードがあるディレクトリで先ほどのコマンドから--globalを外せば良いです。

$ git config user.name "Hiroaki Ninomiya"
$ git config user.email "hiroaki.ninomiya@example.com"

ここで設定した情報はプロジェクトルート以下の.git/configに記述されています。

$ tail .git/config 
:
<略>
:
[user]
    name = Hiroaki Ninomiya
    email = hiroaki.ninomiya@example.com

ここまでで一通りの開発準備ができました。

よく使うテクニックあれこれ

次は実際に開発作業を行う上でよく使うコマンドをTips風に紹介します。

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

ブランチを切るコマンドとしてはgit branch <ブランチ名>ですが、git checkout-bオプションを使用することが多いです(ブランチを新しく作成して、かつそのブランチに切り替えてくれる)

$ git checkout master
$ git pull origin master           # 開発環境上のコードを最新にする
$ git checkout -b feature/sugoi_kinou

※2020年5月追記

なお、 git checkout についてはそのコマンドが持つ役割が多すぎるという声もあったようです。そのフィードバックを反映して、Git 2.23(2019年8月リリース) で同等の機能を持つ git switch (ブランチの切り替えに使用) コマンドと git restore (ファイルの変更に使用) コマンドが実験的に導入されました。
上記の git checkout -b を利用した「ブランチを新しく作成して、かつそのブランチに切り替える」操作を実行する git switch コマンドは

$ git switch -c feature/sugoi_kinou

 checkout -> switch  -b (--branch) -> -c (--create) git checkout  git switch / git restore 

 git checkout 使


git branch使
$ git branch
* feature/foobar
  master

git branch--mergedオプションで現在のブランチ(というかHEADというか)にマージされている(含まれている)ブランチの一覧、-dオプションでブランチの削除ができます。
これらのオプションを利用して、開発が進んでブランチが多くなった時などmasterブランチ(最新にしておく)上などで以下のようにして、マージされたブランチを一括で削除したりします。

$ git branch --merged | grep -v '*' | xargs git branch -d
Deleted branch ...
Deleted branch ...

コミット前の準備

コードの修正がひと段落したらコードをステージングエリアにあげましょう。
ステージングエリアという考え方が独特でとっつきにくく感じていらっしゃる方も多いようですが、コミットの前の準備状態くらいの認識で良いのではないかと思います(15日目の記事では「手紙を封筒に入れる」というユニークな表現をされています)。

基本はプロジェクトディレクトリのルートで

$ git add .

()






$ git add <パス>

で明示的にステージングエリアにあげるファイルを指定したり、

$ git add -p

(-p6)

Pull Request

git mvgit rm使




git commitgit diff --stagedgit status使.DS_StoreThumb.db:)

-m
$ git commit -m 'Redirect to root if user has something bad.'

チケット対応など、修正に対応するリソースがある場合は、あえてオプションをつけずエディタを起動させます。そしてエディタ上で2行目などにチケットへのURLを添付します。

$ git commit

〜エディタ起動〜

Fix for TICKET-XXXXXX
http://internal.example.com/TICKET-XXXXXX

本当に稀ですが、プロジェクトのルート上で、-aオプション(git add .)つけてコミットすることもあります。

$ git commit -am 'Fix typo.'



typo()

()Pull Request

Fix typo

git commit --amend


--amend使
$ git add .
$ git commit --amend

git rebase

機能開発途中のコミットでtypoをしてしまった場合など、対話的rebaseを使います(-iオプション)。
例えば3つ前のコミットで軽微なミスをした場合は以下のように入力します。

$ git rebase -i HEAD~3

するとエディタが起動して、下記のような画面になります。

pick c7b8f45 commit 1                 # 3つ前のコミット
pick e218500 commit 2                 # 2つ前のコミット
pick f408755 commit 3                 # 1つ前のコミット

:
<略>
:

ここで、3つ前のコミットの「pick」の部分を「edit」に変更して保存、エディタを終了するとGitは3つ前のコミット(commit 1)を行った状態で一時停止してくれます。

この状態でミスを修正して、前述したgit commit --amendでコミットをまとめます。すると3つ前のコミット(commit 1)にまとめられる形になります。

修正が完了したら、

$ git rebase --continue

でrebase作業を続行します。

なお、途中で訳がわからなくなった場合などは

$ git rebase --abort

rebase

git rebase -ieditsquash

pick

git rebase
$ git checkout master
$ git pull origin master           # 開発環境上のmasterブランチを最新にする
$ git checkout feature/foobar      # 開発開始から時間が経ってしまったブランチ
$ git rebase master

git reset

実際上、ブランチのつじつま合わせに使っています。

例えば、本来であれば別途featureブランチを作成して行うべきコミットを誤ってmasterブランチに行ってしまった場合などです。以下に例を示します。

$ git checkout master

# 本当であればこの間で git checkout -b feature/foobar とすべきだった

$ edit
$ git add .
$ git commit -m 'foobar.'
$ git branch feature/foobar       # とりあえず今の位置に本来のブランチ名をつける
$ git reset --hard HEAD^          # masterブランチのHEADを一個前に戻す

$ git checkout feature/foobar     # 改めて開発を再開できる

また、マージしようとしたらコンフリクトして失敗した!というような場合はひとまずgit reset --hardします(一旦戻そう、的な)。

$ git reset --hard

まとめ


git使使

使()(.git)master

Git使Happy Hacking!!

shigemk2GitHubEnterprise()
809
805
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

809
805