【閲覧禁止】コマンドラインからリモートブランチを削除する【Git事故】

#押すなよ！
Gitに慣れない新卒の人達は**絶対**に、**絶対**に押してはいけないコマンド
コマンドラインからリモートブランチを削除するコマンド

```
# git push --delete origin <リポジトリ名>
```

考え方としては、nullで上書きですね。
これをやると、凄く叱られます。
![288f53ae-3ae8-44b7-af3f-978665c79616.jpg](https://qiita-image-store.s3.amazonaws.com/0/168731/fb36ab71-fe5e-7f5e-9346-f43e0dd75b11.jpeg)


#まだ助かる
実は、まだ助かります。
このコマンドが行うのは、該当に対するポインタを削除することだけです。
ポインタっていうのは、スナップショットがの位置情報みたいなものと思えばOKです。
ただ一応、やらかした際のタイムリミットもあるそうで調査してみます。

`git reflog` という神から与えられしコマンドを使うことで、過去のコミットハッシュ値と、
HEADという、作業しているローカルブランチへのポインタが確認できるのです。
HEADのおかげで、「一個前はどのブランチに向いてた？」とかが分かります。
最悪リモートブランチをコマンドラインから削除してしまった場合は、
　1.ログを見る　→　2.チェックアウト　で助かるんです。

```
# git reflog
# git checkout <対象のコミットハッシュ> -b <branch>
```
![ans-380554750.jpg](https://qiita-image-store.s3.amazonaws.com/0/168731/994480a4-e986-2426-83ac-f3b1b3d59610.jpeg)
git-reflog - Manage reflog information
https://git-scm.com/docs/git-reflog

#オープンな世界
他にも、マージ済みのリモートブランチを全部**削除**するコマンドも見つけました～。
今回、参考にさせて頂いた方のコマンドが、めちゃくちゃ勉強になりました。

```
# git branch -r --merged master | grep -v -e master|sed -e 's% *origin/%%'| xargs -I% git push --delete origin %
```

下記を参考にさせて頂きました!!!
miukoba/gitでマージ済みの(リモート|ローカル)ブランチを全て削除.md
https://gist.github.com/miukoba/fc3c10a25c1c675c1e97

```
git branch -r --merged master | grep -v -e master -e develop | sed -e 's% *origin/%%' | xargs -I% git push --delete origin %
```
##sedコマンドのs% 
この%はなんなんだろうか...。調べたところ。
https://www.gnu.org/software/sed/manual/sed.html

sedコマンドの置き換え文字は何でもOKらしく、オプションsの次の文字を置き換え文字にするそうです。
これまで、むっちゃ¥¥してましたヨ〜。

```
[root@localhost git]# git branch -r --merged master | grep -v -e master
  origin/Test1
  origin/Test2
  origin/Test3
  origin/feat/master
[root@localhost git]#
[root@localhost git]#
[root@localhost git]# git branch -r --merged master | grep -v -e master|sed -e 's% *origin/%%g'
Test1
Test2
Test3
feat/master
```

##xargsのオプション-I

```
[root@localhost git]# git branch -r --merged master | grep -v -e master|sed -e 's% *origin/%%g'| xargs -I % git branch -d %
```

参考にさせて頂いたコマンドですが、
複数削除していますね。

```
xargs -I% ～ %
```
この書き方、なんだろう。
むっちゃ代入してる感があります。
オプション-I???

困ったらmanだ！

```
[root@localhost git]# man xargs
-I replace-str
              Replace occurrences of replace-str in the initial-arguments with names read from standard input.  Also, unquoted blanks do not terminate input items; instead the separator is the new‐
              line character.  Implies -x and -L 1.
```

なにやら、
>xargsコマンドの-I オプションでは、標準入力より渡されたデータを
xargs引数コマンド の、任意の位置の引数に展開することが可能

とのこと...。
こんな使い方あったんだ。
これは勉強になった!!

ちょっと引っかけて遊ぶとかもできますね～。
for文いらずにできるかも。

```
[root@localhost nekoatusme]# ls
neko.rb  sss
[root@localhost nekoatusme]#
[root@localhost nekoatusme]#
[root@localhost nekoatusme]# ls | xargs -Iaaa  echo aaa
neko.rb
sss
[root@localhost nekoatusme]#
[root@localhost nekoatusme]#
```

##オワリはじまり
タイムリミットが存在するのも、Gitの世界です。
Gitの自動メンテナンスでガベージコレクション(gc)が行われるまでに復元せねばなりません。
GCはお掃除屋さんが色々綺麗にしてくれるあれです。
一応、かなりの量の未完了のオブジェクト or 差分情報がまとめられたパックファイルがないと
GCは走らないので大丈夫なんですが、これむっちゃ不安ですね～。

```
# git count-objects -v
# ll .git/objects/
```
大丈夫なものですが、確認もできるみたいですね。
commitして放置とかの無いよう忘れずに〜。
#参考
1 Git のブランチ機能 - ブランチとは
https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF

>.7 Gitの内側 - メインテナンスとデータリカバリ
https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA
Git は時々 "auto gc" と呼ばれるコマンドを自動的に実行します。大抵の場合、このコマンドは何もしません。もし沢山の緩いオブジェクト（パックファイルの中にないオブジェクト）があったり、あまりに多くのパックファイルがあると、Git は完全な（full-fledged）git gc コマンドを開始します。