szmlb.net

tips for robotics

gitメモ: gitの使い方

gitに関する昔のメモの整理.

用語の整理
  • ワークツリー : 作業ディレクト
  • ステージ領域(インデックス) : ワークツリーからリポジトリに変更結果をコミットする際の中継ポイント
  • HEAD : ブランチの最新のコミット
  • commit
  • push, pull
  • branch
  • checkout
  • merge
  • rebase
  • cherry_pick
  • fast-forward, non fast-forward
Gitをインストールする

$ sudo apt-get install git-core
$ sudo apt-get install gitk // GUIでGitを管理

作業ディレクトリをGit管理下のディレクトリに指定

$ git init

Git管理下のディレクトリの状態を表示

$ git status

# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# Makefile
# main.cpp

ここで, 未管理のファイルMakefile, main.cppが"Untracked files"という表現で列挙されています.

管理したいファイルを指定, 追加

Untracked filesを, 管理対象のファイルに変更します.

個別指定
$ git add "file name"

一括指定
$ git add ./*

全てのファイルを管理対象に指定すると,

# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: Makefile
# new file: main.cpp
# new file: readme.txt
#

と表示されます.
Makefile, main.cpp, readme.txtという3つのファイルが管理下に置かれました.

コミット

コミットします.
コミットすることで, addしたファイルが新規変更分として保存されます.
その際, コメントを残しておくことでどのような変更が行われたか, ということを明確にする事ができます.

$git commit

以下のような編集画面が現れるので, 上部にコメントを書いて編集を終了します.

First commit for Preview Control program.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Committer: szmlb
#
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: readme.txt
#

ログを表示する

$ git log

commit: *****

Author: szmlb
Date: Mon Dec 31 16:39:34 2012 +0900

First commit for Preview Controller program.

commit: 後の **** がコミット名になり, commit時のコメントが同時に表示されていることが分かります.

詳細を確認したい場合は,

$ git show ********

として確認します.

$ git show

とだけ打ち込むと, マスターブランチのtailのコミット詳細が表示されます.

コミット名を省略する

毎回 $git show ******** のように指定するのは面倒です.
そこで, 代替のタグ名を指定し, 入力を簡単化します.

$ git tag ver1 ********
$ git show ver1

で詳細を表示可能.

コミット間の差分を表示する

最低限使うdiffの機能がまとまっている.
よく使う git diff コマンド - Qiita

インデックスとワークツリーの差分を表示 (addしていないファイルを表示)
$ git diff

インデックスとHEADの差分を表示
$ git diff --cached

直前のコミットによる変更の表示
$ git diff HEAD^ HEAD

ブランチを切る

本流と支流を作ります.
本流でメインの作業を続け, 支流では別の作業を行うことができます.
また, あとで本流と支流を合流(マージする)させることもできます.

ブランチを確認する

$git branch
* master

ブランチを作成する

$git branch recursive
$git branch
* master
recursive

"recursive"という名前のブランチを作成しました.

ブランチを切り替える

作業を行うブランチを切り替えます.
現在,

* master
recursive

の二種類のブランチが存在します.

$git checkout recursive

によって, recursiveブランチに切り替えます.
次に, readme.txtを変更し, commitします.
commit後, 再度マスターブランチに戻って修正に影響があるかどうかを確認すると,
変化がないことがわかります.

ブランチをマージする
  • 1つブランチを切っていた場合のマージ

以下のツリーの状態を考える.

---> *master ---> branch1

masterブランチでbranch1の内容を統合する.

$ git merge branch1

すると, ツリーの構造は以下のようになる.

--->・---> *master, branch1

となる.

branch1は不要なので, 以下のコマンドで削除する.

$ git branch -d branch1

--->・---> *master

このように, 一度作成したブランチの情報を消して1つのブランチにまとめることをfast-forward マージと言う.

  • 2つ以上ブランチを切っていた場合のマージ

以下のツリーの状態を考える.

--- > *master ---> branch1
     \
      ---> brahch2

2つのブランチを順にマージする.

$ git merge branch1

--- > ・ ---> *master, branch1
    \
     ---> brahch2

$ git merge branch2

masterの内容(branch1の内容をマージ)と, branch2の内容をマージしようとすると, コンフリクトが発生する.
(branch2は, branch1をマージする前のmasterをベースにしているため)
この時点で, コンフリクトが発生しているソースコードにgitが差分を加えているので, それを自力で修正する.

最後に, 修正をaddしてコミットすると,

$ git commit

以下のようなツリー構造になる.

--- > ・ ---> branch1 ---> *master
    \         /
     ---> brahch2 ---

この時はマージの履歴が残り, non fast-forward マージと呼ばれる.

  • リベースでマージする

mergeコマンドではなく, rebaseコマンドでマージすることもできる.
branch1をマージした状態の以下のツリー構造を考える.
branch2にチェックアウトしておく.

--- > ・ ---> master, branch1
    \
     ---> *brahch2

$ git rebase master

コンフリクトが生じるので, 修正する.
続いて修正をaddする.
rebaseの場合はコミットせずに以下のコマンドを叩く.

$git rebase --continue

--- > ・ ---> master, branch1 ---> *brahch2

最後に, masterにチェックアウトしてbranch2をマージする.

$ git checkout master
$ git merge branch2

--- > ・ ---> branch1 ---> *master, brahch2

ブランチとは【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

以前のコミットまで状態を戻す
  • checkoutで戻る (要検討)

$ git checkout <コミットID>

昔のコミットに戻ると, 戻ったコミット以降のコミットがgit log等で見えなくなる.

$git branch で確認すると,

* (detached from 0b4711f)
master
hoge
hogeee

のように一時的なブランチが切られているので,

$git checkout master で戻ればOK.

Git で過去の Commit に一時的に戻り、作業後、また最新のCommitを復活させる - Qiita

  • 現在のコミットを削除して以前のコミットに戻る

$ git reset --hard <コミットID>
Git:以前のコミットまで戻す方法 - tyoshikawa1106のブログ
Git 前のバージョンに戻すには? - code snippets

rebaseでcommit情報を変更する

commitのログを変更したり, commitを削除するには rebase が使える.
下記のサイトが参考になる.

参考