Skip to content

Instantly share code, notes, and snippets.

@tkd55

tkd55/git.md Secret

Last active August 29, 2015 14:01
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkd55/b067e291400038713719 to your computer and use it in GitHub Desktop.
Save tkd55/b067e291400038713719 to your computer and use it in GitHub Desktop.
git まとめ

Git

概念

git の4つの状態

  1. 作業ツリー ローカルレポジトリ上にある現在の作業ファイル 作業ツリーの変更点はaddによりインデックスに追加

  2. インデックス(ワーキングツリー) ローカルレポジトリへ反映する変更を一時的に貯めておく領域 インデックスの内容はcommitでローカルレポジトリに反映

  3. リポジトリ

  4. ローカルレポジトリ 作業者のマシン上にあるレポジトリ ローカルマシンでの作業内容が保存される pushにより共有レポジトリに反映される

  5. リモート(共有)レポジトリ 共有するレポジトリで、サーバー上にあるリポジトリ 開発者はここにあるソースをpull / fetch で取り込む


ブランチとは

subversionには無い概念で、履歴の流れを分岐して記録していくためのもの。「ローカルブランチ/リモートブランチ/リモートトラッキングブランチ」の、3種類のブランチがある。

  1. ローカルブランチ ローカルリポジトリで管理されるブランチ。Gitではリポジトリ作成とともに自動的にmasterブランチが作成される。

  2. リモートブランチ リモートリポジトリにあるブランチ。git cloneでリポジトリをコピーした場合、リモートブランチmasterがコピーされる。

  3. リモートトラッキングブランチ(追跡ブランチ) リモートブランチを、ローカルリポジトリでトラッキングするためのブランチ。リモートブランチを参照するために利用する。このブランチは変更できない。「origin/master」というのは、originという名前のリモートリポジトリにあるmasterブランチをトラッキングしていることを意味する。


git コマンド


設定ファイルについて(グローバル)

ユーザ名の確認

$ git config --global user.name

E-mailアドレスの確認

$ git config --global user.name

ユーザ名の設定

$ git config --global user.name "ユーザー名"

E-mailアドレスの設定

$ git config --global user.name "E-mailアドレス"

設定ファイルで確認したい場合は次の実行

$ view ~/.gitconfig

設定ファイルについて(ローカル(プロジェクト単位))

ユーザ名の確認

$ git config user.name

E-mailアドレスの確認

$ git config user.name

ユーザ名の設定

$ git config user.name "ユーザー名"

E-mailアドレスの設定

$ git config user.name "E-mailアドレス"

設定ファイルで確認したい場合は次の実行

$ view ~/<プロジェクトフォルダまでのパス>/.git/config

状態の変更

変更ファイルの破棄(作業ツリーを破棄)

$ git checkout <変更内容を破棄するファイル名>

まとめて破棄する場合はカレントディレクトリを指す

$ git checkout .

作業ツリーのファイルをindexに追加

$ git add <追加するファイル名> 

addの取り消し

$ git reset HEAD myfile.txt 

indexに追加したファイルをローカルレポジトリにcommit

$ git commit -m "コミットメッセージ" 

直前commitの取り消し

$ git reset --soft HEAD^

※ 実際には取り消しではなく、状態を戻している。 ※ softオプションは変更がindexに追加されている状態にする。

2つ前のcommitの取り消し

$ git reset --soft HEAD^^

※2つ前を取り消すと、もちろん1つ前のコミットも取り消される。

コミットを取り消して、指定の位置まで戻りたい

$ git reset <コミットID>

指定したコミットまで、全ての更新をなかったことにする

$ git reset --hard <コミットID>

※ hardオプションは変更した内容も破棄される。(修正もしていない状態になる)

リモートブランチにローカルブランチの内容を反映

$ git push origin <反映したブランチ名>

push の取り消し

pushの取り消しに2つの方法がある。

  • ローカルのリポジトリを修正(コミットの取り消し)後にリモートリポジトリにPushする。
 $ git push -f origin master
  • ローカルリポジトリのコミットを残して、Pushを取り消す。
 $ git push -f origin HEAD^:master

状態の確認

$ git status
  • 編集中(indexに追加する前)
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	sample.txt
nothing added to commit but untracked files present (use "git add" to track)
  • indexに追加後(commit前)
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#	new file:   sample.txt
#
  • commit後
$ git status
# On branch master
nothing to commit, working directory clean

commitログの確認

  • 通常ログ
$ git log
commit 766296f12951d71f331a91eb614ef0eac074e93b
Author: tkd55 <takeda@cshool.jp>
Date:   Tue Feb 4 15:41:22 2014 +0900

    first Commit
  • ネットワークがわかるcommitログを見たい
$ git log --graph --oneline --decorate --all
* 77a97a6 (HEAD, develop) Push取り消し練習
* f6f7c40 (origin/master, origin/develop, origin/HEAD, master) developブランチに追加
* ef9e874 developブランチにさらにさらに追加
* 2a19062 masterブランチにさらに追加
* a1bd130 masterブランチに追加
* 6cbee97 testブランチにさらに追加
* 61a04d0 testブランチに追加
*   16aa0f1 (origin/test) Merge branch 'develop' into test
|\  
| *   305b22f Merge branch 'test' into develop
| |\  
| | * bbaf4c3 Revert "testブランチにさらに追加"
| * | 3902277 developブランチに追加
* | | 7c15d74 Revert "testブランチにさらに追加"
| |/  
|/|   
* | 8e33e53 developブランチに追加
* | d786079 testブランチにさらに追加
* | 89f2651 testブランチに追加

