git †
変更点を戻す †
grep: リポジトリ内の検索 †
pre-commit/post-commit: コミット前後に処理を入れる †
git daemon: ローカルフォルダをgit remoteとして設定する †
ファイル名の一括置換 †
- renameコマンドが簡単だが、gitの管理外になって、rename扱いではなくなる。
switch/restore: checkoutの代わり †
- switch
- ブランチの切替。-cで新規branch作成。「git checkout -b new-branch」相当
git switch -c new-branch
- restore
- カレントフォルダの変更点を戻す。「git checkout .」相当
git restore .
容量の大きいリポジトリをなるべく小さく取得 †
バージョン番号のtagを降順に表示 †
x.y.zで区切られたタグをバージョンの降順に表示したい。
指定行がいつ削除されたかを探す †
削除されたファイルを探す †
リポジトリのメンテナンス/軽量化 †
- 「.git/objects/」が肥大化し、git cloneが遅くなる。
- ソースがあれば再生成できるファイル(*.rpm, *.lib, *.jar等)は、GitHubのreleaseページに添付した方が良い。
BFG Repo-Cleanerで履歴を削除 †
- BFG Repo-Cleaner by rtyley
- java製
- git filter-branchより高速。ただし、細かい指定はできない。
- ファイルサイズ、ワイルドカード("*.rpm")、ファイル名を指定して履歴から消すには便利
- 「git filter-branch」で消したはずのファイルでもこちらを使うとまだヒットし、削除するとrepoサイズは縮小したので良いと思う。
git filter-branch 履歴から削除 †
sparse checkout: 部分チェックアウト †
git cloneはremoteと同じリポジトリを全てチェックアウトするため、巨大なリポジトリだと遅い。
- 絶対に変更したくないディレクトリがある場合等。
- git v1.7以降で利用可能
- 時間:
項目 | サイズ | 秒数 |
repo全体 | 120MB | 27 |
一部分 | 60MB | 17 |
merge済みbranchの一括削除 †
- 「~/.gitconfig」に追加
[fetch]
prune = true
または
Gitea: 1バイナリ動作のGitHub風サーバ †
- Gitea
- golang製。
- MySQLを使う。
- httpサーバは内蔵。httpsは非対応なので、nginxやapacheでリバースプロキシを構築する必要あり。
branchやtagをソートして表示 †
- git v2.7以降で「--sort=key」オプションが使える。
- committerdate: コミットした日付
- taggerdate: タグを打った日付。なぜか順序が変だった。
- 「-key」で降順。
gc: ガベージコレクタの実行 †
時々自動で実行されるが、手動で実行したい時。
git gc --auto
バックアップ/リストア †
log: ログの表示 †
add: †
- カレントディレクトリで追加してないファイルを一括で追加
git add .
rebase: †
作業ブランチで開発中に、先に進んだmasterからの差分に変えたい時。
git co working_branch
# origin masterが先に進んだ場合、そこまでbaseを進める
git pull --rebase origin master
# コンフリクトした場合、ファイルを修正してadd
git add path/to/file
git rebase --continue
git push origin working_branch
fixup: 複数コミットを一つにまとめる †
例:
- 作業ブランチには複数のコミットがあるが、PRにまとめる時に一つのコミットにしたい。
git co -b work
# 作業コミット
# commit1にまとめたい場合、commit2〜3のpickをfixupに変えて保存。コメントの変更は反映されない。
git rebase -i origin/master
--
pick 98c99fe commit1
fixup c4599fe commit2
fixup ecd0587 commit3
--
- 中止したい場合「git rebase --abort」
- コメントを変更したい場合、rebase後、 「--amend」で変更可能
subversionからの移行 †
- localのsubversionリポジトリから、localのgitリポジトリへ移行
- subversion-1.9.9-1.x86_64
- git-1.8.3.1-14.el7_5.x86_64
- subversionリポジトリサイズ: 507MB
- 移行後のgitリポジトリサイズ: 519MB
- 処理時間: 約17分
sudo yum install git git-svn
SVN_REPO=example
SVN_REPO_PATH=file:///var/www/svn/$SVN_REPO/
mkdir $SVN_REPO
cd $SVN_REPO/
git svn init -s --prefix=svn/ $SVN_REPO_PATH
time git svn fetch
削除し忘れたlocal branchの処理 †
local branchが必要なのか分からなくなった場合。
ファイル/ディレクトリの変更差分を全て表示 †
git log -p <file or directory>
show: 指定コミット内容表示 †
SSL connect error †
reflog: やりすぎたresetや削除したbranchを戻す †
reset --hardをやりすぎた時に戻す。
削除したbranchを戻す。
ただし、コミットしてないファイルは戻ってこない。
書籍 †
.gitignore 特定パターンを無視 †
.gitignore に入れたパターンは「git status」等で差分として表示されなくなる
親フォルダにまとめて記載しておけば、子フォルダにも適用される。
# vimの作業ファイル
*.swp
# subversionのディレクトリ
.svn/
# macOSの不要ファイル
.DS_Store
# windowsの不要ファイル
Thumbs.db
# ansibleのリトライファイル
*.retry
間違ったmergeを取り消す †
- Git-flowって何? - Qiita
- 通常:developブランチからreleaseブランチを作る。「git co -b release/1.10」
- 誤り:developブランチをreleaseブランチへマージする。「git merge release/1.10」
- 誤り:developブランチをdevelopブランチへマージする。「git merge develop」
- 修正: release/1.10へのマージ「a1234567」 が間違っているので、「a1234567」 を取り消す
# git log --graph で誤り前のコミットidを探す。この例では「aa123456」とする
git reset aa123456 --hard
# treeを見て間違ったマージより先に取り込みたいコミットがあれば、cherry-pickやmergeで取り込む
git cherry-pick <commid it>
git merge <commid it>
# force pushで強制的に修正
git push -f origin release/1.10
--force-with-lease: -fの代わりに使う †
作業ブランチでrebase後、pushしたい時など。
- git push --force
- ローカルリポジトリでリモートリポジトリを上書きする
- git push --force-with-lease
- git v1.8.3.1では非対応。v2.16.5では使えた。
- localブランチと、remoteブランチを比較して、remoteが新しい場合は失敗する。
- 自分の修正後に、他人がpushしていたら「--force」を使うしかない
fatal: Not possible to fast-forward, aborting. †
- --force-with-leaseしたブランチを他PCや他人がpullすると発生する。
authorを後から変更 †
git commit --amend --author="user <user@example.com>"
パーミッション変更を無視する †
Linuxで開発しているリポジトリをWindowsでcloneして編集しようとすると、パーミッションの違いが検出されて邪魔な時がある。
git config core.filemode false
# 確認
git config -l | grep core.filemode
空白を無視して比較 †
- diff
diff -uw file-a file b
- git (-b でインデントを無視)
git diff -w
- GitHub: URLの末尾に「?w=1」を付ける
- BitBucket: URLの末尾に「?w=1」を付ける
- または「・・・」をクリックして「ignore whitespace」にチェック
git-secrets: AWSキー等をgithubに流出するのを防ぐ †
うっかりAWSキー等がgithubに流出している事故が多い。
(実際に流出するとAWSからメールが来て、AWSアカウントが制限状態になる。該当キーを削除するまで続く)
merge: マージ †
- マージする履歴を残す (--no-ff)
git merge --no-ff topic
リモートブランチとローカルブランチを強制的に一致させる †
git-flow †
CentOS6.xにgit v2.xをインストール †
- iusのミラーが変わったので、古いrepoの削除が必要
CentOS6.xにgit v1.7.2をインストール †
- CentOS6.x baseリポジトリだとgit v1.7.1がインストールされる
- rpmforge リポジトリを使えるようにする
- インストール
sudo yum install --enablerepo=rpmforge-extras git
git --version
git version 1.7.12.4
gitの設定を表示 †
- gitコマンドで取得
git config -l --global
- catでも同じ
cat ~/.gitconfig
git bisect: 二分探索によって問題箇所を特定する †
subtree: 外部リポジトリを取り込む †
- subtree
- リモートブランチとして、repoを追加する
- 複数のrepoを跨いで、更新する用途向き
- 参照元repoでgit pullするだけで、参照先repoもfetchされる
- submodule
- 特定のcommit idを参照する。
- .gitmodules で管理される
- 完全にリポジトリを分けて管理したい用途
- 参照元repoでgit pullでは、参照先repoはfetchされない(commit idが変わらない)。
submodule: 外部リポジトリを取り込む †
Mac OS Xにgitクライアントのインストール †
- git−1.7.2.2-intel.leopard.pkg を実行
- ターミナルからパスを通すスクリプトを実行
./setup\ git\ PATH\ for\ non-terminal\ programs.sh
- ターミナルの再起動。gitコマンドで使えるか確認
空ディレクトリをgitに入れる †
そのままだと管理されないので".gitkeep"ファイルを入れる
mkdir dummy
touch dummy/.gitkeep
git add dummy
work flow: ワークフロー †
リモートで削除されたブランチをローカルから削除 †
git fetch --prune origin
tag: 別名を付ける †
- コミットに別名を付ける release/1.00 等
- tagを指定してチェックアウトが可能
- tag自体はバージョン管理されない
cherry-pick: 特定のコミットだけを適用する †
cherry-pick中止 †
- 中止
git cherry-pick --abort
範囲を指定してcherry-pick †
リモートリポジトリのURLを変更したい場合 †
git remote -v
git remote set-url origin <新しいリポジトリのURL>
bash用コマンド補完とプロンプトにブランチを表示 †
- git [tabキー] または git log [tabキー]等でコマンドが補完できるようになる
- 現在のブランチをプロンプトに表示 [host@user:path (branch)]
- 以下を ~/.bashrc や ~/.bash.d/に追加
- 90-bash_completion.sh
if [[ -f /etc/bash_completion ]]; then
# RHEL/CentOS 6, Ubuntu 12.04 LTS
. /etc/bash_completion
elif [[ -f /etc/profile.d/bash_completion.sh ]]; then
# RHEL/CentOS 7
[ -n "$BASH_COMPLETION" ] || BASH_COMPLETION=/etc/bash_completion
[ -n "$BASH_COMPLETION_DIR" ] || BASH_COMPLETION_DIR=/etc/bash_completion.d
[ -n "$BASH_COMPLETION_COMPAT_DIR" ] || BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
elif [[ -f /usr/local/etc/bash_completion ]]; then
# macOS: brew
. /usr/local/etc/bash_completion
[ -n "$BASH_COMPLETION" ] || BASH_COMPLETION=/usr/local/etc/bash_completion
[ -n "$BASH_COMPLETION_DIR" ] || BASH_COMPLETION_DIR=/usr/local/etc/bash_completion.d
[ -n "$BASH_COMPLETION_COMPAT_DIR" ] || BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
fi
GUIクライアント †
- Github for Windows
- msysGit ベース
- Git Shellもインストールされる
- シェルを複数から選べる。tools > option > default shell: Cmd, Git Bash, PowerShell, Custom
- 英語UIのみ
改行コードの自動変換を止める †
git for windowsではデフォルトで、改行コードの自動変換される。
- チェックアウト時:LFをCRLFへ変換
- コミット時:CRLFをLFへ変換
vi ~/.gitconfig
----
[core]
autoCRLF = false
----
reset:取り消し †
diff:差分 †
- 直前の差分を表示
git diff HEAD^ .
- 単語単位で差分表示
git diff --word-diff
branch:ブランチ †
- ローカルとリモートのブランチ一覧
git branch -a
- 現在のローカルブランチをリモートへpush
git push -u origin HEAD
patchコマンド用diffファイルの作成 †
git diff --no-prefix HEAD~ > hoge.patch
patch --dry-run -p0 < hoge.patch
patch -p0 < hoge.patch
untracked filesもstashする †
- untracked filesもstashする
git stash -u
stash:変更を一時的に待避 †
brame:誰が行を変更したのかを探す †
- file.txtの5行目を誰が変更したかを見る
git blame -L 5 file.txt
d23bebd3 (username 2013-01-02 10:54:57 +0900 5) 05 change
# 5-6行目を誰が変更したかを見る。オフセット指定もできる。-L 5,+1
git blame -L 5,6 file.txt
d23bebd3 (username 2013-01-02 10:54:57 +0900 5) 05 change
469dbe58 (username 2013-01-02 11:04:25 +0900 6) 06 change
.gitconfig †
fatal: The remote end hung up unexpectedly †
公開鍵(~/.ssh/id_rsa.pub)/秘密鍵(~/.ssh/id_rsa)が無いと起きる
svn exportと同様に使う †
origin等の別名をつける †
よくoriginやmasterといった名前が出てくるが、これは".git/config" に記載があるため。
直接編集しても結果は同じ