Git で pushできなくなったので、ちょっとメモ。


# 起
<img width="560" alt="screenshot_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/d14c6819-dd19-e7c0-4e4b-850a6ffc53b9.png">

ムムム。[^1]

[^1]: `alias.s=status`

```shell-session
HEAD detached from origin/master
```

なんか出てるけど、意味わからんからとりあえず無視。
あれ？右端にはいつも`master`と出ていたのに、今はsha1っぽい番号が…

でも今はそれよりも、早く`git push`して出かけないと。

# 承
<img width="563" alt="screenshot_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/0a5a2c69-7e7a-36be-706e-f6d0a9b1f757.png">

ぐは。`push`通らへんし。

しばしググると、どうやら`git reflog`に解決の糸口があるらしい。

# 転

よくわからんが、やってみる。[^2]

[^2]: 今回はGitHubの`.emacs.d`的なリポジトリだったので気軽に試せたけど、これが社内のだったらと思うと…

```shell-session
~/.emacs.d ❯❯❯ git reflog
1b97169 (HEAD) HEAD@{0}: commit (merge): mod
7d8e5fe HEAD@{1}: commit: mod
47361b3 (origin/master) HEAD@{2}: checkout: moving from 66f697eab8fc6f2e82f29b63
66f697e HEAD@{3}: commit (amend): fix
cfa08ff HEAD@{4}: commit: fix
85f5238 HEAD@{5}: commit: delete
47361b3 (origin/master) HEAD@{6}: checkout: moving from be561655e5307766c5a53284
be56165 HEAD@{7}: checkout: moving from bc06fe68c34b1f6003baedb608aab4d6fdb40dc8
bc06fe6 HEAD@{8}: checkout: moving from 8736c9838f9b4fcb1c1031197a2b9eebd2a2a2bd
8736c98 HEAD@{9}: merge origin/master: Merge made by the 'recursive' strategy.
43ba576 HEAD@{10}: commit (amend): fixed
47361b3 (origin/master) HEAD@{11}: commit (amend): fixed
ccf0fa3 HEAD@{12}: commit: fixed
bc06fe6 HEAD@{13}: checkout: moving from master to bc06fe6
5e08fde (master) HEAD@{14}: checkout: moving from bc06fe68c34b1f6003baedb608aab4
bc06fe6 HEAD@{15}: checkout: moving from be561655e5307766c5a53284721c5e16ca55da0
be56165 HEAD@{16}: checkout: moving from master to be56165
5e08fde (master) HEAD@{17}: checkout: moving from be561655e5307766c5a53284721c5e
be56165 HEAD@{18}: checkout: moving from b791e31898c80db7f4811f5f2981d64532c9e3f
b791e31 HEAD@{19}: checkout: moving from master to b791e31
5e08fde (master) HEAD@{20}: commit: add
bc06fe6 HEAD@{21}: commit: improve
be56165 HEAD@{22}: commit (amend): mod
b41820b HEAD@{23}: commit (amend): mod
```
なんか、`checkout: moving from master to...`とか出始めているのがすでに怪しそう。
とすると、その直前の`5e08fde`に戻すか。

いや待て。
`5e08fde`には`master`とあるけど、なぜか他にもたくさんある…。

念のために、その一つ前の`bc06fe6`に戻そう。
ひとまず大切なファイルをバックアップしといて`git reset`を試す。

<img width="386" alt="screenshot_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/375bcda8-227f-eabb-ec7a-58027a84856e.png">

おお、右端の表示が`master~1`に変わってるやん！
`HEAD@{xx}` なんて初めて使ったけど、なんか効いてる。よく分からんけど！

まだ、`HEAD detached from origin/master`が表示されてるけど、ここまでくればなんとかなるかも。

グラフ[^3]を出してみる。

[^3]: `alias.gr=log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short`

```shell-session
/.emacs.d ❯❯❯ git gr
* 47361b3  (origin/master) 2018-08-11 hidsh fixed
| * 5e08fde  (master) 2018-08-11 hidsh add
|/
* bc06fe6  (HEAD) 2018-08-08 hidsh improve
* be56165  2018-08-07 hidsh mod
```

HEADが`5e08fde`の直前に戻ってる！
なるほど、`master~1`というのは`master`の一つ前ということか。
行ける気がしてきた！

空コミットして、ひとまず`fetch -f`する。[^4]

[^4]: 実際は`git pull`は失敗するし、`git fetch`も`-f`つけないと失敗したので。

```shell-session
~/.emacs.d ❯❯❯ git commit -m 'ggg'
HEAD detached from origin/master
nothing to commit, working tree clean
~/.emacs.d ❯❯❯ git  fetch -f origin HEAD:master
From github.com:hidsh/.emacs.d
 + 5e08fde...47361b3            -> master  (forced update)
```

強引だったけど、なんとか`master`に戻れた、のか。

ここで`pull`してみる。

<img width="383" alt="screenshot_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/217b65c5-cab0-79ad-eeae-6cf2207b65da.png">

オッケー！！
やっと`master`に戻れた。
もう一度グラフを出してみる。