ブランチ関連

ブランチの作成

$ git branch <作成するブランチ名>

ブランチの確認

$ git branch

ブランチの移動

$ git checkout <移動先のブランチ名>

ブランチを新規作成し、そのブランチへ移動

$ git checkout -b <新規ブランチ名>

tag

tagの一覧表示

$ git tag

tagの一覧表示(アノテーション付き)

$ git tag -n

tagをつける

$ git tag tag名

tagをつける(アノテーション付き)

$ git tag tag名 -m "アノテーション"

特定のcommitにtagを付ける

$ git tag tag名 commitハッシュ 

tagの削除

$ git tag -d tag名 

tagをパターンで検索して表示する

$ git tag -l "A*" 

tagをリモートレポジトリに反映

$ git push origin tag名

リモートレポジトリのタグを削除

git push origin :tag名

差分確認

ワーキングツリーとインデックスの差分

$ git diff

HEAD とインデックスの差分

$ git diff --cached

HEADとワーキングツリーの差分

$ git diff HEAD

その他

あとからgitignoreを適用したので、不要なディレクトリとファイルを消したい

ディレクトリ

$ git rm --cached -r drafts/

ファイル

$ git rm --cached A.txt

他のブランチの特定のコミットだけマージしたい

$ git cherry-pick <コミットID>

特定のコミットログまで戻す

$ git reflog
162ff5c HEAD@{0}: commit: diffコマンド
38054b0 HEAD@{1}: commit: ブランチ関連追加
13e550f HEAD@{2}: commit: 概念追加
c01924c HEAD@{3}: commit: 編集/add/commitの取り消し
23fbbed HEAD@{4}: checkout: moving from master to git_command
23fbbed HEAD@{5}: commit: 再度コミット
$git reset --hard HEAD@{1}

いったんマージを無かったことに!

$ git reset --hard ORIG_HEAD

リモートブランチからmaster以外のブランチをローカルに新規に取得

例. リモートリポジトリ上で master / develop / hoge.. など色々なブランチで運用している場合、新規メンバはcloneしてくるだけでは、通常masterしか存在してないのです。 そこで、開発用developブランチに切り替えたいという時は、こんな感じで。

$ git fetch
$ git branch -a
* git_command
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/git_command
  remotes/origin/master
$ git checkout -b develop origin/git_command

補足 git checkout -b [ローカルに作成するブランチ名] [リモート上のブランチ] -bオプションを指定しておくと、自動的にそのブランチに切り替わる。 -bオプションを指定しないと、以下を再度する必要がある。

リモートブランチを追加する

$ git remote add 

現在のブランチに別のブランチの編集をマージする

$ git marge <取り込むブランチ名>

ローカルブランチの削除

$ git branch -d ブランチ名

リモートブランチの削除

$ git push --delete origin <削除するリモートブランチ名>

or

$ git push origin :削除するリモートブランチ名

ローカルに残ってしまっているリモートブランチを一括削除

$ git fetch --prune

or

$ git fetch -p

リモートリポジトリから変更を取得して、マージしない( ローカルリポジトリのみに変更を反映)

$ git fetch <リモートレポジトリ>

コミットの取得

$ git fetch

で入手したコミットの先頭は FETCH_HEAD で扱える。 たとえば、ログを見るには

$ git log FETCH_HEAD

差分を観るには

$ git diff FETCH_HEAD

マージするには

$ git merge FETCH_HEAD

補足


ブランチの統合

fast-forward (ファーストフォワード)

2つのコミットAとBとがあるときに、コミットAにいたる歴史がコミットBにいたる歴史にすべて含まれている場合、2つのコミットはファーストフォワードの関係にある、とか、コミットAはコミットBにファーストフォワードする、といいます。

コミットAの歴史: X -> A コミットBの歴史: X -> A -> Y -> B コミットBの歴史に、コミットAの歴史が全て含まれている。

これが「fast-forward」な関係

コミットAの歴史: X -> Y -> A コミットBの歴史: X -> Y -> Z -> B コミットBの歴史に、コミットAの歴史が含まれていない(Aのコミットが含まれていない

これだと「fast-forward」な関係ではない。


marge と rebaseについて

mergeとrebaseは共に履歴を統合しますが、特徴が異なります。

  • merge 変更内容の履歴はそのまま残るが、履歴が複雑になる。

  • rebase 履歴は単純になるが、元のコミットから変更内容が変更される。 そのため、元のコミットを動かない状態にしてしまうことがある。 mergeとrebaseは、チームの運用方針に応じて使い分けます。 例えば、履歴を一本化するように運用をするのであればrebaseを使う。

トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う。統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmergeというように使い分けます。


リモートリポジトリの移行

$ git remote -v
origin  https://tkd55@bitbucket.org/tkd55/xxxxxx.git (fetch)
origin  https://tkd55@bitbucket.org/tkd55/xxxxxx.git (push)

$ git remote rm origin
$ git remote -v

$ git remote add origin 移行先のリモートリポジトリ

$ git push -u origin master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment