🔊

git の HEAD がわかるとローカルブランチはなくてもどうにでもできる話

に公開

tl;dr

  • gitのブランチ名は後から決める という記事を見た
  • 同僚にも HEAD の使い方がいまいち伝わってない
  • ローカルだけで遊ぶ方法も伝わってなさげ?
  • シェルで表現してみた
  • git は HEAD がわかればローカルブランチは要らないし、ブランチ名の変更は簡単(PR作成後だと別のPRになるけど)
  • bash なのでどこでも動くはず。。。

シェル全部

コード自体はまだそんなに再利用性が高くない(別に低くもないけど)
git.sh
#!/bin/env bash

set -ue -o pipefail

export LC_ALL=C
export LC_TIME=C

# config_git で設定している alias を使えるようにする
shopt -s expand_aliases
source  ~/.config/bash/bash_aliases

timestamp=$(date +%Y%m%d%H%M%S)
readonly TEST_DIR=$(mktemp -dt "$(basename "${BASH_SOURCE}").$timestamp.XXXXX")/
readonly TEST_REPO="my-test"

set -v

# 作業用のディレクトリに移動
cd ${TEST_DIR}
pwd
ls -la

# リポジトリを作成(中身を調べるのは中級者への道)
git init --bare ${TEST_REPO}.git
ls -la

# リポジトリを clone してディレクトリに入る
git clone ${TEST_REPO}.git
ls -la
cd ${TEST_REPO}
pwd
ls -la

# config と alias をセット。config_git を見てね
set +v
git config user.name  "raki"
git config user.email "raki@example.com"
git config alias.co   "checkout"
git config alias.pr   "!git push origin HEAD:refs/heads/\$1 #"
git config alias.plog "log --pretty=format:'%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=format-local:'%t%Y/%m/%d %H:%M'  --all --graph"
set -v

# git log を見ても空(まだ何もしてないからね)
gp

# ファイルを作成して push まで
echo "1st" > README.md
ga README.md
gcv -m "feat: 1st"
gpr main
# 最初だからデフォルトブランチを作成していることに注意
gp

# detached head で運用しやすいように origin/HEAD をセットする
git remote set-head origin main
gr
# fetch しなおして detach する。ローカルの main ブランチはもう要らないので削除
gb -d main
gp

# 通常運用
# いつでも最新の HEAD(origin/main) から作業を始める
gr

echo "2nd" >> README.md
gdi
gau
gst
gcv -m"feat: 2nd"
gpr feat/2nd
gp
gr

# GitHub なら PR が作れる状態。ローカルではできないのでマージ処理
g merge --ff origin/feat/2nd
gp
gpr main
g push origin :feat/2nd
gp

# もっとブランチっぽい作業
gr
echo "3rd" >> README.md
gau
gcv -m"feat: 3rd"
echo "4th" >> README.md
gau
gcv -m"feat: 4th"
gpr feat/3to4
gr
# --no-ff で merge commit を作成する
g merge --no-ff --no-edit origin/feat/3to4
gpr main
gr

# squash してみる(rebaseじゃないやり方)
gr
echo "5th" >> README.md
gau
gcv -m"feat: 5th"
echo "6th" >> README.md
gau
gcv -m"feat: 6th"
gpr feat/5to6
## 後で使う
HASH_6th=$(git show --format='%h' --no-patch)

## 複数コミットのブランチとは別の空ブランチを作って squash して push
gr
g merge --squash origin/feat/5to6
gcv -m"test: squash merge. include 5to6"
gpr feat/for_squash/5to6
## squash したブランチを ff マージする
gr
g merge --ff --no-edit origin/feat/for_squash/5to6
gpr main
gr
## ブランチを掃除して見やすく
g push origin :feat/3to4
g push origin :feat/5to6
g push origin :feat/for_squash/5to6
gr


# ブランチ名の変更
echo "7th" >> README.md
gau
gcv -m"feat: 7th"
gpr feat/5to6
## 後で使う
HASH_7th=$(git show --format='%h' --no-patch)
gr
## ブランチ名間違えてる(直さないと)
g co ${HASH_7th}
gpr feat/7th
g push origin :feat/5to6
gr
## あわてずさわがず対象のコミットで新しいブランチ名をpushして古いほうを消せばいいだけ


