コンテンツにスキップ

Git

addを取り消し

1
git reset HEAD .

これだけだと add の状態しか取り消されない. 変更も取り消すならローカルの変更も取り消す.

Bitbucketでのブランチのリベース

  • devブランチにmainブランチの変更をリベースの形で導入したいとする.
  • devブランチをチェックアウトする
  • 左メニューのmainブランチを右クリックする
  • Rebase current changes onto mainを選択する
  • cf. 失敗したら項目「リベースを巻き戻す」を参考にリベースを巻き戻せばよい
    • git reflogからgit reset HEAD@{n} --hardを使う

cleanでの削除内容の確認

1
git clean -nX

diffツールの指定

  • URL
  • 例えばVSCodeを指定するには${HOME}/.gitconfigに次の通りに指定すればよい.
1
2
3
4
5
[diff]
    tool = default-difftool

[difftool "default-difftool"]
    cmd = code --wait --diff $LOCAL $REMOTE

commitを取り消し

1
git reset [<mode>] [<commit>] .

mode のデフォルトは --mixed. 変更したファイルも含めてすべて指定のコミット状態に戻したいときは --hard を指定する.

git archiveでコミット間差分のファイルをディレクトリ構造つきで取り出す

結論: git archive をよしなに使う

結論から言えば SourceTreeの使い方 | コミット間の差分ファイルの抽出 (カスタム操作を使う方法)の記述通りにやればいい. この記事では特に SourceTree を使っている. Linux だと直接的には使えないけれども, Linux を使っているくらいの強い人なら直接 git patch で対応するだろうから対象外とする. そもそも本質的には git archive を使う話でしかなく, 下記の Mac 版のスクリプト (にあるコマンド) を使えばいい.

時々ウェブ上で昔の, 特にお気に入りの記事が消えて悲しい思いをすることも多いので, 必要な範囲で転記する.

バッチファイル作成

Windows では次の通り.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
if "%2" EQU "" (
  set PARAM1=HEAD
  set PARAM2=%1
) else (
  set PARAM1=%1
  set PARAM2=%2
)

setlocal enabledelayedexpansion
set RET_DIR=
for /F "usebackq" %%i in (`git diff --name-only %PARAM1% %PARAM2%`) do (
  set RET_DIR=!RET_DIR! "%%i"
)

git archive --format=zip --prefix=archive/ %PARAM1% %RET_DIR% -o archive.zip

私個人としてはもう Mac は使っていないが, コマンドとして見やすいので置いておく.

1
2
3
4
5
6
#!/bin/sh
if [ "$2" = "" ]; then
    git archive --format=zip --prefix=archive/ HEAD `git diff --name-only HEAD $1` -o archive.zip
else
    git archive --format=zip --prefix=archive/ $1 `git diff --name-only $1 $2` -o archive.zip
fi

これを直接実行すれば Linux でも手法そのものは使える.

バッチファイルをカスタム操作として SourceTree へ登録

  • Win: メニューから「ツール」→「オプション」→「カスタム操作」タブ→「追加」ボタンをクリック
  • Mac: メニューから「SourceTree」→「環境設定」→「カスタムアクション」タブ→「追加」ボタンをクリック

「カスタム操作を編集」ウィンドウでの設定

  • メニュー表示名: 適当に設定 (ここでは「差分書き出し」とする)
  • 実行するスクリプト: 先程作ったスクリプトを指定
  • パラメーター: $SHA を設定

実行

  • 2 つコミットを選ぶ
  • 右クリックする
  • 「カスタム操作」から「差分書き出し」をクリック
  • リポジトリのトップディレクトリから zip を取ってくる

GitBucketでSSHが使えない:ssh-dss

  • MSYS2 で動かないとき:http://blog.tizen.moe/entry/2015/09/23/000000
    • これは何かうまくいかなかった
  • https://qiita.com/komacchi/items/88fb3d501b1a6d2db301
    • .netrc を使うか store (git config --global credential.helper store) を使うか。
    • オフィスの GitBucket+http では .netrc を使ってみた。

