yuuho.wiki

カオスの欠片を集めて知恵の泉を作る

ユーザ用ツール

サイト用ツール


tips:git:start

Git

未整理

変更を無かったことにする

変更を加えたファイルを変更前に戻す

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として出る

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

コミットコメントの修正

コミットツリーを可視化する

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 は変更せずに二行目以降の picks(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

      で日付が変更なしにできる

マージコミットの取り消し

マージコミットや過去の複数のコミットを取り消すにはどうすればよいかという話。
コミット取り消しには resetrevert があるが、 基本的には 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

のコマンドを実行したときにコンフリクトというメッセージが表示されることがある。 各ファイルを開いてコンフリクトを解消したのち、addcommit をする。

git add -A
git commit -m "取り込み"

コマンド

add したものの確認

git diff --cached
tips/git/start.txt · 最終更新: 2025/06/23 19:31 by yuuho