Git

addを取り消し

git reset HEAD .

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

cleanでの削除内容の確認

+BEGIN_SRC sh :results output

git clean -nX

+END_SRC

commitを取り消し

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

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

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

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

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

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

バッチファイル作成

Windows では次の通り.

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 は使っていないが, コマンドとして見やすいので置いておく.

#!/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 へ登録

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

実行

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

+BEGIN_EXAMPLE

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

+END_EXAMPLE

GitHub Actionsにタスク登録

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

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

ssh-keygen -f ~/.ssh/id_rsa_xserv_no_pass -t rsa -N ""

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

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

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のトークン認証

ignoreされたファイルの確認

git status --ignored

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

git push -u remote master

Sourcetreeでforce push

エイリアスの指定

+BEGIN_SRC sh :results output :session sh1

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'"

+END_SRC

エイリアス設定確認

+BEGIN_SRC sh :results output :session sh1

git config --global --list | grep ^alias.

+END_SRC

+RESULTS:

+begin_example

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^

+end_example

過去コミットに戻す

git checkout commit-name

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

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

空コミットを作る

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

設定確認

+BEGIN_SRC sh :results output :session sh1

git config --global --list

+END_SRC

+RESULTS:

+begin_example

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^

+end_example

プッシュ先の設定

git push -u origin master

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

[user]
    email = phasetr@gmail.com
    name = phasetr@gmail.com
git config --local user.name "phasetr@gmail.com"
git config --local user.email "phasetr@gmail.com"

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

mv ~/.ssh
ssh-keygen -t rsa -f id_rsa_pt_github
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/*
Host github.com.pt
  User git
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_pt_github
  IdentitiesOnly yes

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

基本

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

+BEGIN_SRC sh :results output :session sh1

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

+END_SRC

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

+BEGIN_SRC sh :results output :session sh1

git show

+END_SRC

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

+BEGIN_SRC sh :results output :session sh1

git reset --hard HEAD~

git revert -m 2 f60f24d

+END_SRC

参考: -m, --mainline

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

+BEGIN_SRC sh

$ git show f60f24d commit f60f24d34845fba4e038b3e165f74973b3a19580 Merge: 049d32b ebbcb6a

+END_SRC

1049d32b, 2ebbcb6a.

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

状況

メッセージ

[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.

対処法

リポジトリの移行 git mirror

+BEGIN_EXAMPLE

git clone --mirror cd git push --mirror

+END_EXAMPLE

リモートからのcheckout

+BEGIN_SRC sh :results output :session sh1

checkout feature/Billing.Payment.Import

+END_SRC

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

git fetch --prune
git remote prune origin

リモートの追加

+BEGIN_SRC sh :results output :session s1

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

+END_SRC

リモートの削除

+BEGIN_SRC sh :results output :session s1

git remote rm リモート名

+END_SRC

リモートブランチの取得

git fetch origin branch-name
git branch -r
git checkout branch-name

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

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

ローカルの変更取り消し

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

git checkout .

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

git clean -df .

ログ

+BEGIN_SRC sh :results output :session sh1

git log -2 --stat

+END_SRC

+RESULTS:

+begin_example

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(-)

+end_example

ログ 1行表示

+BEGIN_SRC sh :results output :session sh1

git log -2 --oneline

+END_SRC

+RESULTS:

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

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

+BEGIN_SRC sh :results output :session sh1

git log -2 --graph

+END_SRC

+RESULTS:

+begin_example

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

+end_example

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

+BEGIN_SRC sh :results output :session sh1

git log -5 -p

+END_SRC

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

+BEGIN_SRC sh :results output :session sh1

git log -2

+END_SRC

+RESULTS:

+begin_example

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

+end_example