```shell-session
~/.emacs.d ❯❯❯ git gr
* 47361b3  (HEAD, origin/master, master) 2018-08-11 hidsh fixed
* bc06fe6  2018-08-08 hidsh improve
* be56165  2018-08-07 hidsh mod
```

行けてるっぽい。

# 転 2

ふう、なんとかなった。
じゃあ入れたかった変更を入れるか。[^5]

[^5]: `alias.c=commit`

```shell-session
~/.emacs.d ❯❯❯ git c -m 'add'
[detached HEAD 0a2d7b0] add
 5 files changed, 341 insertions(+), 1 deletion(-)
 create mode 100644 ...
~/.emacs.d ❯❯❯ git s
HEAD detached from origin/master
nothing to commit, working tree clean
```

ほげ。またも`HEAD detached from origin/master`とは。
当然、`push`しても弾かれる。

```shell-session
~/.emacs.d ❯❯❯ git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use

    git push origin HEAD:<name-of-remote-branch>
```

でも、ちょっと分かってきたかも。
一旦`checkout`[^6]して、`git` の勧める通りにブランチを切ってみる。

[^6]: `alias.co=checkout`

```shell-session
~/.emacs.d ❯❯❯ git co master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  0a2d7b0 add

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 0a2d7b0

Switched to branch 'master'
Your branch is up to date with 'origin/master'.
~/.emacs.d ❯❯❯ git branch br_add_hoge
~/.emacs.d ❯❯❯ git gr
* 47361b3  (HEAD -> master, origin/master, br_add_hoge) 2018-08-11 hidsh fix
* bc06fe6  2018-08-08 hidsh improve
* 47361b3  (HEAD -> master, origin/master, br_hoge) 2018-08-11 hidsh fix
* bc06fe6  2018-08-08 hidsh improve
* be56165  2018-08-07 hidsh mod
  :
~/.emacs.d ❯❯❯ git branch
  br_add_hoge
* master
```

ブランチ切れたので切り替えて[^7]`push`[^8]する。

[^7]: `alias.b-sw=checkout`
[^8]: `alias.b-push=push -u origin`
 
```shell-session
~/.emacs.d ❯❯❯ git b-sw br_add_hoge
Switched to branch 'br_add_hoge'
~/.emacs.d ❯❯❯ git b-push
fatal: The current branch br_add_hoge has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin br_add_hoge
```

おっと。では、ここも`git`の勧める通りに入力。

```shell-session
~/.emacs.d ❯❯❯ git push --set-upstream origin br_add_hoge
Total 0 (delta 0), reused 0 (delta 0)
To github.com:hidsh/.emacs.d.git
 * [new branch]      br_add_hoge -> br_add_hoge
Branch 'br_add_hoge' set up to track remote branch 'br_add_hoge' from 'origin'.
```

続いて`pull`→`push`してみる。

```shell-session
~/.emacs.d ❯❯❯ git pull
Already up to date.
~/.emacs.d ❯❯❯ git push
br_add_hoge
Everything up-to-date
```

よし。今度は通った。
ここで`master`に戻って[^9]、ブランチを`merge`しとく。

[^9]: `alias.b-sw-master=checkout master`

```shell-session
~/.emacs.d ❯❯❯ git b-sw-master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
~/.emacs.d ❯❯❯ git merge br_add_hoge
Already up to date.
```

ここまではオッケー。
では改めて、変更のコミットを。

```shell-session
~/.emacs.d ❯❯❯ git add .
~/.emacs.d ❯❯❯ git c -m 'test commit'
[master f1870ae] test commit
 1 file changed, 1 insertion(+), 1 deletion(-)
~/.emacs.d ❯❯❯ git gr
* f1870ae  (HEAD -> master) 2018-08-11 hidsh test commit
* 47361b3  (origin/master, origin/br_add_hoge, br_add_hoge) 2018-08-11 hidsh fix
* bc06fe6  2018-08-08 hidsh improve
* be56165  2018-08-07 hidsh mod
```

よしよし。
では、今度こそ念願の`push`を。できるか？？

<img width="542" alt="screenshot_09.png" src="https://qiita-image-store.s3.amazonaws.com/0/30474/26e9a431-dab7-8194-f142-721f2e18d9e6.png">

よっしゃー！

ふう、今度こそ終わり。
最後にブランチを消しとこう。

```shell-session
~/.emacs.d ❯❯❯ git branch -d br_add_hoge
Deleted branch br_add_hoge (was 47361b3).
```

# 結

まあ、あれです。

気づいたときには[^10]すでに悪いことは起きていて、後になってややこしいことになるのが常なのかもしれません。

[^10]: いやいや、今回は気づいていたにもかかわらず、スルーしようとしていたのか。

盆休みに`git`と戯れる日々はつづく。

# 参考
[git pushできないときの対処法](https://qiita.com/ycctw1443/items/df7623dba73408886cbb)
[detached HEAD から脱出する方法を git の内部構造から探る](https://qiita.com/Kuniwak/items/4e5d55d6888e5f6411fe#fn1)
[Git概念の整理を試みる](https://open-groove.net/git/git-summary/)