git version
git version 2.21.1 (Apple Git-122.3)
brew install git
以下でローカルフォルダにgitのローカルプロジェクトが作成される
git init
git add .
git commit -m 'first create'
ローカルで、画面に表示される以下のコマンドを実行すればよい
git remote add origin https://github.com/[ユーザ名]]/[プロジェクト名].git
git branch -M main # ←ブランチ名をmainに変更
git push -u origin main
git init
git remote add origin https://~.git
git fetch
git reset --hard origin/main # 強制的にリモートブランチの最新のコミット状態にリセットする
git pull origin develop
git pullではなくgit cloneすることで、自動的にgit remote add originされたことになり、接続が生成される
git clone -b [branch name] [url]
プロジェクト名と異なるフォルダ名にしたいときは、
git clone -b [branch name] [url] [folder name]
とする
git remote -v
git branch
git branch -r
git branch [ブランチ名]
git commit -a
release-1.39のブランチからmasterに切り替える(masterに最新化する)場合
git checkout master
git checkout -b ローカルブランチ名 origin/リモートブランチ名
git branch -d [ブランチ名]
github上でpull requestして、開発ブランチからステージブランチにマージしたりするが、コンフリクトするファイルがあると調整する必要がある。
feature/1からdevelopブランチにマージする手順
git checkout develop # developに移動
git pull origin develop # developブランチを最新にする
git checkout feature/1 # feature/1に移動
git merge develop # developをfeature/1にマージする...このあとコンフリクトを解消する作業を行う
git push origin feature/1 # feature/1をリモートにプッシュする
つまり、pull requestでdevelopとfeature/1を同期させた上でdevelopにマージするために、まずはfeature/1に対してdevelopを適用する必要がある
git merge --abort
git diff
git diff --staged
# または
git diff --cached
git diff path/to/file
git diff --staged path/to/file
# 現在ブランチと別ブランチ
git diff <other-branch-name>..HEAD
# ファイル名のみ
git diff --name-only <other-branch-name>..HEAD
# ブランチ同士
git diff <branch-b>..<branch-a>
# 別ブランチの1つ前のコミットと現在のHEADの差分
git diff <other-branch-name>^..HEAD
git status -v
(各ファイルの diff が短く表示される)
別ブランチの同一ファイルをビジュアルに比較できるツール
git config --global diff.tool vscode
git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
git difftool ブランチ1 ブランチ2 -- path/to/file
git cherry-pick [c2b9b96907b7~などのcommit hash値]
git cherry-pick fe87c8ab11638c6c73db6374fb47c02236a5720a..4d270af741fc5d3fdcc4247fe1c8f2f9b8f10d12
このとき、開始点のcommitは含まれないので注意.
逆に言えば、指定するのは反映済のcommitを指定すればよい.
開始点を含めたい場合は、
git cherry-pick fe87c8ab11638c6c73db6374fb47c02236a5720a^..4d270af741fc5d3fdcc4247fe1c8f2f9b8f10d12
で、^をつける
git log
特定ブランチのcommitを知りたい場合は、続けてブランチ名でよい.
-- <ファイルパス> をつけると、そのファイルに関係するコミットだけを表示できる.
git log -- path/to/file.txt
よく使うオプション:
--oneline:各コミットを1行で表示-p: 各コミットの差分を表示git show --pretty=oneline --name-only <commit_hash>
--pretty=oneline: コミットのハッシュとメッセージを1行で表示します。–name-only と組み合わせることで、ファイルリストの前にコミット情報が付加されます。
--name-only: 変更されたファイルの名前だけを表示し、実際の差分(diff)は表示されません。
ローカルソースを変更中に、別のcommitを取り込みたいとき、変更内容が破棄されてしまうので、一旦退避して戻すことができる.
git stash -u
-u: untrackedファイルも含めて保存. -uなしならuntrackedファイルは無視
git stash push -m "メモ"
で退避して、
git stash apply stash@{n}
で戻す. stash@{n}はstashした履歴のどれを戻すか指定する.
git stash list
で表示される先頭の文字.
stashしたファイルを表示するには、
git stash show -p stash@{0}
特定のファイルのみ戻したい場合は、
git checkout stash@{0} -- path/to/file
とする.
stashリストは消えないので、
git stash drop stash@{n}
で削除できる. もしくはapplyではなくpopでもいいらしい.
git reset [commit hash値]
git revert [commit hash値]
git revert --abortその後リモートリポジトリにもそれを反映させるには以下を実行
git push origin [ブランチ名] --force
逆にリモートブランチでローカルを強制的に合わせるには以下
git reset --hard origin/[ブランチ名]
commit hash値のところはHEAD^とすることで、直前のcommitを取り消すことができる.
resetには--soft、--hard、--mixedのオプションがある.
例えば上記の例として、最新から5個のcommitがあって、4番目まで戻して、1番目のコミットだけ適用したいみたいな場合、
git reset --soft [4番目の前のcommit hash値] # これで最新から4番目までのコミットがなくなる
git log # 確認する
# vscode上は1番目から4番目の変更がステージングされているので、必要なものだけにする
git commit -m "message" # 1番目の変更内容をコミットする
git push origin [ブランチ名] --force # リモートと同期する
これでリモートブランチとローカルブランチは戻る。
このリモートブランチを他の人がgit pullするとコンフリクトしてしまうので、
git fetch origin
git reset --hard origin/<branch-name>
として今度はリモートブランチと強制的に同期をとる
resetとすると、別のクライアントでresetする前のコミットを取得済の場合、git pullしても取り消したcommitは取得できなくなってしまう。そのクライアント側でもresetする必要がある。
resetして、
git checkout -- [ファイル名]
としてリモートリポジトリのファイルを再取得する必要がある。
この場合もresetでよい
git reset --hard [commit hash値]
git reset --soft HEAD~1
# リモートに反映済みの場合
git push --force-with-lease origin [ブランチ名]
--softは変更は保持するオプション。変更も取り消すのは--hard。
--force-with-leaseは、他の人がpushしていたら防ぐオプション。気にしない場合は、--force。
目的: あるコミットを歴史から消す(そのコミット行そのものを無くす)。既に共有・プッシュしているブランチでは注意(他者の履歴と食い違う)。変更の効果だけを安全に打ち消したいだけなら、上記の git revert <コミット> の方が向いている。
対象コミットの親を起点に対話的リベースを開始する。
git rebase -i <取り除きたいコミットのハッシュ>^
エディタに並んだコミット一覧で、除きたい行を削除するか、行頭の pick を drop(省略形 d)にする。保存してエディタを終了すると、その1コミットだけが落ちた履歴になる。競合したら解消してから git rebase --continue。取りやめるときは git rebase --abort。
リモートへ既に出しているブランチに反映する場合、履歴が書き換わるため通常は次のようにする。
git push --force-with-lease
--force-with-lease は、リモートが自分が最後に見た状態と違う(誰かが先に push した)ときに拒否してくれる。無条件で上書きする --force より安全なことが多い。
1コミットだけ飛ばすなら、次でも同じことになる。
git rebase --onto <取り除きたいコミット>^ <取り除きたいコミット> HEAD
意味は「<取り除きたいコミット> の直後から HEAD までのコミットを、そのコミットの親の上に付け直す」=間のその1コミットだけが履歴から落ちる。
git pullはfetchしてmergeすること。
git fetchは、リモートリポジトリの最新の変更(コミット、ブランチ、タグなど)をローカルリポジトリにダウンロードしますが、現在の作業ブランチの作業ツリー(ワーキングディレクトリ)やインデックス(ステージングエリア)は変更しません。
git mergeは作業ツリーやインデックスに統合すること。
作業中(取り込み先)のブランチで
git checkout [別ブランチ名] -- /path/file.js
SSL certificate problem: unable to get local issuer certificateエラー一時的にSSL認証を無視するオプションを付けて実行
git -c http.sslVerify=false pull
基本的にgitのバージョンが古いケース。gitをバージョンアップする。
ローカルファイルを変更していて、git pullが効かないが、リモートリポジトリで強制的に上書きしたい場合、
(masterブランチを上書きする)
git fetch origin master
git reset --hard origin/master
[log]ディレクトリのみリポジトリに入れる場合、log/.gitkeepファイルを作成して以下の記述
log/*
!.gitkeep
!は直前ルールの否定.
毎回 git checkoutしなくて便利
git worktree add -b feature/foo /mydir/feature-foo
git worktree add /mydir/feature-foo feature/foo
git worktree list
git worktree remove /mydir/feature-foo # 片付け
git worktree prune # 孤児掃除
GitHubの対象リポジトリページで「Fork」ボタンをクリック。自分のアカウント配下にコピーが作られる。
自分のfork(origin)をcloneして、通常通り作業する。
git clone https://github.com/[自分]/[repo].git
forkは本家の変更を自動追従しないので、最初に本家をupstreamとして登録しておく。
git remote add upstream https://github.com/[本家owner]/[repo].git
git remote -v # origin(fork)とupstream(本家)の両方が見えればOK
git fetch upstream
git checkout main
git merge upstream/main # または git rebase upstream/main
git push origin main # forkにも反映
GitHubのfork画面にある「Sync fork」ボタンでも同期可能。
git reset --hard upstream/develop
git push origin develop --force-with-lease
GitHubのPull Requestsページで、PRを作成することができる。本家でもfork先でもどちらでも可能。
#番号を記載すると、本家のissueが参照可能。すでにgit管理済みのファイルをあとから.gitignoreにファイルを追加しても、対象外にできない。 その場合は以下の手順が必要。
git rm --cached [ファイル名] # gitのcacheを削除する(ファイルはそのままになる)
git commit -m "ファイルを削除などのメッセージ" # コミット
このあと、.gitignoreファイルに対象ファイルを記載する
一つのPCで複数のgitアカウントを使う場合は、グローバル設定がデフォルトになるので要注意。 グローバル設定を変更するには
git config --global user.name "change name"
git config --global user.email "change email"
以下でタブ区切りのリストを出力できる https://cli.github.com/manual/gh_issue_list
gh issue list -s all -a [ユーザ名] -L 100
-s: open | closed | all
-a: アサインユーザー名
-L: 出力行数(デフォルト30件)
コンソール表示では、タイムスタンプがabout 5 days agoなどとなるが、標準出力すればタイムスタンプになる。
タイムスタンプはclose issueならcloseした日付。
↓に従ってghで認証情報を作成する
https://docs.github.com/ja/get-started/getting-started-with-git/caching-your-github-credentials-in-git
brew install gh
gh auth login
すると選択式で進む
GitHub.com/GitHub Enterprise
https/SSH→https
??/GitHub CLI→GitHub CLI
でGitHubにブラウザからログインして、表示されている認証コードを入力する
macの場合キーチェーンアプリにGitHub.comの認証情報が追加される