facebook twitter hatena line email

Git/コマンド

提供: 初心者エンジニアの簡易メモ
2018年6月8日 (金) 16:05時点におけるAdmin (トーク | 投稿記録)による版 (プロジェクト内で別gitプロジェクト管理(submodule))

移動: 案内検索

目次

gitクローン作成

$ git clone ssh://user1@localhost/var/git/project1.git project1

gitのインデックスに追加する場合

全てのファイル

$ git add .

新しく作成されたファイルも含めるとき

$ git add -A

ローカルの変更を元に戻す場合

$ git checkout file1

全ての場合

$ git checkout .

全ソースをある地点まで戻す

git checkout リビジョンid
git pull origin master // 戻した後、ソースを最新にする場合

git pushがnon-fast-forwardエラーとなりpushできない際

push先の子孫でない場合発生

$ git merge origin master

を実行してからpush

もしくは強制的に・・(これは他の人に怒られる。複数人でやってなければok)

$ git push --force

削除したファイルをコミットするには

$ git add -u
$ git commit

コミット時の差分確認

git commit -v

現在のブランチ確認

$ git branch
* master

現在のブランチ確認(リモートも含める場合

$ git branch -a
* master
remotes/origin/master

ブランチ作成

$ git branch develop
$ git branch
* master
develop

ブランチ切り替え

$ git checkout develop
$ git branch
>   master
> * develop

ブランチのマージ

ブランチをマスターにしてからdevelopブランチをマージ

$ git checkout master
$ git merge develop

ブランチのマージで競合(Conflict)が発生した場合

$ git status # Conflictファイル確認
$ vi file1.php
$ git add file1.php # 修正したConflictを追加
$ git status # 一旦確認
$ git commit -a # mergeコメント確認&"wq!"でmerge
$ git log # log確認

ローカルブランチ削除

$ git branch -d develop

ローカルブランチ削除時にerror: The branch '〜' is not fully mergedのエラーが発生した場合

マージされてないものを含んでいるブランチを消そうとしたときに発生する

消しても問題なければ以下で消せる

$ git branch -D develop

ブランチをpush

$ git branch develop
$ git push origin develop

リモートブランチをローカルに

$ git branch develop origin/develop

(注意)pullするのは危険(現在自分がみているブランチにマージされる恐れがある

別の方法としてcheckout -bでもできる。hotfix例

$ git checkout -b hotfix/kinou1 origin/hotfix/kinou1

以下エラーが出る場合

fatal: Cannot update paths and switch to branch 'hotfix/kinou1' at the same time.

remote branchが古いので以下で更新する

$ git fetch

タグ作成

git tag -a v1.0

タグリスト

$ git tag
v1.0

作成したタグpush

git push origin v1.0

タグ削除

git tag -d v1.0

タグ削除(リモート)

git push origin :v1.0

タグcheckout

git checkout v1.0

エクスポート

svn exportと同じ(ファイルだけ出力したいとき

$ git archive [branchname] | tar -x -C [filename]
$ git archive master | tar -x -C /var/www/project1

コミット日付をタイムスタンプに復元

for FILE in `git ls-files`; do
  TIME=`git log --pretty=format:%ci -n1 $FILE`
  echo $TIME'\t'$FILE
  STAMP=`date -d "$TIME" +"%y%m%d%H%M.%S"`
  touch -t $STAMP $FILE
done

参考:http://d.hatena.ne.jp/iww/20121011/pretty

コミット日付をタイムスタンプに復元(例:テンプレのみ

for FILE in `git ls-files`; do
  if [[ "$FILE" =~ ^public|fuel/app/views|fuel/app/themes ]]; then
    TIME=`git log --pretty=format:%ci -n1 $FILE`
    echo $TIME'\t'$FILE
    STAMP=`date -d "$TIME" +"%y%m%d%H%M.%S"`
    touch -t $STAMP $FILE
  fi
done

git pull時のエラー

You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in

以下コマンドで対応

$ git config branch.master.remote origin

gitデフォユーザ設定

$ git config --global user.name="sampleuser"
$ git config --global user.email="sampleuser@example.com"

gitコンフィグ確認

$ git config --list

git履歴一覧

$ git log
$ git log --stat # ファイル名一覧付き
$ git log --name-status # ファイル名一覧付き M A D付き
$ git log --since=2013-07-10 --until=2013-07-16 # 期間指定
$ git log --name-status --since="2013-07-10 10:10:10" | grep '^M' | grep -v '^Merge' | cut -f 2
$ git log --name-status --since="2013-07-10 10:10:10" | grep '^A' | grep -v '^Author' | cut -f 2

git差分確認

$ git show [リビジョンid]
$ git show [リビジョンid] test.php #1ファイルのコード差分
$ git show [リビジョンid] --name-only #ファイルだけ

git過去ファイル確認

$ git show [リビジョンid]:test.php

gitブランチ比較

git diff develop
git diff develop --name-only # ファイル名のみ

gitで管理しないdir指定方法

.gitignoreをトップdirにおき無視ファイルを記載

$ vi .gitignore
*~
*.bak
Thumbs.db
desktop.ini
.DS_Store
.buildpath
.project
.settings
*.tmproj
fuel/app/logs/*/*/*
fuel/app/cache/*/*
build
nbproject/
.idea
logs/*
# .svnディレクトリ無視
.svn
*.swp

.gitignoreに追加したと同時に無視設定が反映される

空のdirを管理する

空dir内に.gitkeepファイルを作成

$ touch .gitkeep

(no branch)にコミットしたログをマージ

$ git branch # とすると以下のように表示される場合
* (no branch)
  master
$ git checkout master # masterブランチに戻る
> 2516532 readme記述 # などとコミットログが出力される
$ git merge 2516532 #マージする

Previous HEAD position was 923c794... result文言修正

gitログ削除

直近ログ削除なら問題ないが、昔のログ削除は競合しまくって難しいかも。

$ git rebase -i 103b8e948f1fee1e5b024cd444e46dee0d6f0057 # 最もさかのぼりたい過去のコミットを記述
pick 6896fde gitignore修正
pick 630644c version置換対応
pick e12c899 dbダンプ最新
# ↑削除したいものだけddで削除する
git rebase --continue
git status
# 競合を直す
git add -u

git_cloneが重くなった場合

ダンプなどの重いdataをcommitした場合は重くなるので履歴から削除

git filter-branch --tree-filter 'rm -fr db/hoge_dump.tar.gz';

コミット処理を戻す

git revert [リビジョンid]

実行すると戻し修正されて、commitされるので注意。 (競合するとcommitはされない)

mergeコミット処理を戻す

git revert -m 1 [リビジョンid]
-m 1 はマージされた側のオプション(基本はこちらだと思う)
-m 2 はマージした側のオプション

ちなみにmerge部分を"-m"オプションを使わずに利用しようとするとエラーとなる

git revert  [リビジョンid]
error: Commit  [リビジョンid] is a merge but no -m option was given.

branchを指定してcloneする

git clone -b develop ssh://user1@localhost/var/git/project1.git project1

その時点のコミットハッシュのソースを取得

コミットハッシュを指定してブランチを作成

git checkout 1234123412341234123412341234123411234567 -b feature/newbranch1

ロールバック(ファイルも戻す)

git reset --hard [リビジョンid]

指定したリビジョンidが最後にコミットがされた状態まで全体ソースが戻る(ログも全て戻る)

(注)ロールバック前にpushしてしまっていると、ロールバック後にpushができなくなる(別ブランチに変えればpush出来る)

ロールバックで消えた部分はpushでリモート側へは渡されない。

ロールバック(ファイルは維持)

git reset --soft [リビジョンid]

指定したリビジョンIDが最後にコミットがされた状態までログが戻る(ソースは維持)

別ブランチ(同じブランチでもOK)のリビジョンを追加コミットする方法

git cherry-pick [リビジョンid]

過去dateでコミットが追加される

参考 https://teratail.com/questions/58184

コンフリクト解消ツール

git mergetool

真ん中がオリジナルファイルなのでそこを修正する

1つ前のコミットコメント修正

git commit --amend

エディタが開くのでそこで修正

既にpushしてあるコミットコメントを変更して再度pushすると以下のようなエラーが起こる

To hoge.org:hogehoge/testgroup.git
! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'git@hoge.org:hogehoge/testgroup.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

pullするとmergeログが残る。

だれも取り込んでないbranchであればリモートのbranchを消して再度pushすればmergeログが増えずに更新できる。

2つ以上前のコミットコメント修正

git rebase -i [1つ古いリビジョンid]

リビジョンidから現在までの一覧が以下記述とともにエディタで開く 以下のようにpickをeditに変更する

変更前

pick af2a169 dev_1
pick 15d2362 dev_2
pick 03565e8 dev_3

変更後

edit af2a169 dev_1
pick 15d2362 dev_2
pick 03565e8 dev_3

更新できたら

git commit --amend -m "コミットコメント" 

コミットできたら以下コマンドでコンソールを戻す

git rebase --continue

3つのコミットをまとめる

git rebase -i HEAD~3

以下のようにpickをsquashに変更する

変更前

pick d75ebc5 dev_4
pick 3c59fef dev_5
pick f387ef3 dev_6

変更後

pick d75ebc5 dev_4
squash 3c59fef dev_5
squash f387ef3 dev_6

コミット

git commit --amend

"Interactive rebase already started"エラーが出てしまうときは以下コマンドで取り消す

$ git rebase --abort

コミット内容を修正する

git rebase -i HEAD~3

以下のようにpickをsquashに変更する

変更前

pick d75ebc5 dev_4
pick 3c59fef dev_5
pick f387ef3 dev_6

変更後

edit d75ebc5 dev_4
pick 3c59fef dev_5
pick f387ef3 dev_6

変更ファイルを追加

git add hoge.txt

再度コミット

git commit --amend

コミットできたら以下コマンドでコンソールを戻す

git rebase --continue

gitログをツリーで表示

git log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'

gitログ検索

git log --stat -S hogehoge

全ての過去コミット一覧

git reflog 

rebaseやcherry-pickなどのログも表示される

プロジェクト内で別gitプロジェクト管理(submodule)

sampleprojectに別プロジェクト(samplelibrary)を追加

git clone --recursive git@hosting:[user1]/sampleproject.git 
git submodule add git@hosting:[user1]/samplelibrary.git
cd samplelibrary
git submodule init
git submodule update

改めて別の場所にcloneするとlibraryは取ってこれない・・・

git clone git@hosting:[user1]/sampleproject.git 

改めて別の場所に別プロジェクトごとcloneするときはrecursiveオプションを追加する

git clone --recursive git@hosting:[user1]/sampleproject.git

参考:https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

wip運用

  • 空でcommitできる
  • 作業前branchとしてcommitする
git commit --allow-empty -m "[WIP] 追加機能"

参考gitサイト

Gitでやらかした時に使える19個の奥義 http://qiita.com/muran001/items/dea2bbbaea1260098051