====== Git ======
=== 未整理 ===
* git addでステージングしたファイルをアンステージング(キャンセル)する
* https://mrgoofy.hatenablog.com/entry/20100910/1284068244
* 【Git】git管理下のファイルをリネームしたらdeletedとuntrackedの2つになってしまった時
* https://qiita.com/arubaito/items/952cfdfa048980c88562
=== 変更を無かったことにする ===
変更を加えたファイルを変更前に戻す
git reset --hard HEAD
追跡していないファイルを一括で削除できる.
git clean [-d] -n # 削除対象の確認
git clean -f # 削除実行
git clean -df # ディレクトリも含めて削除
=== GitHubに登録している鍵の把握 ===
https://github.com/${USERNAME}.keys
==== git diff ====
* workdir (現在の状態)
* staging (add)
* repository (commit)
* git diff は workdir と staging の比較。\\
* git diff --cached または git diff --staged は repository と staging の比較。
見やすさのために
git diff --stat
==== コミットを作らず差分の共有をする ====
# パッチファイルを作るとき(working vs staging)
git diff > hoge.patch
## ↑は staging と workingdir の比較
## 前回 commit と workingdir を比較する場合は
git diff HEAD > hoge.patch
# パッチを適用するとき(コミットを作らず working に展開)
git --git-dir= apply -p1 hoge.patch
# または
patch -p1 < hoge.patch
# パッチを戻すときは
git --git-dir= apply -R -p1 hoge.patch
## というように -R オプションを付ければよい。
特定のディレクトリ以下について調べる場合は ''git diff --relative=hogedir'' で指定。
patch も base64 で共有するのが良いかも。空白などの情報が大切みたい。
==== bundle を使ってコミットを共有する ====
以下のような流れで実行する
* 最初に現在の状態を bundle にする。 git bundle create v00_first.bundle master
* 他の環境で bundle を復元 git clone v00_first.bundle repo_name
* 場合によっては ディレクトリに入ってから ''git pull origin master'' しないといけない?
* 作業している環境で新しいコミットを作る git add hogehoge
git commit -m "hogehoge"
* 差分だけを bundle 化。git bundle create v01_diff.bundle HEAD~1..HEAD
* 別環境で差分 bundle を pull git remote add diff_commit /path/to/v01_diff.bundle
git pull diff_commit HEAD
==== タグ ====
=== タグ付け ===
git tagを付けるとgithubではReleaseとして出る
[[https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08|tagの付け方]]
''git tag -a v0.0.5 -m "version up" コミットハッシュ''して''git push origin v0.0.5''すると反映される.
=== タグ削除 ===
git tag -d TAGNAME
git push origin :TAGNAME
==== その他 ====
=== ブランチの削除 ===
マージ済みコミットとかは残してブランチ名だけ削除してやる.
| ローカルブランチ | ''git branch -D foo'' |
| リモートブランチ | ''git push origin :foo'' |
| リモート追跡ブランチ | ''git branch -d -r bar-remote/foo-branch'' |
=== 空のコミット ===
リポジトリの最初のコミットを空にしておくと何かと便利だったりする.
git commit --allow-empty -m "empty commit"
=== コミット取り消し ===
何も考えずに ''git add -A; git commit -m "save"'' してしまったとき,
稀に画像などを入れてしまうことがある.
git reset --soft HEAD^
でcommitコマンドを無かったことにする.
* ''%%-%%-soft'' はコミットだけ取り消し(HEAD)、 add したということ(インデックス)は残る。
* ''%%-%%-mixed'' にすると addしたということも取り消せる。\\ vscode の色付けは add した/していないで決まるので add していない状態の方が嬉しかったりする。
* ''%%-%%-hard'' にするとディレクトリの中身まで前のコミットの状態に戻ってしまう。前回のコミットからの作業内容が消える。
=== 強制push ===
コミットを push してから取り消したくなったとき、前述のコミット取り消しをしたあと、
git push origin +master というように ''+'' を付けて push する
=== 強制pull ===
git fetch
git reset --hard origin/master
=== remote のURL確認 ===
git config --get remote.origin.url
=== コミットコメントの修正 ===
[[https://www.granfairs.com/blog/staff/git-commit-fix]]
=== コミットツリーを可視化する ===
git log -a --graph --oneline --decorate=full
===== 基本 =====
==== gitの設定 ====
=== 階級と設定場所 ===
Linux の場合
^ 階級 ^ 設定ファイル場所 ^ メモ ^
| system | ''/etc/gitconfig'' | 使わないこと推奨 |
| global | ''~/.gitconfig'' (''~/.config/git/config'') | ユーザーごとに |
| local | ''.git/config'' | リポジトリごとに |
=== コマンドを使って設定する ===
以下のように設定する.
git config --<階級> hoge.fuga.piyo <設定値>
設定可能な値の詳しいドキュメントは [[http://git-scm.com/docs/git-config.html]] にあるが,多すぎるので割愛.
=== 設定を確認する ===
git config --get hoge.fuga.piyo
=== 設定を消す ===
git config --unset hoge.fuga.piyo
=== よく使う設定値 ===
^ 名前 ^ 値 ^ メモ ^
| ''core.editor'' | ''vim'' | エディタ |
| ''remote.origin.url'' | | リポジトリのURL |
| ''user.name'' | | |
| ''user.email'' | | |
==== 歴史改変 ====
* rebaseでcommitをまとめる [[https://qiita.com/KTakata/items/d33185fc0457c08654a5|Qiita]]
* git rebase -i HEAD~<個数>
* エディタが開くので、一番上の ''pick'' は変更せずに二行目以降の ''pick'' を ''s''(squash) にする。すると指定した中で一番古いコミットに中身がまとめられる
* 次にもう一度エディタが開いてコミットメッセージを決めるやつが出てくるので全部消して適当なコメントを書く
* push は強制で git push -f origin master
* pull する側も git fetch
git reset --hard origin/master
* rebaseでcommit時刻を変更 [[https://qiita.com/wMETAw/items/8444bba258083bd678c8|Qiita]]
* git log --pretty=fuller で author date, commit date を確認
* git rebase -i HEAD~<個数>
* エディタが開くので編集したいものを ''pick'' から ''edit'' にして閉じる.
* git commit --amend --date="Thu Feb 18 17:50:00 2021 +0900" とコマンドを打つ
* 再度エディタが開く.何もせず閉じれば良い
* 謎のブランチに飛ばされている
* git rebase --continue でブランチは元に戻る
* git rebase HEAD~<個数> --committer-date-is-author-date でcommit dateにも日付が適用される
* 歴史が書き換わっている
* 過去のコメントの変更
* git rebase -i HEAD~3
* 変えたい行の先頭を ''pick'' から ''edit'' に変更
* git commit --amend -m "新しいコメント"
* git rebase --continue
* その後git rebase HEAD~<個数> --committer-date-is-author-date で日付が変更なしにできる
=== マージコミットの取り消し ===
マージコミットや過去の複数のコミットを取り消すにはどうすればよいかという話。\\
コミット取り消しには ''reset'' と ''revert'' があるが、
基本的には revert が推奨らしい。ただし、reset のほうが考えることが少なくて便利。
また、マージコミットについては、revert で取り消すのはとても大変なので、
reset するべし。
==== branch を扱う ====
とりあえず dev ブランチを作成して、そこに色々とコミットしていく。
一人で開発していると dev ブランチ開発中に master が進むことはほぼないと思うので
普通にマージすると Fast-Forward マージされて dev ブランチが消えてしまう。
なので強制的にマージコミットを作成してやる必要がある。
git checkout master
git merge --no-ff dev
git push origin master
マージしてしまえばブランチは消してしまって構わない。リモートのとローカルのものを消す。
git push --delete origin dev
git branch --delete dev
=== コンフリクトした場合 ===
git merge のコマンドを実行したときにコンフリクトというメッセージが表示されることがある。
各ファイルを開いてコンフリクトを解消したのち、''add'' と ''commit'' をする。
git add -A
git commit -m "取り込み"
===== コマンド =====
==== add したものの確認 ====
git diff --cached