目次
Git
未整理
- git addでステージングしたファイルをアンステージング(キャンセル)する
- 【Git】git管理下のファイルをリネームしたらdeletedとuntrackedの2つになってしまった時
変更を無かったことにする
変更を加えたファイルを変更前に戻す
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として出る
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
コミットコメントの修正
コミットツリーを可視化する
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をまとめる 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時刻を変更 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