# (おまけ)squash してもハッシュがわかれば戻せるよ
g co ${HASH_6th}
gp

# (おまけ)README.md
gr
cat README.md

# 掃除
rm -fr ${TEST_DIR}

alias

bash の alias for git

$ type g gr gst gdi ga gau gcv gpr gp
g is aliased to `git'
gr is aliased to `git fetch --prune --all && git checkout origin/HEAD && git plog -10 && git status'
gst is aliased to `git status --short --branch'
gdi is aliased to `git diff'
ga is aliased to `git add'
gau is aliased to `git add -u'
gcv is aliased to `git commit -v'
gpr is aliased to `git pr'
gp is aliased to `git plog -10'

git alias

  • officel/config_git: .config/git
  • 自前でセットするか読み替えて
  • switch めったに使わないw
  • plog と pr は bash alias とセット運用なので注意
$ git alias
alias    => !git config --get-regexp 'alias\.' | sed 's/alias\.\([^ ]*\) \(.*\)/\1\      => \2/' | sort
c        => commit
cancel   => reset --soft HEAD^
co       => checkout
coo      => checkout origin/HEAD
deleted  => log --diff-filter=D --summary
load     => stash pop
plog     => log --pretty=format:'%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=format-local:'%t%Y/%m/%d %H:%M'  --all --graph
pr       => !git push origin HEAD:refs/heads/$1 #
restoring        => !git checkout $(git rev-list -n 1 HEAD -- ${1:-none})~1 --
save     => stash save
sw       => switch
swo      => switch -d origin/HEAD

実行結果をちょっと整形しつつ説明

作業用のディレクトリに移動

$ cd ${TEST_DIR}
$ pwd
/tmp/git.sh.20240803071702.91o28

$ ls -la
total 20
drwx------  2 raki raki  4096 Aug  3 07:17 .
drwxrwxrwt 21 root root 16384 Aug  3 07:17 ..
  • どこでもいいけど空のディレクトリを用意する
  • bash の mktemp() でバッティングしないディレクトリを使用すると楽

ローカルで遊べるリポジトリを作成(中身を調べるのは中級者への道)

$ git init --bare ${TEST_REPO}.git
Initialized empty Git repository in /tmp/git.sh.20240803071702.91o28/my-test.git/

$ ls -la
total 24
drwx------  3 raki raki  4096 Aug  3 07:17 .
drwxrwxrwt 21 root root 16384 Aug  3 07:17 ..
drwxr-xr-x  7 raki raki  4096 Aug  3 07:17 my-test.git
  • --bare でベアリポジトリが作成できる。要は GitHub で新しいリポジトリを作ったのと同じ
  • 拡張子 .git は慣習的なもの(ベアリポジトリにつける)

リポジトリを clone してディレクトリに入る

$ git clone ${TEST_REPO}.git
Cloning into 'my-test'...
warning: You appear to have cloned an empty repository.
done.

$ ls -la
total 28
drwx------  4 raki raki  4096 Aug  3 07:17 .
drwxrwxrwt 21 root root 16384 Aug  3 07:17 ..
drwxr-xr-x  3 raki raki  4096 Aug  3 07:17 my-test
drwxr-xr-x  7 raki raki  4096 Aug  3 07:17 my-test.git

$ cd ${TEST_REPO}
$ pwd
/tmp/git.sh.20240803071702.91o28/my-test
$ ls -la
total 12
drwxr-xr-x 3 raki raki 4096 Aug  3 07:17 .
drwx------ 4 raki raki 4096 Aug  3 07:17 ..
drwxr-xr-x 7 raki raki 4096 Aug  3 07:17 .git
  • https でも ssh でもなく単にディレクトリを指定して clone しているだけ
  • my-test.git(ベアリポジトリ)とmy-test(cloneしたリポジトリ)の違いについてちゃんと理解しておくこと

config と alias をセット

$ git config user.name  "raki"
$ git config user.email "raki@example.com"
$ git config alias.co   "checkout"
$ git config alias.pr   "!git push origin HEAD:refs/heads/\$1 #"
$ git config alias.plog "log --pretty=format:'%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=format-local:'%t%Y/%m/%d %H:%M'  --all --graph"

# git log を見ても空(まだ何もしてないからね)
$ gp
  • git config はすでに設定済みならしなくても大丈夫
  • シェル用に記載しただけ

ファイルを作成して push して最初の準備完了まで

$ echo "1st" > README.md
$ ga README.md

$ gcv -m "feat: 1st"
[main (root-commit) 519d0c0] feat: 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

$ gpr main
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> main

## 最初だからデフォルトブランチを作成していることに注意

$ gp
* 519d0c0 	2024/08/03 07:17 feat: 1st  (HEAD -> main, origin/main) [raki]

## detached head で運用しやすいように origin/HEAD をセットする
$ git remote set-head origin main

## fetch しなおして detach する。ローカルの main ブランチはもう要らないので削除
$ gr
HEAD is now at 519d0c0 feat: 1st
* 519d0c0 	2024/08/03 07:17 feat: 1st  (HEAD, origin/main, origin/HEAD, main) [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

$ gb -d main
Deleted branch main (was 519d0c0).

$ gp
* 519d0c0 	2024/08/03 07:17 feat: 1st  (HEAD, origin/main, origin/HEAD) [raki]

通常運用

# いつでも最新の HEAD(origin/main) から作業を始める
$ gr
HEAD is now at 519d0c0 feat: 1st
* 519d0c0 	2024/08/03 07:17 feat: 1st  (HEAD, origin/main, origin/HEAD) [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

$ echo "2nd" >> README.md
$ gdi
diff --git a/README.md b/README.md
index 2a5d015..c8cac97 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 1st
+2nd

$ gau
$ gst
## HEAD (no branch)
M  README.md

$ gcv -m"feat: 2nd"
[detached HEAD c696723] feat: 2nd
 1 file changed, 1 insertion(+)

$ gpr feat/2nd
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/2nd

$ gp
* c696723 	2024/08/03 07:17 feat: 2nd  (HEAD, origin/feat/2nd) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  (origin/main, origin/HEAD) [raki]

$ gr
Previous HEAD position was c696723 feat: 2nd
HEAD is now at 519d0c0 feat: 1st
* c696723 	2024/08/03 07:17 feat: 2nd  (origin/feat/2nd) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  (HEAD, origin/main, origin/HEAD) [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

# GitHub なら PR が作れる状態。ローカルではできないのでマージ処理
$ g merge --ff origin/feat/2nd
Updating 519d0c0..c696723
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

$ gp
* c696723 	2024/08/03 07:17 feat: 2nd  (HEAD, origin/feat/2nd) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  (origin/main, origin/HEAD) [raki]

$ gpr main
To /tmp/git.sh.20240803071702.91o28/my-test.git
   519d0c0..c696723  HEAD -> main
$ g push origin :feat/2nd
To /tmp/git.sh.20240803071702.91o28/my-test.git
 - [deleted]         feat/2nd
$ gp
* c696723 	2024/08/03 07:17 feat: 2nd  (HEAD, origin/main, origin/HEAD) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
  • HEAD の動きに注目
  • origin/xxx はリモートブランチ、なのは言うまでもないね?
  • gp はいつでも何回でも打ってよし
  • gr は作業開始時にいつでも打ってよし

もっとブランチっぽい作業

$ gr
HEAD is now at c696723 feat: 2nd
* c696723 	2024/08/03 07:17 feat: 2nd  (HEAD, origin/main, origin/HEAD) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached from 519d0c0
nothing to commit, working tree clean

$ echo "3rd" >> README.md
$ gau
$ gcv -m"feat: 3rd"
[detached HEAD 2c53d77] feat: 3rd
 1 file changed, 1 insertion(+)

$ echo "4th" >> README.md
$ gau
$ gcv -m"feat: 4th"
[detached HEAD 414dafc] feat: 4th
 1 file changed, 1 insertion(+)
$ gpr feat/3to4
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/3to4

$ gr
Previous HEAD position was 414dafc feat: 4th
HEAD is now at c696723 feat: 2nd
* 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
* 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
* c696723 	2024/08/03 07:17 feat: 2nd  (HEAD, origin/main, origin/HEAD) [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

# --no-ff で merge commit を作成する
$ g merge --no-ff --no-edit origin/feat/3to4
Merge made by the 'ort' strategy.
 README.md | 2 ++
 1 file changed, 2 insertions(+)

$ gpr main
To /tmp/git.sh.20240803071702.91o28/my-test.git
   c696723..117fe4a  HEAD -> main

$ gr
HEAD is now at 117fe4a Merge remote-tracking branch 'origin/feat/3to4' into HEAD
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  (HEAD, origin/main, origin/HEAD) [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]HEAD detached from c696723
nothing to commit, working tree clean

squash してみる(rebaseじゃないやり方)

$ gr
HEAD is now at 117fe4a Merge remote-tracking branch 'origin/feat/3to4' into HEAD
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  (HEAD, origin/main, origin/HEAD) [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached from c696723
nothing to commit, working tree clean

$ echo "5th" >> README.md
$ gau
$ gcv -m"feat: 5th"
[detached HEAD 2dd9481] feat: 5th
 1 file changed, 1 insertion(+)

$ echo "6th" >> README.md
$ gau
$ gcv -m"feat: 6th"
[detached HEAD 0420ae9] feat: 6th
 1 file changed, 1 insertion(+)

$ gpr feat/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/5to6
## 後で使う
$ HASH_6th=$(git show --format='%h' --no-patch)

## 複数コミットのブランチとは別の空ブランチを作って squash して push
$ gr
Previous HEAD position was 0420ae9 feat: 6th
HEAD is now at 117fe4a Merge remote-tracking branch 'origin/feat/3to4' into HEAD
* 0420ae9 	2024/08/03 07:17 feat: 6th  (origin/feat/5to6) [raki]
* 2dd9481 	2024/08/03 07:17 feat: 5th  [raki]
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  (HEAD, origin/main, origin/HEAD) [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

$ g merge --squash origin/feat/5to6
Updating 117fe4a..0420ae9
Fast-forward
Squash commit -- not updating HEAD
 README.md | 2 ++
 1 file changed, 2 insertions(+)

$ gcv -m"test: squash merge. include 5to6"
[detached HEAD 536bb08] test: squash merge. include 5to6
 1 file changed, 2 insertions(+)

$ gpr feat/for_squash/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/for_squash/5to6

## squash したブランチを ff マージする
$ gr
Previous HEAD position was 536bb08 test: squash merge. include 5to6
HEAD is now at 117fe4a Merge remote-tracking branch 'origin/feat/3to4' into HEAD
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (origin/feat/for_squash/5to6) [raki]
| * 0420ae9 	2024/08/03 07:17 feat: 6th  (origin/feat/5to6) [raki]
| * 2dd9481 	2024/08/03 07:17 feat: 5th  [raki]
|/
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  (HEAD, origin/main, origin/HEAD) [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

$ g merge --ff --no-edit origin/feat/for_squash/5to6
Updating 117fe4a..536bb08
Fast-forward
 README.md | 2 ++
 1 file changed, 2 insertions(+)

$ gpr main
To /tmp/git.sh.20240803071702.91o28/my-test.git
   117fe4a..536bb08  HEAD -> main

$ gr
HEAD is now at 536bb08 test: squash merge. include 5to6
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (HEAD, origin/main, origin/feat/for_squash/5to6, origin/HEAD) [raki]
| * 0420ae9 	2024/08/03 07:17 feat: 6th  (origin/feat/5to6) [raki]
| * 2dd9481 	2024/08/03 07:17 feat: 5th  [raki]
|/
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  (origin/feat/3to4) [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached from 117fe4a
nothing to commit, working tree clean

## ブランチを掃除して見やすく
$ g push origin :feat/3to4
To /tmp/git.sh.20240803071702.91o28/my-test.git
 - [deleted]         feat/3to4

$ g push origin :feat/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 - [deleted]         feat/5to6

$ g push origin :feat/for_squash/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 - [deleted]         feat/for_squash/5to6

$ gr
HEAD is now at 536bb08 test: squash merge. include 5to6
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (HEAD, origin/main, origin/HEAD) [raki]
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached from 117fe4a
nothing to commit, working tree clean
  • --ff--squash の違い
  • コミットハッシュの変化
  • 長いけど理解のためにログを多く出力しているだけ
  • 要は squash したコミットを作って --ff することで、GitHub 上での squash merge と同じになる

ブランチ名の変更

$ echo "7th" >> README.md
$ gau
$ gcv -m"feat: 7th"
[detached HEAD 880b0ef] feat: 7th
 1 file changed, 1 insertion(+)
$ gpr feat/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/5to6
## 後で使う
$ HASH_7th=$(git show --format='%h' --no-patch)

$ gr
Previous HEAD position was 880b0ef feat: 7th
HEAD is now at 536bb08 test: squash merge. include 5to6
* 880b0ef 	2024/08/03 07:17 feat: 7th  (origin/feat/5to6) [raki]
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (HEAD, origin/main, origin/HEAD) [raki]
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

## ブランチ名間違えてる(直さないと)
$ g co ${HASH_7th}
Previous HEAD position was 536bb08 test: squash merge. include 5to6
HEAD is now at 880b0ef feat: 7th

## 同じコミットに新しいブランチ名をつける
$ gpr feat/7th
To /tmp/git.sh.20240803071702.91o28/my-test.git
 * [new branch]      HEAD -> feat/7th

## 間違ったブランチ名は消す(GitHub で PR を作成済みだと close される。新しいブランチ名で別の PR を作る必要がある)
$ g push origin :feat/5to6
To /tmp/git.sh.20240803071702.91o28/my-test.git
 - [deleted]         feat/5to6

$ gr
Previous HEAD position was 880b0ef feat: 7th
HEAD is now at 536bb08 test: squash merge. include 5to6
* 880b0ef 	2024/08/03 07:17 feat: 7th  (origin/feat/7th) [raki]
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (HEAD, origin/main, origin/HEAD) [raki]
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]HEAD detached at origin/main
nothing to commit, working tree clean
  • あわてずさわがず対象のコミットで新しいブランチ名をpushして古いほうを消せばいいだけ

(おまけ)squash してもハッシュがわかれば戻せるよ

## とっておいたコミットハッシュで checkout
g co ${HASH_6th}
Previous HEAD position was 536bb08 test: squash merge. include 5to6
HEAD is now at 0420ae9 feat: 6th

$ gp
* 880b0ef 	2024/08/03 07:17 feat: 7th  (origin/feat/7th) [raki]
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (origin/main, origin/HEAD) [raki]
| * 0420ae9 	2024/08/03 07:17 feat: 6th  (HEAD) [raki]
| * 2dd9481 	2024/08/03 07:17 feat: 5th  [raki]
|/
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
  • git ref の使い方は中級者向け
  • ただまぁ常にコミットハッシュで HEAD の位置を考慮していればそんなに難しいこと言ってない

(おまけ)README.md

$ gr
Warning: you are leaving 2 commits behind, not connected to
any of your branches:

  0420ae9 feat: 6th
  2dd9481 feat: 5th

HEAD is now at 536bb08 test: squash merge. include 5to6
* 880b0ef 	2024/08/03 07:17 feat: 7th  (origin/feat/7th) [raki]
* 536bb08 	2024/08/03 07:17 test: squash merge. include 5to6  (HEAD, origin/main, origin/HEAD) [raki]
*   117fe4a 	2024/08/03 07:17 Merge remote-tracking branch 'origin/feat/3to4' into HEAD  [raki]
|\
| * 414dafc 	2024/08/03 07:17 feat: 4th  [raki]
| * 2c53d77 	2024/08/03 07:17 feat: 3rd  [raki]
|/
* c696723 	2024/08/03 07:17 feat: 2nd  [raki]
* 519d0c0 	2024/08/03 07:17 feat: 1st  [raki]
HEAD detached at origin/main
nothing to commit, working tree clean

$ cat README.md
1st
2nd
3rd
4th
5th
6th

最後に

  • gitでローカルブランチにmasterなんて(普通は)要りません #Git - Qiita を見てからずっとローカルブランチレスな生活
  • push しないでローカルで複数の作業をしたい時は作る、かもしれない(状況によるけどあんまりない)
  • 常に gr して gp でログを見てると、コミットタイトルがひどいやつとか許せなくなる
  • ブランチが汚いのとか耐えられない
  • rebase とか squash とか amend とか、コミットをきれいにする作業は面倒くさいんじゃなくて知らないだけ
  • なんだか方向がずれちゃったけど、HEAD を理解していればだいたいなんとかなります
  • 後で少し書き直すかも

Discussion