【Git】【GitHub】コミット履歴を引き継がずgit cloneする方法　後半無駄に丁寧に解説しています

## はじめに
学習を始めたばかりです。
気をつけていますが用語などもちょこちょこ間違っているかもしれません。
色々間違ったこと等ございましたらぜひ教えて下さい！

あと、もしかしたらもっとシンプルな方法があるのでは？と思っています。
今回のやり方はものすごく遠回りをしているかもしれません。

ただ、たくさんコミット履歴を持ってるリポジトリのcloneに時間がかからない方法だそうです！◆理由は後述します。
（今の所私にそんな機会は全くありませんが笑）

### こちらのサイトをとても参考にさせいただきました！！！

https://www.greptips.com/posts/1270/

後日、自分がこの手順でRailsアプリをcloneした後に行っている手順もせっかくなので書きます。
（cloneしたアプリによって手順は変わると思いますし、そもそも大したことはしてません!webpacker:installとか基本的なやつです）
追記：[書きました！](https://qiita.com/nmwkhl/items/3a1f4c22221c695daed7)

## 環境
Git： 2.32.0
ローカル環境：　cloud9
一応
GitHub： SSHキーを使っています
Rails： 6.1.5
Ruby： 2.6.3


## 対象の方
- GitHubからアプリを複製したい方
- 途中まで作ったアプリケーションを土台にそれぞれ分野の違う機能を実装させていきたい方
- GitHubの草はきちんとしときたい方

## 経緯
GitHubにあるRailsアプリのリポジトリを複製したくてgit clone

そしたら過去のコミット履歴も一緒にcloneされてしまったせいで、
GitHubの草（コントリビューション数がダブってしまい）何日間かがめちゃくちゃ多く（濃く？）なってしまいました。
↑くだらないかもしれませんが、これがすごく嫌だった

その時はは気づかず丸々一日そのまま作業を進めてしまいましたが、
正直な草？を生やすために新しいコミットも含めて一度コミット履歴を全て削除して対処しました。

→そのため、１日分の作業がぽっかり消え何もしてないことになってしまいました…
　↑これがすごく悲しかった…

# 手順

まさに[先程ご紹介したこのサイト](https://www.greptips.com/posts/1270/)通りです
コピペしやすいように$マークは抜いてあります。
★最初はホームディレクトリなどのアプリをcloneしたい場所（ディレクトリ）にいてください。
（当たり前ですが、何かのアプリの中で行うとそのアプリの中に複製されてしまいます）

```terminal:terminal
git clone --branch main --depth 1 「複製元のSSHキー」 「新しいアプリにつけたい名前」
cd 「新しいアプリにつけた名前」
git checkout --orphan tmp
git commit -m "clone app"
git checkout -B main
git branch -d tmp
git remote set-url origin 「新しく作ったリポジトリのSSHキー」
git push origin main
```
ちなみにコマンドに「」がない部分は、特に変更するところがないので
ターミナルに４行まとめてコピペするとそのまま一行ずつ実行してくれて楽です。
私の環境だけかもしれませんが。
```
git commit -m "もちろんここは変更しても大丈夫です"
```

**--depth 1**　で最新コミット履歴だけ取得してます。2,3,4と変えられます。
◆大量のコミット履歴を取得しないのでcloneが早くなるらしいです。

**checkout --orphan**　でコミット履歴を持たないブランチを作って、

**checkout -B　main**　でmainブランチに強制置き換えしてます。（上書き？）

あとは　**set-url**　なので注意してください！
git remote add originだとうまくいきませんでした。(originがすでに使われてるエラーが出ます)

# 解説が長くなってしまってのでここで一旦終わりの挨拶
今の所この手順を繰り返しても問題は起きていません。
今更ですが、普通にgit cloneしてコミット履歴消せばいいだけの気もしてきましたが
最初に消しちゃったほうが忘れなくて済むし良しとします。

なにかあればお知らせください。
お読みいただきありがとうございました！

<b> ここから下は無駄に丁寧に解説しています。
上記のコードの解説じゃ分からなければ読んでください！</b>

## 曖昧なところもあるけど解説
```terminal:terminal
git clone --branch main --depth 1 「複製元のSSHキー」 「新しいアプリにつけたい名前」
```

```terminal:例
git clone --branch main --depth 1 git@github.com:aaaaa.git sample_app
```

**git clone --branch main**　
メインブランチを複製してください。ですね。
（複製して欲しいリポジトリはこの後に指定しています）
＊ブランチをmasterでやってる人はmain→masterです

**--depth 1**
複製元のリポジトリの最新コミット履歴を一つだけ（一階層）持ってくるってことらしいです。
◆これのおかげでコミット履歴が大量にあってもcloneされない分早いらしいです。

「**複製元のSSH**」
GitHubで複製したいリポジトリを押して右のあたりにある緑色の　Code▼　を押せばあります。
（画面小さいと出ないです）

「**新しいアプリにつけたい名前**」は何でもいいです。ex)sample_app

***

```terminal:terminal
cd 「新しいアプリにつけた名前」
```
```terminal:例
cd sample_app
```
**cd 「新しいアプリにつけた名前」**
今の場所（ディレクトリ）からさっき複製させた名前のディレクトリまで移動します
***

```terminal:terminal
git checkout --orphan tmp
git commit -m "clone app"
git checkout -B main
git branch -d tmp
```
**git checkout --orphan tmp**
tmpというブランチを作ってます。
checkout --orphanは*コミット履歴が空*のブランチを作るという意味らしいです。

**git commit -m "clone app**"
一旦commitしてます。
git initとかgit add .とかはいらないっぽいです、逆にinitすると初期化されてよくわからなくなりました.

**git checkout -B main**
コミット履歴０のtmpブランチをmainブランチに強制置き換えしてます。
ここでコミット履歴が０のまっさらなmainブランチが出来上がりました！

**git branch -d tmp**
tmpブランチはいらないので消します。
***
```terminal:terminal
git remote set-url origin 「新しく作ったリポジトリのSSHキー」
```
**git remote set-url origin**
⚠ここ結構注意です！
いつも通りgit remote add originってやるとoriginが前のリポジトリに使われてるっていうエラーが出ます。
その際にgitが表示してくれた手順通りに進めてもうまくいかないです。

「**新しく作ったリポジトリのSSHキー**」
GitHubで右上（自分のアイコンのすぐ左横）にある　＋▼　マークを押したら出てくる New repository 押したらいつも通りリポジトリ名を打ってcreateしたら出てくるSSHキーをコピペすればオッケーです。

# 本当の終わりの挨拶です
これでGitHubのページを更新してみて、ちゃんと新しく作ったリポジトリにコミット履歴が無い複製アプリが表示されてれば成功です。🙌

これだけ細かく解説したのは少し前の自分がちんぷんかんぷんだった部分が多かったからです。
（リポジトリのSSHキーってどこにあるの！？とか考えてました笑）

後日、この複製したアプリをちゃんと動作させる手順を書きます。
→追記：[ここです!](https://qiita.com/nmwkhl/items/3a1f4c22221c695daed7)

本当に大したことはしていませんが、もし複製させたのに動かないって方がいらっしゃればちらっと見に来てください！
（上にも書きましたがアプリによって手順はかなり変わるのではないかなと思います。期待通りにならなければすみません）

分かりづらい文章もあったかもしれませんが、長々お読みいただきありがとうございました！
何かありましたらお知らせくださいませ！