- Git
git initの使い方|既存フォルダを最初のpushまで進める手順
git init とは、いまあるフォルダを Git の管理下に置く(.git フォルダを作る)コマンドです。 既存フォルダを GitHub に載せるまでの流れは、git init → .gitignore を用意 → git add → git commit → git remote add origin → git push -u origin main の6手で完結します。
この記事では、その一本道の手順をすべてのコマンドの実行結果つきで順番に示します。さらに、接続方法(HTTPS+PAT・SSH・gh repo create)の比較表、最初の push で出会いやすい4つのエラーを手元で再現した結果と直し方、.gitignore を後から効かせる方法、秘密情報を commit してしまったときの戻し方までを1ページにまとめました。途中で止まっても、エラー文で検索すればこのページ内で答えにたどり着ける構成です。
git initから最初のpushまでの早見表
まずは完成形です。GitHub 側で空のリポジトリ(README・.gitignore・License を追加しない状態)を作ってから、既存フォルダの中で上から順に実行します。
cd memo-app # 既存フォルダへ移動
git init -b main # 1. Git管理を開始(最初のブランチ名を main に)
printf '.env\nlogs/\n' > .gitignore # 2. 載せないファイルを先に指定
git add . # 3. ファイルをステージに載せる
git commit -m "最初のコミット" # 4. 最初のコミットを作る
git remote add origin https://github.com/taro/memo-app.git # 5. リモートを登録
git push -u origin main # 6. 最初の push(-u で追跡設定も同時に)
| 手順 | コマンド | 役割 | うまくいったときの表示 |
|---|---|---|---|
| 1 | git init -b main |
.git を作り、Git 管理を始める | Initialized empty Git repository in ... |
| 2 | .gitignore を作る |
載せないファイルを決める | git status -s に対象が出なくなる |
| 3 | git add . |
コミット対象を選ぶ | git status -s が A で始まる |
| 4 | git commit -m "..." |
履歴の最初の1点を作る | [main (root-commit) 4ca81ee] ... |
| 5 | git remote add origin URL |
push 先に origin という名前を付ける | 何も表示されない(git remote -v で確認) |
| 6 | git push -u origin main |
リモートへ送り、追跡関係を設定する | branch 'main' set up to track 'origin/main'. |
止まったときの逆引きも先に載せておきます。
| 表示されたエラー文 | 原因 | 直し方 |
|---|---|---|
error: remote origin already exists. |
origin が登録済み | git remote set-url origin 新URL |
error: src refspec main does not match any |
コミットがまだない/ブランチ名が main ではない | git commit してから push/git branch -M main |
! [rejected] main -> main (fetch first) |
リモートに手元にないコミット(README など)がある | git pull --rebase origin main → 再 push |
Permission denied (publickey). |
SSH の公開鍵がサーバー側に登録されていない | 鍵を作って登録/HTTPS の URL に切り替える |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「git initの使い方|既存フォルダを最初のpushまで進める手順」
前提と検証した環境
| 項目 | 内容 |
|---|---|
| Git | 2.43.0(Linux)。git --version で確認 |
| OpenSSH | 9.6p1 |
| GitHub CLI | 2.45.0(バージョン表示のみ確認) |
| リモート | 手元に作ったベアリポジトリ(git init --bare)を GitHub の代わりに使用 |
| SSH の再現 | 手元で起動した SSH サーバー(127.0.0.1)に対して push |
この記事の実行結果は、Git 2.43.0 で実際にコマンドを流して得た出力です。 ただし GitHub 本体には接続していないため、出力に含まれるフォルダのパス・リモート URL・ユーザー名は /home/taro/memo-app、github.com/taro/memo-app.git のような一般的な名前に置き換えています(表示は環境に合わせて置き換えています)。GitHub へ push したときに追加で表示される remote: で始まる行は載せていません。GitHub 上での PAT の発行、SSH 鍵の登録、gh repo create の実行は未実行で、該当箇所にその旨を書いています。
全体の流れ
flowchart LR
A[既存フォルダ] -->|git init| B[.git ができる]
B -->|.gitignore を書く| C[載せないものを除外]
C -->|git add .| D[ステージ]
D -->|git commit| E[ローカルの履歴]
E -->|git remote add origin| F[push 先を登録]
F -->|git push -u origin main| G[GitHub のリポジトリ]
git clone は「リモートにあるものを手元に持ってくる」コマンドで、git init は「手元にあるものを Git 管理にする」コマンドです。すでにファイルがあるフォルダを載せたいときは init から始めます。
既存フォルダを最初のpushまで進める一本道の手順
例として、次の内容の memo-app フォルダを使います。
memo-app/
├── .env (API_KEY=abc123 が書かれている。載せたくない)
├── README.md
├── logs/app.log (載せたくない)
└── src/app.py
手順0:名前とメールアドレスを登録する(最初の1回だけ)
git config --global user.name "Taro Yamada"
git config --global user.email taro@example.com
git config --global init.defaultBranch main
コミットには作成者の名前とメールアドレスが記録されます。3行目は、git init で作られる最初のブランチ名を main にする設定です(次の節で詳しく扱います)。
手順1:git init で Git 管理を始める
cd memo-app
git init
Initialized empty Git repository in /home/taro/memo-app/.git/
フォルダの中に .git という隠しフォルダができます。履歴や設定はすべてこの .git の中に入り、既存のファイルは1文字も書き換わりません。 やり直したいときは .git フォルダを消せば init の前の状態に戻ります。
現在のブランチ名を確認します。
git branch --show-current
main
手順2:.gitignore を先に用意する
git add の前に、載せないファイルを .gitignore に書きます。
printf '.env\nlogs/\n' > .gitignore
git status -s
?? .gitignore
?? README.md
?? src/
?? は「まだ Git が追跡していないファイル」という意味です。.env と logs/ が一覧から消えていれば、除外が効いています。 .gitignore を書く前の git status では、次のように .env と logs/ も表示されていました(init.defaultBranch を設定する前に取った出力のため、ブランチ名は master と表示されています)。
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env
README.md
logs/
src/
nothing added to commit but untracked files present (use "git add" to track)
| よく除外するもの | .gitignore の書き方 |
|---|---|
| 環境変数ファイル | .env |
| ログ | logs/、*.log |
| 依存パッケージ | node_modules/、vendor/、.venv/ |
| ビルド成果物 | dist/、build/、target/ |
| エディタ・OS のファイル | .vscode/、.idea/、.DS_Store |
手順3:git add でステージに載せる
git add .
git status -s
A .gitignore
A README.md
A src/app.py
A は「新しく追加されるファイル」です。ここで一覧を目で見て、載せたくないファイルが混ざっていないかを確認するのが、最初の push でいちばん効く習慣です。
手順4:最初のコミットを作る
git commit -m "最初のコミット"
[main (root-commit) 4ca81ee] 最初のコミット
3 files changed, 4 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 src/app.py
root-commit は、親を持たない最初のコミットという意味です。4ca81ee はコミットの ID(ハッシュ)の先頭7文字です。
手順5:GitHub で空のリポジトリを作り、origin として登録する
GitHub の画面で New repository を開き、リポジトリ名を入れて作成します。このとき 「Add a README file」「Add .gitignore」「Choose a license」は選ばずに作ると、手元の履歴とぶつからずに済みます(選んで作った場合の直し方は後述の fetch first の節にあります)。
作成後に表示される URL を origin という名前で登録します。
git remote add origin https://github.com/taro/memo-app.git
git remote -v
origin https://github.com/taro/memo-app.git (fetch)
origin https://github.com/taro/memo-app.git (push)
git remote add は成功しても何も表示しないので、git remote -v で確認します。origin はただの呼び名で、URL を毎回打たずに済むようにするための別名です。
手順6:最初の push
git push -u origin main
To https://github.com/taro/memo-app.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
-u(--set-upstream)は、手元の main とリモートの origin/main を結び付けるオプションです。最初の1回だけ付ければ、次からは git push と git pull だけで通ります。
結び付きは次のコマンドで確認できます。
git status -sb
git branch -vv
## main...origin/main
* main 4ca81ee [origin/main] 最初のコミット
main...origin/main や [origin/main] と表示されていれば、追跡設定は完了です。GitHub の画面を再読み込みすると、README.md・src・.gitignore の3つが並んでいます。
最初のブランチ名を main にそろえる(init.defaultBranch)
init.defaultBranch を設定していない環境で git init を実行すると、Git 2.43.0 では次のヒントが表示され、ブランチ名は master になりました。
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /home/taro/memo-app/.git/
GitHub で新しく作るリポジトリの既定ブランチは main なので、手元も main にそろえておくと push のコマンドがそのまま通ります。そろえ方は3通りあります。
| 方法 | コマンド | 効く範囲 | 向いている場面 |
|---|---|---|---|
| 設定で固定する | git config --global init.defaultBranch main |
以降のすべての git init |
自分の PC で一度だけ設定しておく |
| init のときに指定する | git init -b main |
その1回だけ | 設定を変えられない共有マシン |
| 後から名前を変える | git branch -M main |
いまのブランチ | すでに master で init した後 |
設定後に git init をやり直すと、ヒントは出なくなり、git branch --show-current は main を返しました。git branch -M main は、いまいるブランチの名前を main に変えるコマンドで、master のまま commit まで進んだ後でも使えます。
HTTPS(PAT)・SSH・gh repo create の3ルート比較
push のときに「自分が本人であること」を GitHub に伝える方法は、大きく3つあります。どれを選んでも、init から commit までの手順は同じで、変わるのは手順5と6だけです。
| 比べる点 | HTTPS + PAT | SSH | gh repo create |
|---|---|---|---|
| リモート URL の形 | https://github.com/taro/memo-app.git |
git@github.com:taro/memo-app.git |
自動で設定される |
| 本人確認に使うもの | PAT(個人用アクセストークン) | SSH の鍵ペア | gh auth login で保存した認証情報 |
| 最初の準備 | GitHub でトークンを発行 | 鍵を作り、公開鍵を GitHub に登録 | gh をインストールしてログイン |
| リポジトリの作成 | ブラウザで作る | ブラウザで作る | コマンド1つで作成から push まで |
| 有効期限 | トークンに期限を設定できる | 鍵を削除するまで有効 | ログインし直すまで有効 |
| 出会いやすいエラー | Authentication failed |
Permission denied (publickey) |
ログインしていない旨の表示 |
| 向いている人 | まず1回 push してみたい人 | 毎日 push する人 | ブラウザを開かずに済ませたい人 |
| この記事での検証 | 未実行(GitHub 上の操作が必要) | 手元の SSH サーバーで再現 | 未実行(バージョン表示のみ) |
ルートA:HTTPS + PAT
GitHub の HTTPS では、Git 操作でパスワードを聞かれたときに、アカウントのパスワードの代わりに PAT(Personal Access Token) を入力します。GitHub Docs の「Managing your personal access tokens」を今回開いて確認した要点は次のとおりです。
| 項目 | GitHub Docs に書かれている内容 |
|---|---|
| 推奨される種類 | classic よりも fine-grained personal access token を、可能な限り使うことを推奨 |
| push に必要な権限 | fine-grained では Contents を write(読み書き)にする |
| 使い方 | HTTPS の Git 操作でパスワードの代わりにトークンを入力する |
| 有効期限 | 期限を付けることを強く推奨。1年間使われていないトークンは自動で削除される |
手順は次のとおりです(GitHub 上の操作を含むため、この記事では未実行です)。
git remote add origin https://github.com/taro/memo-app.git
git push -u origin main
# Username for 'https://github.com': taro
# Password for 'https://taro@github.com': (ここに PAT を貼り付ける。画面には表示されない)
毎回の入力を省くには、Git の認証情報ヘルパー(Windows の Git Credential Manager、macOS のキーチェーンなど)に保存させます。トークンを URL に埋め込む書き方(https://トークン@github.com/...)は、.git/config に平文で残るので避け、ヘルパーに任せるのがおすすめです。
ルートB:SSH
SSH は、手元に秘密鍵、GitHub に公開鍵を置いて本人確認をする方法です。
ssh-keygen -t ed25519 -C "taro@example.com" # 鍵ペアを作る(~/.ssh/id_ed25519 と .pub)
cat ~/.ssh/id_ed25519.pub # 表示された公開鍵を GitHub の SSH keys に登録
git remote add origin git@github.com:taro/memo-app.git
git push -u origin main
ssh-keygen による鍵の作成と、登録済みの鍵での push が通ることは、手元の SSH サーバーで確認しました(結果は Permission denied の節に載せています)。GitHub の画面での公開鍵の登録と ssh -T git@github.com による接続確認は未実行です。
ルートC:gh repo create
GitHub CLI(gh)を使うと、リポジトリの作成・origin の登録・push を1コマンドで済ませられます。 ブラウザで空のリポジトリを作る手順5が不要になります。
gh auth login # 最初の1回だけ。対話形式でログイン
cd memo-app
git init -b main
git add . && git commit -m "最初のコミット"
gh repo create memo-app --private --source=. --remote=origin --push
GitHub CLI のマニュアル(gh repo create のページ)を今回開いて確認したオプションの意味は次のとおりです。
| オプション | 意味 |
|---|---|
--private / --public / --internal |
公開範囲を決める |
-s, --source |
元にするローカルリポジトリのパス(. で現在のフォルダ) |
-r, --remote |
登録するリモートの名前 |
--push |
ローカルのコミットを新しいリポジトリへ push する |
-d, --description |
リポジトリの説明文 |
gh repo create は GitHub へのログインが必要なため、この記事では未実行です(手元で確認したのは gh --version が 2.45.0 を返すところまで)。gh auth login の流れも未実行で、一般に知られた使い方として載せています。
どれを選ぶかの目安
| 状況 | おすすめ |
|---|---|
| とにかく今日1回 push できればよい | HTTPS + PAT |
| これから継続して使う自分の PC | SSH(一度設定すれば入力なしで push できる) |
| リポジトリをよく新規作成する | gh repo create |
| 社内のネットワークで SSH の 22 番ポートが通らない | HTTPS + PAT、または gh |
最初のpushで出会う4つのエラーを再現して直す
ここからは、エラーになる例を手元で再現し、表示されたメッセージと直し方を順に示します。
remote origin already exists
origin を登録した後に、もう一度 git remote add origin を実行すると表示されます。
git remote add origin https://github.com/taro/memo-app.git
error: remote origin already exists.
origin という名前はすでに使われている、という意味です。 URL を入れ直したいなら add ではなく set-url を使います。
git remote -v # いまの登録先を確認
git remote set-url origin https://github.com/taro/memo-app.git # URL を上書き
set-url は成功すると何も表示しません。HTTPS から SSH へ切り替えたいときも同じコマンドで、URL を git@github.com:taro/memo-app.git に変えるだけです。
| やりたいこと | コマンド |
|---|---|
| URL だけ直す | git remote set-url origin 新URL |
| 登録を消してやり直す | git remote remove origin → git remote add origin URL |
| 名前を変える | git remote rename origin old-origin |
src refspec main does not match any
「main という名前の push 元が見つからない」という意味で、原因は2つあります。
原因1:まだコミットがない。 git init と git remote add の直後に push すると再現します。
git init
git remote add origin https://github.com/taro/memo-app.git
git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/taro/memo-app.git'
ブランチは最初のコミットを作った時点で実体ができます。git add . と git commit -m "最初のコミット" を実行してから push すると通ります。
原因2:ブランチ名が main ではない。 master で init してコミットまで進めた状態で git push -u origin main を実行したときも、同じ2行が表示されました。
git branch --show-current # master と表示される
git branch -M main # main に名前を変える
git branch --show-current # main と表示される
git push -u origin main
| 確認すること | コマンド | 期待する表示 |
|---|---|---|
| コミットがあるか | git log --oneline |
1行以上表示される |
| ブランチ名 | git branch --show-current |
main |
rejected (fetch first)
GitHub でリポジトリを作るときに README を追加した場合など、リモートに手元にないコミットがあるときに表示されます。リモート側に「Initial commit」が1つある状態で push して再現しました。
git push -u origin main
To https://github.com/taro/memo-app.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/taro/memo-app.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
ヒントのとおり git pull origin main を実行すると、今度は取り込み方を選ぶよう求められました。
hint: You have divergent branches and need to specify how to reconcile them.
(中略)
fatal: Need to specify how to reconcile divergent branches.
取り込み方を明示すれば進みます。 いちばん履歴がすっきりするのは --rebase です。
git pull --rebase origin main
git log --oneline
git push -u origin main
Successfully rebased and updated refs/heads/main.
c92d43e 最初のコミット
914c7f0 Initial commit
To https://github.com/taro/memo-app.git
914c7f0..c92d43e main -> main
branch 'main' set up to track 'origin/main'.
リモートの「Initial commit」の上に、手元の「最初のコミット」が1本につながり、push が通りました。
マージで取り込む方法も試しました。git pull --no-rebase origin main は、共通の祖先がない2つの履歴をつなぐことになるため、次の表示で止まります。
fatal: refusing to merge unrelated histories
この場合は --allow-unrelated-histories を付けます。
git pull --no-rebase --allow-unrelated-histories --no-edit origin main
git log --oneline --graph
Merge made by the 'ort' strategy.
README.md | 1 +
app.txt | 1 +
2 files changed, 2 insertions(+)
* b2e3e6f Merge branch 'main' of https://github.com/taro/memo-app
|\
| * c92d43e 最初のコミット
| * 914c7f0 Initial commit
* 3f16b4b 最初のコミット
| 取り込み方 | コマンド | 履歴の形 |
|---|---|---|
| リベース | git pull --rebase origin main |
一直線(リモートのコミットの上に自分のコミット) |
| マージ | git pull --no-rebase --allow-unrelated-histories origin main |
マージコミットが1つ増える |
なお、git push --force でリモートを上書きする方法もありますが、リモート側のコミット(README など)が消えます。作ったばかりで自分しか使っていないリポジトリに限った選択肢と考え、まずは --rebase で取り込むのがおすすめです。
Permission denied (publickey)
SSH の URL で push したとき、サーバー側に登録されていない鍵で接続すると表示されます。手元の SSH サーバーに、未登録の鍵で push して再現しました(ホスト名とユーザー名は GitHub の形に置き換えています)。
git remote set-url origin git@github.com:taro/memo-app.git
git push -u origin main
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
登録済みの鍵に切り替えて同じコマンドを実行すると、push は通りました。
To github.com:taro/memo-app.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
| 確認すること | コマンド | 見るところ |
|---|---|---|
| 鍵があるか | ls ~/.ssh |
id_ed25519 と id_ed25519.pub があるか |
| 公開鍵の内容 | cat ~/.ssh/id_ed25519.pub |
GitHub の SSH keys に同じものが登録されているか |
| どの鍵を出しているか | ssh -vT git@github.com |
Offering public key の行(未実行。一般に知られた確認方法) |
| すぐに push したい | git remote set-url origin https://github.com/taro/memo-app.git |
HTTPS + PAT に切り替える |
鍵の準備に時間がかかりそうなときは、URL を HTTPS に切り替えて先に push を済ませ、後から SSH に戻す進め方もできます。
エラーと直し方の一覧
| エラー文 | 起きる場面 | 原因 | 直し方 | 再現 |
|---|---|---|---|---|
remote origin already exists. |
git remote add origin |
origin が登録済み | git remote set-url origin URL |
実行済み |
src refspec main does not match any |
git push |
コミットがない | git add . → git commit |
実行済み |
src refspec main does not match any |
git push |
ブランチ名が master | git branch -M main |
実行済み |
! [rejected] ... (fetch first) |
git push |
リモートに README などのコミットがある | git pull --rebase origin main |
実行済み |
Need to specify how to reconcile divergent branches. |
git pull |
取り込み方が未指定 | --rebase か --no-rebase を付ける |
実行済み |
refusing to merge unrelated histories |
git pull --no-rebase |
共通の祖先がない | --allow-unrelated-histories を付ける |
実行済み |
Permission denied (publickey). |
SSH での push | 公開鍵が未登録 | 鍵を登録/HTTPS に切り替える | 手元の SSH サーバーで実行済み |
Authentication failed |
HTTPS での push | トークンの入力違い・期限切れ | PAT を発行し直して入力 | 未実行 |
.gitignoreを後から効かせる方法
.gitignore は「まだ追跡されていないファイル」にだけ効きます。 すでにコミットしたファイルは、後から .gitignore に書いても追跡され続けます。.env と logs/app.log をコミットした後で .gitignore を書き、ログを更新して確認しました。
printf '.env\nlogs/\n' > .gitignore
echo y >> logs/app.log
git status -s
M logs/app.log
?? .gitignore
.gitignore に logs/ と書いたのに、logs/app.log が変更あり(M)として出ています。追跡をやめるには git rm --cached を使います。
git rm -r --cached .env logs
git add .gitignore
git status -s
rm '.env'
rm 'logs/app.log'
D .env
A .gitignore
D logs/app.log
--cached は「Git の管理からだけ外し、手元のファイルは残す」という指定です。コミットしてから、ファイルが残っていることと、変更が無視されることを確認します。
git commit -m ".envとlogsを管理対象から外す"
echo z >> logs/app.log
git status -s # 何も表示されない
ls -a
git check-ignore -v .env logs/app.log
[main d2550e2] .envとlogsを管理対象から外す
3 files changed, 2 insertions(+), 2 deletions(-)
delete mode 100644 .env
create mode 100644 .gitignore
delete mode 100644 logs/app.log
. .. .env .git .gitignore app.py logs
.gitignore:1:.env .env
.gitignore:2:logs/ logs/app.log
git check-ignore -v は、どのファイルの何行目のルールで無視されているかを教えてくれます。
| 状況 | 対応 |
|---|---|
| まだ add していない | .gitignore に書くだけで効く |
| add したが commit していない | git rm --cached ファイル(または git restore --staged ファイル) |
| commit 済み | git rm -r --cached 対象 → commit |
| 全体をまとめてやり直したい | git rm -r --cached . → git add . → commit |
ここで1つ押さえておきたい点があります。git rm --cached は「これから先」の追跡をやめるだけで、過去のコミットには .env の中身が残ります。 過去の履歴からも取り除きたいときは、次の節の方法を使います。
誤って秘密情報をcommitしたときの戻し方
API キーやパスワードを含むファイルをコミットしたときの対応は、push の前か後かで変わります。
| 状況 | 対応 | 履歴から消えるか |
|---|---|---|
| 直前のコミットに入れた(push 前) | git rm --cached → git commit --amend |
消える |
| 最初のコミットに入れた(push 前) | git update-ref -d HEAD で作り直す |
消える |
| 数個前のコミットに入れた(push 前) | git rebase -i で該当コミットを編集 |
消える(未実行) |
| push した後 | まずキーを無効化して再発行。その後に履歴を書き換える | 書き換えても、公開されていた間に見られた可能性は残る |
直前のコミットに入れた場合(push 前)
2つ目のコミット「設定を追加」に .env を入れてしまった状態から始めます。
git log --oneline --name-only
19542ab 設定を追加
.env
app.py
bdec0a4 最初のコミット
app.py
.env を管理から外し、.gitignore に追加して、直前のコミットを作り直します。
git rm --cached .env
echo ".env" >> .gitignore
git add .gitignore
git commit --amend --no-edit
git log --oneline --name-only
rm '.env'
[main 8a3a91b] 設定を追加
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 .gitignore
8a3a91b 設定を追加
.gitignore
app.py
bdec0a4 最初のコミット
app.py
コミットの ID が 19542ab から 8a3a91b に変わり、.env が含まれないコミットに置き換わりました。git log --all --oneline -- .env を実行すると何も表示されず、ブランチの履歴に .env が残っていないことを確認できます。
最初のコミットに入れた場合(push 前)
コミットが1つしかないときは、git reset --soft HEAD~1 が使えません。実行すると次の表示になりました。
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
親のコミットがないためです。この場合は git update-ref -d HEAD でコミットだけを取り消します。
git update-ref -d HEAD # コミットを取り消す(ファイルとステージはそのまま)
git status -s
git rm --cached .env
echo ".env" > .gitignore
git add .
git commit -m "最初のコミット"
git log --oneline --name-only
A .env
A app.py
rm '.env'
[main (root-commit) 5612888] 最初のコミット
2 files changed, 2 insertions(+)
create mode 100644 .gitignore
create mode 100644 app.py
5612888 最初のコミット
.gitignore
app.py
.git フォルダごと消して git init からやり直す方法でも同じ結果になります。コミットが1つだけなら、どちらを選んでも構いません。
push した後の場合
push 済みのときは、順番が大切です。
- キーやパスワードを発行元で無効化し、新しいものを発行する(最優先。履歴を消しても、公開されていた間に取得された可能性は残るため)
- 手元の履歴から該当ファイルを取り除く(上の amend や、履歴全体を書き換えるツールを使う)
- 書き換えた履歴を
git push --force-with-leaseで反映する - .gitignore に追加し、同じことが起きないようにする
2〜3 の履歴の書き換えと強制 push は、この記事では未実行です。共有しているリポジトリでは他の人の作業にも影響するので、チームに知らせてから行います。
pushの前に見るチェックリスト
| 確認 | コマンド | よい状態 |
|---|---|---|
| ブランチ名が main か | git branch --show-current |
main |
| 載せないファイルが除外されているか | git status -s |
.env やログが出ない |
| コミットに入るファイル | git log --oneline --name-only |
意図したファイルだけ |
| push 先の URL | git remote -v |
自分のリポジトリの URL |
| 追跡設定 | git branch -vv |
[origin/main] が付いている |
よくある質問
Q. git init を間違ったフォルダで実行しました。元に戻せますか?
A. そのフォルダの .git フォルダを削除すれば、init する前の状態に戻ります。既存のファイルは変更されていません。git rev-parse --show-toplevel で、いまどのフォルダが Git 管理の起点になっているかを確認してから削除すると確実です。
Q. git init をもう一度実行すると、履歴は消えますか? A. 消えません。すでに .git があるフォルダで実行すると「Reinitialized existing Git repository」と表示され、既存の履歴や設定はそのまま残ります(一般に知られた仕様で、この記事では出力を取っていません)。
Q. git push -u origin main の -u は毎回必要ですか?
A. 最初の1回だけで十分です。branch 'main' set up to track 'origin/main'. と表示された後は、git push だけで同じ宛先に送られます。新しいブランチを初めて push するときに、もう一度 -u を付けます。
Q. GitHub で README を付けてリポジトリを作ってしまいました。作り直すべきですか?
A. 作り直さなくて大丈夫です。git pull --rebase origin main でリモートの README を取り込んでから push すれば、そのまま使えます。手順は「rejected (fetch first)」の節のとおりです。
まとめ
- 既存フォルダは
git init→ .gitignore →git add .→git commit→git remote add origin→git push -u origin mainの6手で GitHub に載せられる - 最初のブランチ名は
git config --global init.defaultBranch mainでそろえておくと、push がそのまま通る - 接続方法は HTTPS+PAT・SSH・gh repo create の3つ。変わるのはリモートの登録と push の部分だけ
remote origin already existsはset-url、src refspecは commit とブランチ名、fetch firstはpull --rebase、Permission denied (publickey)は鍵の登録で直せる- .gitignore は追跡前のファイルにだけ効く。追跡済みのファイルは
git rm --cachedで外す - 秘密情報を commit したら、push 前なら amend で作り直し、push 後ならまずキーを無効化して再発行する
git add .の後にgit status -sで一覧を見る習慣が、最初の push をいちばん確実にする
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「git initの使い方|既存フォルダを最初のpushまで進める手順」
株式会社RJCでは、git initから最初のpushまでの手順のような開発の基礎を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。