+BEGIN_EXAMPLE

machine repo.example.co.jp login username password mypassword

+END_EXAMPLE

GitHub Actionsにタスク登録

  • 参考など
  • リポジトリ直下に.github/workflows/deploy.ymlを作る
  • いろいろなサンプルをもとに適切に設定を書く

GitHub Actionsで環境変数を設定する

  • SettingsタブのSecurity > Secretsから設定する

GitHub ActionsでX serverにrsyncでリリースする

1
ssh-keygen -f ~/.ssh/id_rsa_xserv_no_pass -t rsa -N ""
  • X serverのサーバーパネルから公開鍵を登録する
    • 改行区切りで複数の鍵が登録できる
  • あとは上記資料, 特に前者に沿って設定する

GitHubでフォークしたリポジトリを本家に追従させる

  • git remote add upstream git://github.com/some-author/some-repo.git
  • git branch -aupsteramがあるか確認
  • git fetch upstream
  • git checkout main
  • git merge upstream/main

GitHubで.env(の情報)を使いたい

  • 参考
  • GitHubのリポジトリのSettingsタブに移動する
  • 左メニューのSecurity > Secretsを開く
  • 環境変数を設定する
  • プロジェクトの.github/workflows/main.ymlに次のようにenvを追記する
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
name: Node.js NX CI
on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
env:
  NEXT_PUBLIC_APP_ID: ${{secrets.NEXT_PUBLIC_APP_ID}}
  NEXT_PUBLIC_AUTH_DOMAIN: ${{secrets.NEXT_PUBLIC_AUTH_DOMAIN}}
  NEXT_PUBLIC_FIREBASE_API_KEY: ${{secrets.NEXT_PUBLIC_FIREBASE_API_KEY}}
  NEXT_PUBLIC_MEASUREMENT_ID: ${{secrets.NEXT_PUBLIC_MEASUREMENT_ID}}
  NEXT_PUBLIC_MESSAGING_SENDER_ID: ${{secrets.NEXT_PUBLIC_MESSAGING_SENDER_ID}}
  NEXT_PUBLIC_PROJECT_ID: ${{secrets.NEXT_PUBLIC_PROJECT_ID}}
  NEXT_PUBLIC_STORAGE_BUCKET: ${{secrets.NEXT_PUBLIC_STORAGE_BUCKET}}

jobs:
  some-data

GitHubのトークン認証

  • Settingsを開く
  • 左メニューのDeveloper settingsをクリック
  • 左サイドバーからPersonal access tokensをクリック
  • 適当に認可を与える
  • 生成されたトークンをコピー
  • Ideaを開く
  • Preferencesを開く
  • Version Control > GitHubを開く
  • +アイコンからアカウント・トークンを指定する

ignoreされたファイルの確認

1
git status --ignored

pullするリモートのデフォルトブランチを変える

1
git push -u remote master

Sourcetreeでforce push

  • URL
  • Preferenceの言語選択で英語にする
  • 再起動して英語化を確認する
  • Preferenceの右のAdvancedを確認する
  • force pushの設定をつける
  • pushのモーダルでforce pushにチェックする

Sourcetreeで外部diffツールにvscodeを指定する

  • URL
  • 設定で外部diffツールに/usr/local/bin/code --wait --diff $LOCAL $REMOTEを指定する
    • /usr/local/bin/codeは適切なパスを指定する

エイリアスの指定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
git config --global alias.st status
git config --global alias.stt status -uno
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.df diff
git config --global alias.dff "diff --word-diff --ignore-all-space"
git config --global alias.gr grep
git config --global alias.l  "log --decorate --oneline"
git config --global alias.ls "log --decorate --oneline --stat"
git config --global alias.lg "log --decorate --oneline --graph"
git config --global alias.unstage "reset HEAD --"
git config --global alias.cancel  "reset --soft HEAD^"
git config --global alias.graph "log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'"

