Git Tips

提供: Akionux-wiki
Share/Save/Bookmark
移動: 案内検索

ブランチ

ブランチを作成する:

git branch <branch>

ブランチを切り替える:

git checkout <branch>

特定のファイルの履歴を見る

git log <file>

リモートのタグをpush/pullする

git pull --tag
  • push
git push --tag

upstreamを設定する

git pullやgit pushを引数なしで実行したときに指定されるリモート名およびそのブランチを次のように設定できる

git branch --set-upstream-to=<リモート名>/<リモートのブランチ名> <ローカルのブランチ名>

pushと同時にupstreamを設定する

以下のようにして-uオプションをつけてpushすると同時にupstreamを設定できる[2]

git push -u <remote> <branch>

コンフリクトを戻す

間違ったリモート/ブランチのgit pullしてコンフリクトしてしまったときに戻すには(git 1.7.0 以降)[3]

git reset --merge

git diffでESCが出る

git diffでファイルの差分を表示したとき、例えば

ESC[31m-{ESC[m
ESC[31m-    Oid         res = InvalidOid;ESC[m
ESC[31m-    Relation    rel;ESC[m
ESC[31m-    StringInfo  buf;ESC[m
ESC[31m-    char       *storageName = NULL;ESC[m
ESC[31m-    int         prefix = 0;ESC[m
ESC[31m-ESC[m

のように、"ESC"というのが出て、うまく表示されなくなった。 文字のカラーを指定するカラーエスケープシーケンス[4]というものらしく、それをgitのcore.pager変数で指定されるページャがうまく表示できていないということらしい。 そこで、1つ目の対策はcore.pagerに"less -r"を指定する[5]

git config --global core.pager "less -r"

もうひとつは、カラーにはならないが、moreを指定してもよいらしい。

git config --global core.pager more

コミット履歴の表示

リポジトリ全体のコミット履歴を表示するには、

git log

特定のファイルやフォルダ以下のコミット履歴を表示するには、

git log <ファイル名またはフォルダ名>

とする。 さらに、各コミットの差分を表示するには、-pオプションを、上からある個数までのコミットに表示を絞る場合は-n <個数>または-<個数>をつける[6]:

git log -p -5 hogefile

git addを取り消す

間違えてgit addしてしまったfoo.txtをキャンセルする[7]

$ git reset HEAD foo.txt

ファイルをリポジトリから外す

foo.txtをリポジトリから外すには、

git rm --cached foo.txt

とする。 rmコマンドのようにディスクから削除するには、

git rm -f foo.txt

とする。

パーミッションの変更を無視する

core.fileModeをfalseに設定する[8]

git config core.fileMode false

特定のコミットを部分的にマージする

gitのcherry-pickというので、特定のコミットをマージすることができる[9]

ここでは、マージリクエストを送りたいが、自分のコミットは汚ないし公式にコミットすべきでない部分も含んでいるので、必要なコミットだけのマージリクエストを送る例を以下に載せた。

マージリクエストを送りたい先(リモート名gnu、ブランチ名nightly)をチェックアウトする:

git checkout gnu/nightly

そこからmychangeというブランチを作る:

git checkout -b mychange

cherry-pickでマージしたいコミットだけ列挙する。ここでは、-nを付けることで、列挙したコミットをコミットしないようにした。

git cherry-pick -n <commit> <commit> ...

先ほど-nオプションを付けた場合は改めてコミットする。

git commit -am "What I changed."

リモートのブランチへプッシュする。

git push mygnu nightly

あとは、GitLabでマージリクエストの手続きを行なう。

References

  1. Do git tags get pushed as well? - Stack Overflow http://stackoverflow.com/questions/2988088/do-git-tags-get-pushed-as-well
  2. git pull を --set-upstream-to で引数無しで実行可能にする - Qiita http://qiita.com/kjirou/items/e0469aac0e128be380d6
  3. transitive.info - git pull 使い方 http://transitive.info/article/git/command/pull/
  4. 涼しくなりました - らばだく::天日干し http://d.hatena.ne.jp/labduck/20110821#p1
  5. Avoid escape characters in GIT http://michael.otacoo.com/linux-2/avoid-escape-characters-in-git/
  6. git logのオプションあれこれ - 煙と消えるその前に http://heart-shaped-chocolate.hatenablog.jp/entry/2013/07/16/035104
  7. http://d.hatena.ne.jp/kanonji/20101116/1289885277
  8. How do I make Git ignore file mode (chmod) changes? - Stack Overflow https://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-file-mode-chmod-changes
  9. Git で特定のコミットだけをマージする http://www.devlog.alt-area.org/?p=472