押すなよ!
Gitに慣れない新卒の人達は絶対に、絶対に押してはいけないコマンド
コマンドラインからリモートブランチを削除するコマンド
# git push --delete origin <リポジトリ名>
考え方としては、nullで上書きですね。
これをやると、凄く叱られます。
まだ助かる
実は、まだ助かります。
このコマンドが行うのは、該当に対するポインタを削除することだけです。
ポインタっていうのは、スナップショットがの位置情報みたいなものと思えばOKです。
ただ一応、やらかした際のタイムリミットもあるそうで調査してみます。
git reflog
という神から与えられしコマンドを使うことで、過去のコミットハッシュ値と、
HEADという、作業しているローカルブランチへのポインタが確認できるのです。
HEADのおかげで、「一個前はどのブランチに向いてた?」とかが分かります。
最悪リモートブランチをコマンドラインから削除してしまった場合は、
1.ログを見る → 2.チェックアウト で助かるんです。
# git reflog
# git checkout <対象のコミットハッシュ> -b <branch>
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 コマンドを開始します。