git導入うはー

■git設定

まず、.bashrcに以下を追加

-f "/home/game/users/momo/.git-completion.bash" && source "/home/game/users/momo/.git-completion.bash" # ファイルがあったら、この機能を発動させる

git の自動補完だけを有効にする
/etc/bash_completion.d/git を適当な場所にコピーします。
例)
$ cp /etc/bash_completion.d/git ~/users/momo/.git-completion.bash

PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' # ブランチ名をプロンプトに表示させる

つぎに、.gitconfigに以下を追記

[color]
ui = auto
# 色わけしてくれ見やすくなる

[alias]
tr = log --graph --pretty='format:%C(yellow)%h%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset'
# git tr でgitxの表示のような表示(gitのbranch変更履歴の表示)がされるようになる


■git メモ
○branchで「hogehoge/」「origin/hogehoge」とかいって、同じファイルがあるけど...これは...?
=> origin ってなんだ
・originがついてるのは、リモートブランチを表していて、
・originがついてないのは、ローカルのブランチを表しいるのです。

○branchって種類がいっぱいある

$ git branch

で表示されるものは、ローカルブランチ
=> ローカルにもってきたブランチ

$ git branch -r

で表示されるものは、ローカルの中にあるリモートブランチ情報
⇒実際のリモートブランチではないが、ローカルの中にリモートブランチ情報をもってきている(「情報」であり、「実態」ではない)

※つまり
ローカルの中にあるリモートブランチの情報を更新してから、ローカルブランチにmergeする必要がある!

$ git fetche
$ git merge <ブランチ名>
or
$ git pull

する必要がある。

memo
・git fetch や git pull はブランチ名してしなくても、自動的に実際のリモートブランチを使ってくれるが、
(
正確には、
git pull :git/config という設定ファイルを参照
git fetch :実際のリモートブランチ
)
git mergeは

$ git merge origin/ブランチ名

のように実際のリモートブランチの指定をしないといけないので注意


・git mergeしたときにCONFLICTしたら
merge したときにコメントで

...
CONFLICT (content): Merge conflict in <ファイルパス>
...

とでるので、svn と同様、マージ作業を行う。

○別branchから現在いるbranchにモジュールとかもってきたいとき

$ git show 相手ブランチ名:ファイルパス+モジュール名 > もってきたいとこのパス/名前.pm

でOKです。
Swfとかのバイナリファイルも、これでいけちゃいます。

○今行なっている作業を一時的に保存して、branchを変更したいとき!
こんな状況よくありますね。
差分があるままでgit checkout してbranchを変更してしまうと、その差分を移動後のbranchの差分としてしまいます。
そのため、branchを切り替えたい際は、一度

$ git status
# On branch swf_skip
nothing to commit (working directory clean)

の状態にする必要があります。

がしかし、

途中過ぎてgit add とか git commitしたくない.....んー

なんてのよくあります、ワタシ。
そんなとき、こーしてこーすれば、一時保存てきなことをしてくれるんでっす!

$ git stash save "メモ"
(
または
$ git stash
)

こうすると

$ git stash list
stash@{0}: On ブランチ名: メモ

という形で状態を保存してくれます!
ちなみにgit stash listは、どのbranchにいても全一覧が見れます。

BUT!!!!!!!!!
注意が必要です。

$ git status
# On branch ブランチ名
# Your branch is behind 'origin/ブランチ名' by 4 commits, and can be fast-forwarded.
#
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: Func/TEST.pm
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# test.pm
no changes added to commit (use "git add" and/or "git commit -a")

となっている場合、git stash save対象は

# modified: Func/TEST.pm

のみになってしまいます。

つまり

過去一度もgit addされたことがない新規のものは、git stash save 対象外となってしまいます。
そのため、新規のものには一度git addはしないとだめですね。

まぁ、失敗したら

$ git reset HEAD 戻したいもの名(パスも)

で戻るし。いっか。


○何も考えずにgit stash popしたけど、とってきたかったのこれじゃないし!!しかもその前の状態git stash saveしてないから差分わからんし!!!ってとき

やらかした。

$ git reflog

これで過去のHEADの変更がログとして見れる。
助かった。
とおもいきや、ない。

そんなとき

$ git reflog --all
f47a80d refs/stash@{0}: WIP on swf_skip: fd1a70e boss swf skip
f04ad40 refs/stash@{1}: On feature/hogehoge: boss swf ho and ge
7aed3e4 refs/stash@{2}: On origin/feature/hogehoge: pull miss
...

これで全ブランチの歴史が見れる。

あった。
ログあった。

$ git show -p f47a80d

これで追加されたものが見れる。
良かった。
あぁ良かった。


○git-mergeの--ff, --no-ff, --squashってなんぞや



git stash save -u "comment"
って感じに、-uオプションつかおう

  • u使うと、untrackedなファイルをstashしてくれるから。

(*´∀`*)