エイリアス設定確認

1
git config --global --list | grep ^alias\.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
git config --global --list | grep ^alias\.
alias.co=checkout
alias.st=status
alias.br=branch
alias.cm=commit
alias.df=diff
alias.gr=grep
alias.stt=status
alias.dff=diff --word-diff --ignore-all-space
Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
alias.l=log --decorate --oneline
alias.ls=log --decorate --oneline --stat
alias.lg=log --decorate --oneline --graph
alias.unstage=reset HEAD --
alias.cancel=reset --soft HEAD^

過去コミットに戻す

1
git checkout commit-name

過去コミットのAuthorとCommitterを一括変更する

1
2
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='{{USERNAME}}'; GIT_AUTHOR_EMAIL='{{sample@example.com}}'; GIT_COMMITTER_NAME='{{USERNAME}}'; GIT_COMMITTER_EMAIL='{{sample@example.com}}';" HEAD
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='phasetr'; GIT_AUTHOR_EMAIL='phasetr@gmail.com'; GIT_COMMITTER_NAME='phasetr'; GIT_COMMITTER_EMAIL='phasetr@gmail.com';" HEAD

空コミットを作る

1
git commit --allow-empty -m "Init"

設定確認

1
git config --global --list
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
git config --global --list
push.default=simple
user.name=y.sekine
user.email=sekine@suri.co.jp
commit.template=c:\Users\y.sekine\.gitmessage
http.sslverify=false
core.excludesfile=C:\Users\y.sekine\.gitignore_global
core.autocrlf=false
core.quotepath=false
LOCAL" "$REMOTE"
alias.co=checkout
alias.st=status
alias.br=branch
alias.cm=commit
alias.df=diff
alias.gr=grep
alias.stt=status
alias.dff=diff --word-diff --ignore-all-space
Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
alias.l=log --decorate --oneline
alias.ls=log --decorate --oneline --stat
alias.lg=log --decorate --oneline --graph
alias.unstage=reset HEAD --
alias.cancel=reset --soft HEAD^

プッシュ先の設定

1
git push -u origin master

プロジェクトごとのユーザー指定

  • .git/configに次のように書く.
1
2
3
[user]
    email = phasetr@gmail.com
    name = phasetr@gmail.com
  • 次のコマンドを発行してもよい.
1
2
git config --local user.name "phasetr@gmail.com"
git config --local user.email "phasetr@gmail.com"

別の鍵・アカウントでプッシュ

1
2
mv ~/.ssh
ssh-keygen -t rsa -f id_rsa_pt_github
  • 該当プロジェクトに移動して.git/configを変更
1
2
3
4
5
6
7
8
9
cd /path/to/proj

[user]
    email = phasetr@gmail.com
    name = phasetr

[remote "origin"]
    url = git@github.com.pt:phasetr/AlgorithmsAndDataStructureByFSharp.git
    fetch = +refs/heads/*:refs/remotes/origin/*
  • 上記のurlの箇所, 「git@github.com.pt」の@以下がポイント
  • ~/.ssh/configに追記
1
2
3
4
5
Host github.com.pt
  User git
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_pt_github
  IdentitiesOnly yes

マージコミットのリバート

基本

次のコマンドを実行する.

1
git revert -m [親番号] [コミットハッシュ]

確認コマンドは次の通り.

1
git show

間違った場合は次のコマンドを実行.

1
2
3
git reset --hard HEAD~

git revert -m 2 f60f24d

参考: -m, --mainline

この-m--mainlineの略でparent-numberを指定する. 基本的に12を指定する. git showをした時に次のように出る.

1
2
3
$ git show f60f24d
commit f60f24d34845fba4e038b3e165f74973b3a19580
Merge: 049d32b ebbcb6a

1049d32b, 2ebbcb6a.

マージミス・リベースミスで失ったコミットの復旧法

状況

  • ブランチなしの状態でコミットしてしまったときの対処
    • 例えば次のようなメッセージが出て, しかもそのままでマージミスしてほしいコミットを失ったとき.
    • 実例
      • あるマシンで作業中に他のマシンでコミット・プッシュを忘れたことに気付く
      • 他のマシンを立ち上げてコミット・プッシュ
      • 作業中のマシンでpullしたらコンフリクト
      • 適当にコミットしたら作業中の内容が消えてしまった

メッセージ

1
2
3
4
5
6
[detached HEAD dbe8abd9] Improved in my pc
 4 files changed, 295 insertions(+), 3 deletions(-)

HOME pull
You are not currently on a branch.
Please specify which branch you want to rebase against.

対処法

  • 上記メッセージのように「detached HEAD hoge」と出ているはずなので, hogeの部分のコミットIDを何とかして探す
    • ターミナルを落としていたりマシンを落としていたら, git reflogでがんばって探す
    • 直近コミットのはずなので希望を失わないこと
  • git merge <探したコミットID>で消失分をマージする
  • 復旧!

無視されているファイル一覧

1
git status --ignored

リポジトリの移行 git mirror

+BEGIN_EXAMPLE

git clone --mirror cd git push --mirror

+END_EXAMPLE

リベースを巻き戻す

  • 参考
  • git reflogでリベース前のコミットを参照
  • HEAD@{n}で対応操作を指定する形でgit reset HEAD@{n} --hardとして巻き戻す

リモートからのcheckout

1
checkout feature/Billing.Payment.Import

リモートで消されたブランチを消す

1
2
git fetch --prune
git remote prune origin

リモートの追加

1
git remote add 追加名 追加したいリポジトリ

リモートの削除

1
git remote rm リモート名

リモートブランチの取得

1
2
3
git fetch origin branch-name
git branch -r
git checkout branch-name

リモートリポジトリの追加

1
2
git remote add <RemoteRepositoryName> <RemoteRepositoryURL>
git remote add bb git@bitbucket.org:phasetr/reponame.git

ローカルの変更取り消し

svn でいう revert. どうしても svn のときの言葉の癖が抜けないので自分用に記録.

1
git checkout .

新規追加したファイルまで消したければ次の通り.

1
git clean -df .

ログ

1
git log -2 --stat
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
git log -2 --stat
commit 567ed0a9617e7d94c214b44b4d50ac16e2fa441d
Date:   Tue Dec 26 13:52:44 2017 +0900

    Improved in my pc

 math_expedition.org | 508 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 288 insertions(+), 220 deletions(-)

commit 1ffdc3d6f6c59fb89233ccd978ff1bd8b6fd1a30
Date:   Tue Dec 26 11:58:58 2017 +0900

    Improved in my pc

 office/work.org | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tips.org        |   4 +-
 2 files changed, 174 insertions(+), 1 deletion(-)

ログ 1行表示

1
git log -2 --oneline
1
2
3
: git log -2 --oneline
: 567ed0a9 Improved in my pc
: 1ffdc3d6 Improved in my pc

ログ commitをアスキーグラフで表示

1
git log -2 --graph
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git log -2 --graph
 * commit 567ed0a9617e7d94c214b44b4d50ac16e2fa441d
| Date:   Tue Dec 26 13:52:44 2017 +0900
|
|     Improved in my pc
|
 * commit 1ffdc3d6f6c59fb89233ccd978ff1bd8b6fd1a30
| Date:   Tue Dec 26 11:58:58 2017 +0900
|
|     Improved in my pc

ログ 各コミットの差分(変更点)を表示

1
git log -5 -p

ログ 指定した数だけの最近のコミットを表示

1
git log -2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git log -2
commit 567ed0a9617e7d94c214b44b4d50ac16e2fa441d
Date:   Tue Dec 26 13:52:44 2017 +0900

    Improved in my pc

commit 1ffdc3d6f6c59fb89233ccd978ff1bd8b6fd1a30
Date:   Tue Dec 26 11:58:58 2017 +0900

    Improved in my pc