<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Git  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/git/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Wed, 30 Sep 2026 02:18:09 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>Git  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>「修正したら動かない」を卒業するGit入門―Linuxでの導入・使い方とGitHub・GitLab・Bitbucketの違い</title>
		<link>https://blog.takeho.com/h7g01v70k3ryhqt5pqqvj4ebwu0o0tn4/</link>
					<comments>https://blog.takeho.com/h7g01v70k3ryhqt5pqqvj4ebwu0o0tn4/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Wed, 30 Sep 2026 05:10:00 +0000</pubDate>
				<category><![CDATA[現場IT]]></category>
		<category><![CDATA[Bitbucket]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[GitLab]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=2016</guid>

					<description><![CDATA[「ちょっと直しただけなのに、サイトが動かなくなった」 「修正前のファイルは、どこに保存したっけ？」 「最終版、最終版2、本当の最終版……結局どれが最新？」 こんな経験はありませんか。ファイルをコピーして残す方法でも、小さ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>「ちょっと直しただけなのに、サイトが動かなくなった」</p>



<p>「修正前のファイルは、どこに保存したっけ？」</p>



<p>「最終版、最終版2、本当の最終版……結局どれが最新？」</p>



<p>こんな経験はありませんか。ファイルをコピーして残す方法でも、小さな作業なら対応できます。しかし、修正が増え、担当者が増えると、いつ何を変えたのかを追いかけるだけで時間がかかります。</p>



<p>そこで役立つのが、バージョン管理ツールのGit（ギット）です。</p>



<p>Gitを使うと、ファイルの変更を記録し、修正前後の違いを確認し、必要に応じて過去の内容を取り戻せます。一人でPHPを書いている場合にも、Linuxサーバーの設定や運用スクリプトを管理する場合にも使えます。</p>



<p>この記事では、Gitの概要からLinuxでの導入、日常的な操作、GitHub・GitLab・Bitbucketとの連携まで、手を動かしながら解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Gitとは？「変更の履歴」を管理する道具</a></li><li><a href="#toc2" tabindex="0">なぜGitが必要なのか？現場で起きる4つの事例</a><ol><li><a href="#toc3" tabindex="0">事例1：PHPを修正したらログインできなくなった</a></li><li><a href="#toc4" tabindex="0">事例2：二人が同じファイルを編集した</a></li><li><a href="#toc5" tabindex="0">事例3：担当者が変わり、変更の理由が分からない</a></li><li><a href="#toc6" tabindex="0">事例4：AIに修正を頼んだら、想定以上に書き換わった</a></li></ol></li><li><a href="#toc7" tabindex="0">GitとGitHubは別のもの</a></li><li><a href="#toc8" tabindex="0">最初に覚える言葉は、この7つ</a></li><li><a href="#toc9" tabindex="0">LinuxにGitをインストールする</a><ol><li><a href="#toc10" tabindex="0">Rocky Linux・AlmaLinux・RHEL系</a></li><li><a href="#toc11" tabindex="0">Ubuntu・Debian系</a></li><li><a href="#toc12" tabindex="0">インストールを確認する</a></li></ol></li><li><a href="#toc13" tabindex="0">名前とメールアドレスを設定する</a></li><li><a href="#toc14" tabindex="0">練習用のリポジトリを作る</a><ol><li><a href="#toc15" tabindex="0">HTMLファイルを作成する</a></li></ol></li><li><a href="#toc16" tabindex="0">管理しないファイルを.gitignoreで指定する</a></li><li><a href="#toc17" tabindex="0">最初のコミットをする</a></li><li><a href="#toc18" tabindex="0">ファイルを変更し、差分と履歴を確認する</a><ol><li><a href="#toc19" tabindex="0">git diffとgit diff &#8211;cachedの違い</a></li></ol></li><li><a href="#toc20" tabindex="0">「戻す」は、状況に応じて使い分ける</a><ol><li><a href="#toc21" tabindex="0">まだステージングしていない変更を取り消す</a></li><li><a href="#toc22" tabindex="0">git addの選択だけを取り消す</a></li><li><a href="#toc23" tabindex="0">コミット済みの変更を取り消す</a></li></ol></li><li><a href="#toc24" tabindex="0">ブランチで、作業の流れを分ける</a></li><li><a href="#toc25" tabindex="0">GitHub・GitLab・Bitbucketの違いを詳しく知る</a><ol><li><a href="#toc26" tabindex="0">GitHub：コード共有とレビュー、自動化を組み合わせる</a></li><li><a href="#toc27" tabindex="0">GitLab：コード管理からテスト・公開までをまとめる</a></li><li><a href="#toc28" tabindex="0">Bitbucket：Jiraで管理する仕事とコード変更をつなげる</a></li><li><a href="#toc29" tabindex="0">3サービスを比較する</a></li></ol></li><li><a href="#toc30" tabindex="0">LinuxからSSHで接続する準備</a><ol><li><a href="#toc31" tabindex="0">公開鍵と秘密鍵とは？</a></li><li><a href="#toc32" tabindex="0">既存の鍵を確認してから作成する</a></li></ol></li><li><a href="#toc33" tabindex="0">GitHubへ初めて送る</a><ol><li><a href="#toc34" tabindex="0">手順1：公開鍵を登録する</a></li><li><a href="#toc35" tabindex="0">手順2：接続を確認する</a></li><li><a href="#toc36" tabindex="0">手順3：空のリポジトリを作る</a></li><li><a href="#toc37" tabindex="0">手順4：共有先を登録し、pushする</a></li></ol></li><li><a href="#toc38" tabindex="0">GitLabとBitbucketで使う場合</a><ol><li><a href="#toc39" tabindex="0">GitLab.comの場合</a></li><li><a href="#toc40" tabindex="0">Bitbucket Cloudの場合</a></li><li><a href="#toc41" tabindex="0">すでにGitHubをoriginとして登録した場合</a></li></ol></li><li><a href="#toc42" tabindex="0">別のLinux環境で続きを作業する</a></li><li><a href="#toc43" tabindex="0">チームで使う基本の流れ</a></li><li><a href="#toc44" tabindex="0">競合が起きたらどうする？</a></li><li><a href="#toc45" tabindex="0">Linuxの現場で管理すると便利なもの</a></li><li><a href="#toc46" tabindex="0">導入時に押さえておきたいこと</a><ol><li><a href="#toc47" tabindex="0">データベースやアップロード画像は別にバックアップする</a></li><li><a href="#toc48" tabindex="0">.gitをWebから読める状態にしない</a></li><li><a href="#toc49" tabindex="0">変更は「説明できる単位」で記録する</a></li><li><a href="#toc50" tabindex="0">pushに失敗したら、まず原因を確認する</a></li></ol></li><li><a href="#toc51" tabindex="0">よく使うコマンド早見表</a></li><li><a href="#toc52" tabindex="0">最初は、一つのフォルダーから始めればよい</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Gitとは？「変更の履歴」を管理する道具</span></h2>



<p>Gitは、ファイルがどのように変わったかを記録する、分散型のバージョン管理ツールです。「分散型」とは、手元のPCやサーバーにも履歴を持てる仕組みのことです。</p>



<p>例えば、問い合わせフォームのプログラムを修正したとします。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>記録した変更</th><th>後から分かること</th></tr></thead><tbody><tr><td>問い合わせフォームを作成</td><td>最初の実装内容</td></tr><tr><td>メールアドレスの入力チェックを追加</td><td>どのチェックを追加したか</td></tr><tr><td>送信ボタンの二重押しを防止</td><td>二重送信対策の内容</td></tr><tr><td>メール送信エラーを修正</td><td>エラーへの対応内容</td></tr></tbody></table></figure>



<p>Gitには、変更した内容とともに、作成者として設定した名前・メールアドレスや日時、説明を残せます。ただし、作成者情報は設定値なので、それだけで本人確認ができるわけではありません。</p>



<p>大切なのは、<strong>「現在のファイル」だけでなく、「そこに至る変更の経緯」を残せること</strong>です。</p>



<p>Gitは導入しただけで変更を自動記録するわけではありません。後で説明する「コミット」という操作で、記録する区切りを自分で決めます。</p>



<h2 class="wp-block-heading"><span id="toc2">なぜGitが必要なのか？現場で起きる4つの事例</span></h2>



<p>以下は、Gitの使いどころを説明するための想定事例です。</p>



<h3 class="wp-block-heading"><span id="toc3">事例1：PHPを修正したらログインできなくなった</span></h3>



<p>ログイン画面の見た目を変更するつもりでPHPを修正したところ、認証まで動かなくなりました。</p>



<p>Gitを使っていないと、「どのファイルの、どの行を変更したか」を思い出すところから始まります。バックアップがあっても、そこから先に行った正常な修正まで消してしまうかもしれません。</p>



<p>Gitで変更を記録していれば、修正前後の差分を確認できます。問題の変更を見つけ、必要な範囲で取り消すこともできます。</p>



<p>ただし、Gitは原因を自動診断するツールではありません。差分や履歴を調査の材料として使い、動作確認と組み合わせます。</p>



<h3 class="wp-block-heading"><span id="toc4">事例2：二人が同じファイルを編集した</span></h3>



<p>Aさんが問い合わせフォームを修正し、Bさんが同じファイルに別の項目を追加しました。FTPで順番にアップロードすると、後からアップロードした内容で前の変更を上書きしてしまうことがあります。</p>



<p>Gitでは、それぞれの変更を取り込んでまとめる「マージ」ができます。同じ箇所を変更して自動で判断できない場合には、「競合」として人の確認を求めます。</p>



<p>自動でマージできても、組み合わせた結果が正しく動くとは限りません。変更内容のレビューとテストは必要です。</p>



<h3 class="wp-block-heading"><span id="toc5">事例3：担当者が変わり、変更の理由が分からない</span></h3>



<p>Linuxの運用スクリプトに、用途が分からない条件分岐がありました。削除してよいか判断できず、前任者への確認もできません。</p>



<p>履歴に「バックアップ先の容量不足時は処理を止める」と記録してあれば、その変更の目的を理解しやすくなります。</p>



<p><strong>Gitの価値は、戻せることだけでなく、次の担当者に理由を残せることにもあります。</strong></p>



<h3 class="wp-block-heading"><span id="toc6">事例4：AIに修正を頼んだら、想定以上に書き換わった</span></h3>



<p>AIに「このエラーだけ直して」と頼んだところ、別の処理まで書き換わることがあります。</p>



<p>修正前にコミットしておけば、AIによる変更を差分で確認できます。必要な変更かどうかを判断してから、次のコミットに残せます。</p>



<p>AIがコードを書くようになっても、「どこを変えたのか」を確認する仕事は残ります。Gitは、その確認を支える道具です。</p>



<h2 class="wp-block-heading"><span id="toc7">GitとGitHubは別のもの</span></h2>



<p>まず、混同しやすい言葉を整理しましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>名前</th><th>役割</th></tr></thead><tbody><tr><td>Git</td><td>ファイルの変更履歴を管理するツール</td></tr><tr><td>GitHub</td><td>Gitで管理したコードを保存・共有し、レビューや自動処理を行うサービス</td></tr><tr><td>GitLab</td><td>Gitの共有に加え、開発・テスト・公開などを管理するサービス／製品</td></tr><tr><td>Bitbucket</td><td>Gitの共有やレビューを行い、Jiraなどと連携できるAtlassianのサービス／製品</td></tr></tbody></table></figure>



<p><strong>Gitは手元で使う道具、GitHubなどはチームで共有する場所と機能</strong>と考えると分かりやすくなります。</p>



<p>Gitだけなら、アカウントを作らずに使い始められます。GitHubなどへの通信ができない状況でも、手元で履歴を確認したり、コミットしたりできます。</p>



<p>この記事では、連携先としてGitHub.com、GitLab.com、Bitbucket Cloudを扱います。</p>



<h2 class="wp-block-heading"><span id="toc8">最初に覚える言葉は、この7つ</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>用語</th><th>意味</th></tr></thead><tbody><tr><td>リポジトリ</td><td>ファイルと変更履歴を管理する場所。プロジェクトの保管庫</td></tr><tr><td>作業ツリー</td><td>現在編集しているファイルが置かれている場所</td></tr><tr><td>ステージング</td><td>次の記録に含める変更を選ぶこと</td></tr><tr><td>コミット</td><td>選んだ変更を、説明付きで履歴に記録すること</td></tr><tr><td>ブランチ</td><td>作業の流れを分ける仕組み。新機能や修正を別の流れで進める</td></tr><tr><td>マージ</td><td>別のブランチで進めた変更を取り込むこと</td></tr><tr><td>リモート</td><td>GitHubなどにある、共有先のリポジトリ</td></tr></tbody></table></figure>



<p>基本操作は、<strong>編集 → 記録する変更を選ぶ → 内容を確認 → コミット</strong>です。</p>



<p>GitHubなどへ共有するときは、その後に「push」を行います。コミットしただけでは、共有先には送られません。</p>



<h2 class="wp-block-heading"><span id="toc9">LinuxにGitをインストールする</span></h2>



<p>ここからは、ログイン中の一般ユーザーが所有するホームディレクトリで練習します。本番サイトのファイルを直接変更する必要はありません。</p>



<p>Git操作は通常のユーザーで行い、パッケージのインストール時だけ<code>sudo</code>を使います。</p>



<h3 class="wp-block-heading"><span id="toc10">Rocky Linux・AlmaLinux・RHEL系</span></h3>



<pre class="wp-block-code"><code>sudo dnf install git openssh-clients</code></pre>



<p><code>git</code>はバージョン管理ツール、<code>openssh-clients</code>は後半で使うSSH接続や鍵作成のためのパッケージです。</p>



<h3 class="wp-block-heading"><span id="toc11">Ubuntu・Debian系</span></h3>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install git openssh-client</code></pre>



<p><code>apt update</code>でパッケージ一覧を更新し、GitとSSHクライアントをインストールします。</p>



<h3 class="wp-block-heading"><span id="toc12">インストールを確認する</span></h3>



<pre class="wp-block-code"><code>git --version</code></pre>



<p>Gitのバージョンが表示されれば、インストールを確認できます。バージョン番号はOSや配布パッケージによって異なります。</p>



<p>この記事の<code>git switch</code>と<code>git restore</code>はGit 2.23以降を前提にしています。古い環境では、OSでサポートされる更新方法を確認してください。</p>



<p>参考：<a href="https://git-scm.com/install/linux">Git公式・Linuxへのインストール</a></p>



<h2 class="wp-block-heading"><span id="toc13">名前とメールアドレスを設定する</span></h2>



<p>コミットに記録する情報を設定します。以下の名前とメールアドレスは自分のものに置き換えてください。</p>



<pre class="wp-block-code"><code>git config --global user.name "Taro Yamada"
git config --global user.email "taro@example.com"</code></pre>



<p><code>--global</code>は、現在のLinuxユーザーが使うGitの共通設定にする指定です。他のLinuxユーザーには適用されません。</p>



<p>確認します。</p>



<pre class="wp-block-code"><code>git config --global --get user.name
git config --global --get user.email</code></pre>



<p>これはGitHubなどへのログイン設定ではありません。コミットの作成者情報です。公開するリポジトリでは、このメールアドレスが履歴から見える点にも注意してください。GitHubではアカウントのメール設定で確認できる非公開用アドレスを使う方法もあります。</p>



<p>会社のプロジェクトだけ別の情報にする場合は、そのリポジトリ内で<code>--global</code>を付けずに設定します。</p>



<pre class="wp-block-code"><code>git config user.name "Taro Yamada"
git config user.email "taro@company.example.com"</code></pre>



<h2 class="wp-block-heading"><span id="toc14">練習用のリポジトリを作る</span></h2>



<p>ホームディレクトリに練習用フォルダーを作ります。</p>



<pre class="wp-block-code"><code>mkdir -p ~/git-practice/example-site
cd ~/git-practice/example-site
git init
git branch -M main</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>意味</th></tr></thead><tbody><tr><td><code>mkdir -p</code></td><td>必要なフォルダーを作成する</td></tr><tr><td><code>cd</code></td><td>作業するフォルダーへ移動する</td></tr><tr><td><code>git init</code></td><td>そのフォルダーをGitの管理対象にする</td></tr><tr><td><code>git branch -M main</code></td><td>初期ブランチの名前を<code>main</code>にそろえる</td></tr></tbody></table></figure>



<p><code>git init</code>を実行すると、<code>.git</code>という管理用ディレクトリが作られます。この中に履歴などが保存されるため、削除しないようにします。</p>



<h3 class="wp-block-heading"><span id="toc15">HTMLファイルを作成する</span></h3>



<pre class="wp-block-code"><code>cat &gt; index.html &lt;&lt;'EOF'
&lt;!doctype html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Git練習サイト&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;Gitの練習を始めます&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
EOF</code></pre>



<p><code>cat &gt; ファイル名</code>は、続く内容をファイルに書き込む操作です。同名のファイルがあると上書きされるので、この練習用フォルダーで実行します。</p>



<p>続けて、プロジェクトの説明を作ります。</p>



<pre class="wp-block-code"><code>cat &gt; README.md &lt;&lt;'EOF'
# Git練習サイト

LinuxでGitの基本操作を学ぶためのサンプルです。
EOF</code></pre>



<p><code>README.md</code>は、目的や使い方を記載するファイルです。GitHubなどでも、プロジェクトの説明として表示できます。</p>



<h2 class="wp-block-heading"><span id="toc16">管理しないファイルを.gitignoreで指定する</span></h2>



<p>すべてのファイルをGitへ入れる必要はありません。パスワードなどが入る環境設定、ログ、一時ファイルなどは、管理対象から除外します。</p>



<pre class="wp-block-code"><code>cat &gt; .gitignore &lt;&lt;'EOF'
.env
.env.*
!.env.example
*.log
*.pem
*.key
/node_modules/
/vendor/
/backups/
EOF</code></pre>



<p>この例では、<code>.env</code>や<code>.env.production</code>を除外し、設定例として使う<code>.env.example</code>は例外にしています。<code>.env.example</code>にも本物のパスワードやAPIキーは入れません。</p>



<p><code>*.pem</code>と<code>*.key</code>は、この入門例で鍵ファイルを誤登録しにくくする指定です。PEM形式には公開証明書もあるため、実際のプロジェクトでは用途に合わせて調整してください。</p>



<p><code>vendor</code>や<code>node_modules</code>を除外する場合でも、依存関係を再現するための<code>composer.lock</code>や<code>package-lock.json</code>などは、プロジェクトの方針に沿って管理します。</p>



<p><strong>.gitignoreは、すでにGitで追跡されているファイルには効きません。</strong> また、秘密情報を一度コミットした後でファイルを削除しても、過去の履歴には残ります。漏えいした鍵やパスワードの無効化・再発行と、履歴への対応が必要になります。</p>



<p>参考：<a href="https://git-scm.com/docs/gitignore">Git公式・gitignore</a></p>



<h2 class="wp-block-heading"><span id="toc17">最初のコミットをする</span></h2>



<p>まず、現在の状態を確認します。</p>



<pre class="wp-block-code"><code>git status</code></pre>



<p>新しく作ったファイルは、まだ追跡されていないファイルとして表示されます。次に、記録するファイルを指定します。</p>



<pre class="wp-block-code"><code>git add index.html README.md .gitignore
git diff --cached</code></pre>



<p><code>git add</code>は、指定したファイルの現在の内容をステージングします。<code>git diff --cached</code>で、コミットに含まれる変更を確認します。</p>



<p>問題がなければ、コミットします。</p>



<pre class="wp-block-code"><code>git commit -m "練習サイトの初期ファイルを追加"
git status</code></pre>



<p><code>-m</code>の後ろは、変更の説明です。「修正」「更新」だけでなく、「何をしたか」を残すと、後から役立ちます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>曖昧な説明</th><th>内容が分かる説明</th></tr></thead><tbody><tr><td>修正</td><td>問い合わせフォームにメールアドレス検証を追加</td></tr><tr><td>更新</td><td>バックアップ失敗時の通知処理を追加</td></tr><tr><td>対応</td><td>ログイン時の空欄入力で発生するエラーを修正</td></tr></tbody></table></figure>



<p>ここまでで、手元に最初の履歴ができました。まだGitHubなどには送っていません。</p>



<p>参考：<a href="https://git-scm.com/docs/git-commit">Git公式・git commit</a></p>



<h2 class="wp-block-heading"><span id="toc18">ファイルを変更し、差分と履歴を確認する</span></h2>



<p>見出しを書き換えてみます。</p>



<pre class="wp-block-code"><code>sed -i 's/Gitの練習を始めます/Gitで変更履歴を管理します/' index.html
git diff</code></pre>



<p><code>sed -i</code>は、指定した文字列をファイル内で置き換えます。ここではLinuxの<code>sed</code>を使っています。</p>



<p><code>git diff</code>では、通常、削除された行が<code>-</code>、追加された行が<code>+</code>で示されます。同じ行を書き換えた場合も、変更前の行と変更後の行として表示されます。</p>



<p>確認して記録します。</p>



<pre class="wp-block-code"><code>git add index.html
git diff --cached
git commit -m "トップページの見出しを変更"
git log --oneline</code></pre>



<p><code>git log --oneline</code>は、履歴を一行ずつ表示するコマンドです。先頭の英数字がコミットを識別するID、後ろが説明です。</p>



<p>直近のコミットで何を変更したかを見る場合は、次を使います。</p>



<pre class="wp-block-code"><code>git show HEAD</code></pre>



<p><code>HEAD</code>は、通常、現在のブランチの最新コミットを指します。</p>



<h3 class="wp-block-heading"><span id="toc19">git diffとgit diff &#8211;cachedの違い</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>主に確認するもの</th></tr></thead><tbody><tr><td><code>git diff</code></td><td>作業ファイルとステージング済み内容との差分</td></tr><tr><td><code>git diff --cached</code></td><td>ステージング済み内容と最新コミットとの差分</td></tr></tbody></table></figure>



<p><code>git add</code>した後にもう一度編集した場合、その追加の編集はまだステージングされていません。コミットに含めるには、再び<code>git add</code>します。</p>



<p>また、新規の未追跡ファイルは通常の<code>git diff</code>に出ません。<code>git status</code>も合わせて確認しましょう。</p>



<h2 class="wp-block-heading"><span id="toc20">「戻す」は、状況に応じて使い分ける</span></h2>



<p>Gitで戻せるのは、基本的に記録した内容です。コミットしていない作業を捨てると、その編集をGitから復元できるとは限りません。</p>



<h3 class="wp-block-heading"><span id="toc21">まだステージングしていない変更を取り消す</span></h3>



<p>例えば、先ほどの<code>index.html</code>を編集したものの、その編集を取り消したい場合です。</p>



<pre class="wp-block-code"><code>git diff -- index.html
git restore -- index.html</code></pre>



<p>先に差分を確認してから実行します。<code>git restore</code>は、通常、ステージング済みの内容に作業ファイルを戻します。ステージングしていなければ、最後にコミットした内容と一致します。</p>



<p><strong>この操作では、対象ファイルの未記録の編集が失われます。</strong> 残したい内容がある場合は実行しません。</p>



<h3 class="wp-block-heading"><span id="toc22">git addの選択だけを取り消す</span></h3>



<pre class="wp-block-code"><code>git restore --staged -- index.html</code></pre>



<p>この例は、最初のコミットがあるリポジトリで使います。ステージングを取り消しますが、作業ファイルの編集内容は残ります。</p>



<p>参考：<a href="https://git-scm.com/docs/git-restore">Git公式・git restore</a></p>



<h3 class="wp-block-heading"><span id="toc23">コミット済みの変更を取り消す</span></h3>



<p>共有済みの変更を取り消す場合は、「取り消したという新しい記録」を作る<code>git revert</code>が役立ちます。</p>



<pre class="wp-block-code"><code>git status
git log --oneline</code></pre>



<p>作業中の変更がないことを確認し、取り消したいコミットのIDを調べます。次の<code>COMMIT_ID</code>を実際のIDに置き換えて実行します。</p>



<pre class="wp-block-code"><code>git revert --no-edit COMMIT_ID</code></pre>



<p>元のコミットを消すのではなく、その変更を打ち消す新しいコミットを作ります。後の変更とぶつかる場合は、競合の解消が必要です。マージコミットを取り消す場合は追加の指定と検討が必要なので、この入門例とは分けて扱ってください。</p>



<p>参考：<a href="https://git-scm.com/docs/git-revert">Git公式・git revert</a></p>



<h2 class="wp-block-heading"><span id="toc24">ブランチで、作業の流れを分ける</span></h2>



<p>新機能を試すとき、すぐに通常のコードへ混ぜたくない場合があります。そこでブランチを使います。</p>



<p>ここでは、<code>main</code>を通常の変更をまとめるブランチとし、お知らせページを追加する作業を分けます。</p>



<pre class="wp-block-code"><code>git status
git switch -c feature/news-page</code></pre>



<p>作業中の変更がない状態で始めます。<code>-c</code>は、新しいブランチを作成して切り替える指定です。</p>



<pre class="wp-block-code"><code>cat &gt; news.html &lt;&lt;'EOF'
&lt;!doctype html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;お知らせ&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;お知らせ&lt;/h1&gt;
  &lt;p&gt;Gitの練習サイトを公開しました。&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
EOF

git add news.html
git diff --cached
git commit -m "お知らせページを追加"</code></pre>



<p>元のブランチへ戻ります。</p>



<pre class="wp-block-code"><code>git switch main
ls</code></pre>



<p><code>main</code>にはまだ追加していないため、通常、この時点では<code>news.html</code>が作業フォルダーからなくなります。</p>



<p>ブランチは、作業フォルダーを別の場所に複製する操作ではありません。<strong>切り替えると、同じフォルダー内のファイルが、そのブランチの内容に合わせて変わります。</strong></p>



<p>動作を確認する場合は<code>feature/news-page</code>に切り替え、内容を確認したら<code>main</code>へ戻して取り込みます。</p>



<pre class="wp-block-code"><code>git switch feature/news-page
# ファイルの内容や表示を確認する
git switch main
git merge feature/news-page
git log --oneline --graph --all</code></pre>



<p>この練習ではローカルでマージします。チーム開発では、後半のプルリクエスト／マージリクエストを経由して取り込む運用もできます。</p>



<p>参考：<a href="https://git-scm.com/docs/git-switch">Git公式・git switch</a>、<a href="https://git-scm.com/docs/git-merge">Git公式・git merge</a></p>



<h2 class="wp-block-heading"><span id="toc25">GitHub・GitLab・Bitbucketの違いを詳しく知る</span></h2>



<p>どのサービスを使っても、基本の<code>add</code>、<code>commit</code>、<code>push</code>などはGitのコマンドです。違うのは、共有先の機能や開発の進め方です。</p>



<h3 class="wp-block-heading"><span id="toc26">GitHub：コード共有とレビュー、自動化を組み合わせる</span></h3>



<p><a href="https://github.com/">GitHub</a>では、リポジトリを作り、コードや履歴をブラウザーで確認できます。</p>



<p>変更の提案には<strong>Pull Request（プルリクエスト）</strong>を使います。「この変更をmainに取り込んでよいですか」と提案し、差分を見ながらコメントやレビューを行う仕組みです。</p>



<p>不具合や作業項目を整理するIssuesも使えます。修正の提案と作業項目を関連付けると、「どの問題を直した変更か」を追いやすくなります。</p>



<p><strong>GitHub Actions</strong>では、コードを送った際のテストや、承認された変更の公開などを自動化できます。処理は<code>.github/workflows/</code>配下のYAMLファイルで定義します。</p>



<p>本記事で最初に試す共有先としてGitHubを使うのは、リポジトリの作成、変更の共有、レビューまでを一つの流れで学べるためです。会社で指定のサービスがある場合は、それに合わせれば問題ありません。</p>



<p>参考：<a href="https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests">プルリクエスト</a>、<a href="https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue">Issuesとの関連付け</a>、<a href="https://docs.github.com/en/actions/get-started/understand-github-actions">GitHub Actions</a></p>



<h3 class="wp-block-heading"><span id="toc27">GitLab：コード管理からテスト・公開までをまとめる</span></h3>



<p><a href="https://gitlab.com/">GitLab</a>では、変更の提案を<strong>Merge Request（マージリクエスト）</strong>と呼びます。GitHubのプルリクエストと同様に、変更内容を確認して取り込むための機能です。</p>



<p><strong>GitLab CI/CD</strong>では、<code>.gitlab-ci.yml</code>に処理を定義し、テスト、ビルド、公開などを実行できます。処理を実際に動かす実行環境をRunnerと呼びます。</p>



<p>GitLab.comを利用する方法に加え、<strong>GitLab Self-Managed</strong>として自社側で運用する方法もあります。コードや開発基盤を自社で管理したい場合の選択肢になりますが、サーバー構築、更新、バックアップ、監視などの運用も必要です。</p>



<p>参考：<a href="https://docs.gitlab.com/user/project/merge_requests/">マージリクエスト</a>、<a href="https://docs.gitlab.com/ci/pipelines/">GitLab CI/CD</a></p>



<h3 class="wp-block-heading"><span id="toc28">Bitbucket：Jiraで管理する仕事とコード変更をつなげる</span></h3>



<p><a href="https://bitbucket.org/product">Bitbucket</a>はAtlassianのGit管理サービス／製品です。本記事で扱うBitbucket Cloudでは、リポジトリ共有、プルリクエストによるレビュー、<strong>Bitbucket Pipelines</strong>による自動処理を利用できます。</p>



<p>Pipelinesの設定は<code>bitbucket-pipelines.yml</code>で行います。</p>



<p>特徴の一つは、Atlassianの課題管理ツール<strong>Jiraとの連携</strong>です。Jiraの課題とブランチ、コミット、プルリクエストを関連付けることで、作業の依頼とコード変更を追いやすくなります。Jiraを中心に開発を進めているチームでは、検討しやすい選択肢です。</p>



<p>参考：<a href="https://bitbucket.org/product">Bitbucketの概要</a>、<a href="https://support.atlassian.com/bitbucket-cloud/docs/get-started-with-bitbucket-pipelines/">Bitbucket Pipelines</a></p>



<h3 class="wp-block-heading"><span id="toc29">3サービスを比較する</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>GitHub</th><th>GitLab</th><th>Bitbucket Cloud</th></tr></thead><tbody><tr><td>変更を提案・レビューする機能</td><td>Pull Request</td><td>Merge Request</td><td>Pull Request</td></tr><tr><td>テストなどの自動化</td><td>GitHub Actions</td><td>GitLab CI/CD</td><td>Bitbucket Pipelines</td></tr><tr><td>自動処理の設定ファイル</td><td><code>.github/workflows/*.yml</code></td><td><code>.gitlab-ci.yml</code></td><td><code>bitbucket-pipelines.yml</code></td></tr><tr><td>選ぶ際の着眼点</td><td>コード共有、レビュー、周辺機能を使う</td><td>開発・テスト・公開をまとめる／自社運用も検討する</td><td>Jiraとの連携を中心に使う</td></tr></tbody></table></figure>



<p>機能の利用条件、実行時間、保存容量、承認ルールなどはプランによって異なります。料金や上限は変わるため、利用開始時に各社の公式情報を確認してください。</p>



<p>なお、<strong>CIは、変更を取り込む際にテストなどを継続的に実行する仕組み</strong>です。CDは、リリース可能な状態を維持したり、公開まで自動化したりする仕組みを指します。</p>



<p>Gitに変更を送るだけで、自動的に本番サイトが更新されるわけではありません。公開処理は別途設定します。</p>



<h2 class="wp-block-heading"><span id="toc30">LinuxからSSHで接続する準備</span></h2>



<p>GitHubなどへの接続にはHTTPSとSSHがあります。ここでは、3サービスで共通して使えるSSHを例にします。</p>



<h3 class="wp-block-heading"><span id="toc31">公開鍵と秘密鍵とは？</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>種類</th><th>用途</th></tr></thead><tbody><tr><td>公開鍵</td><td>GitHubなどに登録する。通常、ファイル名は<code>.pub</code>で終わる</td></tr><tr><td>秘密鍵</td><td>手元で本人側の認証に使う。他の人やサービスへ渡さない</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc32">既存の鍵を確認してから作成する</span></h3>



<pre class="wp-block-code"><code>ls -al ~/.ssh</code></pre>



<p>ディレクトリがないという表示なら、まだ作成されていない可能性があります。既存の鍵を上書きしないよう、この記事では専用の名前を使います。</p>



<pre class="wp-block-code"><code>mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "taro@example.com" -f ~/.ssh/id_ed25519_git_services</code></pre>



<p>同名のファイルがある場合、上書きを承認せず、別名にしてください。作成時には、秘密鍵を保護するパスフレーズの入力を求められます。</p>



<p>作成した鍵をSSHエージェントに登録します。</p>



<pre class="wp-block-code"><code>eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_git_services
cat ~/.ssh/id_ed25519_git_services.pub</code></pre>



<p>最後のコマンドで表示される<strong>公開鍵</strong>をサービスへ登録します。<code>.pub</code>の付いていない秘密鍵はコピーしません。ログインし直した際には、環境によってエージェントへの再登録が必要です。</p>



<p>以下は一台・一アカウントずつ使う入門例です。複数の業務アカウントを使う場合は、鍵とSSH設定を分ける運用を検討します。</p>



<p>参考：<a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent">GitHub公式・SSH鍵の作成</a></p>



<h2 class="wp-block-heading"><span id="toc33">GitHubへ初めて送る</span></h2>



<h3 class="wp-block-heading"><span id="toc34">手順1：公開鍵を登録する</span></h3>



<p>GitHubにログインし、アカウント設定の<strong>SSH and GPG keys</strong>からSSH鍵を追加します。タイトルには「Rocky Linux 開発環境」など、どの環境の鍵か分かる名前を付けます。</p>



<p>登録するのは、前の手順で表示した公開鍵です。用途の選択がある場合は、接続認証用の鍵として登録します。</p>



<h3 class="wp-block-heading"><span id="toc35">手順2：接続を確認する</span></h3>



<pre class="wp-block-code"><code>ssh -T git@github.com</code></pre>



<p>初回接続でホスト鍵の確認が出たら、表示されたフィンガープリントを公式情報と照合してから承認します。</p>



<p>GitHubでは、認証成功とシェル接続を提供しない旨が表示されます。SSH認証に成功しても、この確認コマンドの終了コードは1になります。</p>



<p>参考：<a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints">GitHubのホスト鍵情報</a></p>



<h3 class="wp-block-heading"><span id="toc36">手順3：空のリポジトリを作る</span></h3>



<p>GitHubで新しいリポジトリを作成し、名前を<code>example-site</code>にします。</p>



<p>今回は手元にファイルと履歴があるため、GitHub側ではREADME、.gitignore、ライセンスの追加を選ばず、<strong>空のリポジトリ</strong>を作成します。公開範囲は、練習ならPrivateを選んで進められます。</p>



<h3 class="wp-block-heading"><span id="toc37">手順4：共有先を登録し、pushする</span></h3>



<p>次の<code>YOUR_USER</code>を自分のGitHubユーザー名に置き換えます。URLは作成したリポジトリの画面に表示されるSSH URLを使うのが確実です。</p>



<pre class="wp-block-code"><code>cd ~/git-practice/example-site
git remote add origin git@github.com:YOUR_USER/example-site.git
git remote -v
git push -u origin main</code></pre>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド／指定</th><th>意味</th></tr></thead><tbody><tr><td><code>remote add</code></td><td>共有先を登録する</td></tr><tr><td><code>origin</code></td><td>共有先に付ける名前。慣例として使われる</td></tr><tr><td><code>remote -v</code></td><td>登録されている共有先を確認する</td></tr><tr><td><code>push</code></td><td>手元のコミットを共有先へ送る</td></tr><tr><td><code>-u</code></td><td>今後の送受信に使う追跡先を設定する</td></tr></tbody></table></figure>



<p>GitHubのリポジトリ画面を開き、ファイルとコミットが表示されることを確認します。</p>



<p>以後、変更をコミットした後は、同じブランチなら通常<code>git push</code>で送れます。</p>



<p>参考：<a href="https://docs.github.com/ja/migrations/importing-source-code/using-the-command-line-to-import-source-code/adding-locally-hosted-code-to-github">GitHub公式・ローカルのコードを追加する</a></p>



<h2 class="wp-block-heading"><span id="toc38">GitLabとBitbucketで使う場合</span></h2>



<p>Gitの基本操作は同じです。アカウントへの公開鍵登録、リポジトリ作成、接続先の指定が変わります。</p>



<h3 class="wp-block-heading"><span id="toc39">GitLab.comの場合</span></h3>



<ol start="1" class="wp-block-list">
<li>GitLabにログインする。</li>



<li>プロフィールの編集／ユーザー設定からSSH Keysを開き、公開鍵を登録する。</li>



<li>新規の空プロジェクト<code>example-site</code>を作成する。</li>



<li>READMEによる初期化を選ばず、公開範囲と名前空間を確認する。</li>



<li>プロジェクト画面のSSH URLをコピーする。</li>
</ol>



<p>接続確認は次のとおりです。初回のホスト鍵はGitLab公式情報と照合します。</p>



<pre class="wp-block-code"><code>ssh -T git@gitlab.com</code></pre>



<p><strong>まだoriginを登録していないリポジトリ</strong>では、次を実行します。<code>YOUR_NAMESPACE</code>は自分のユーザー名またはグループのパスに置き換えます。</p>



<pre class="wp-block-code"><code>git remote add origin git@gitlab.com:YOUR_NAMESPACE/example-site.git
git push -u origin main</code></pre>



<p>Self-Managed環境では、ホスト名、SSHポート、利用できる鍵の種類などを管理者に確認してください。</p>



<p>参考：<a href="https://docs.gitlab.com/user/ssh/">GitLab公式・SSH鍵</a>、<a href="https://docs.gitlab.com/user/project/repository/">GitLab公式・リポジトリ</a></p>



<h3 class="wp-block-heading"><span id="toc40">Bitbucket Cloudの場合</span></h3>



<ol start="1" class="wp-block-list">
<li>Bitbucketにログインする。</li>



<li>Personal Bitbucket settingsのSSH keysから公開鍵を登録する。</li>



<li>利用するWorkspaceに<code>example-site</code>というリポジトリを作成する。</li>



<li>READMEを追加せず、空のリポジトリにする。</li>



<li>リポジトリ画面のSSH URLをコピーする。</li>
</ol>



<p>接続確認は次のとおりです。初回のホスト鍵はAtlassian公式情報と照合します。</p>



<pre class="wp-block-code"><code>ssh -T git@bitbucket.org</code></pre>



<p><strong>まだoriginを登録していないリポジトリ</strong>では、次を実行します。<code>YOUR_WORKSPACE</code>は実際のWorkspaceのIDに置き換えます。</p>



<pre class="wp-block-code"><code>git remote add origin git@bitbucket.org:YOUR_WORKSPACE/example-site.git
git push -u origin main</code></pre>



<p>ここでは個人のSSH鍵を使います。リポジトリのAccess keysは読み取り用途なので、pushするための個人鍵登録とは区別してください。</p>



<p>参考：<a href="https://support.atlassian.com/bitbucket-cloud/docs/set-up-personal-ssh-keys-on-linux/">Bitbucket公式・Linuxでの個人SSH鍵設定</a>、<a href="https://support.atlassian.com/bitbucket-cloud/docs/log-into-or-connect-to-bitbucket-cloud/">接続とAccess keys</a></p>



<h3 class="wp-block-heading"><span id="toc41">すでにGitHubをoriginとして登録した場合</span></h3>



<p>上記は3サービスのどれかを選ぶ例であり、同じリポジトリで<code>origin</code>を繰り返し追加する手順ではありません。</p>



<p>共有先を変更する場合は、<code>git remote -v</code>で確認したうえで<code>git remote set-url origin 新しいSSH_URL</code>を使います。移行先にも履歴がある場合は、単純な送信ではなく、履歴と移行手順の確認が必要です。</p>



<h2 class="wp-block-heading"><span id="toc42">別のLinux環境で続きを作業する</span></h2>



<p>既存の共有リポジトリを手元に取得する操作が<code>clone</code>です。</p>



<p>別のLinux環境でもGitの導入、名前・メールの設定、SSH認証を準備し、その環境専用の公開鍵をアカウントに登録します。</p>



<pre class="wp-block-code"><code>mkdir -p ~/projects
cd ~/projects
git clone git@github.com:YOUR_USER/example-site.git
cd example-site
git status</code></pre>



<p><code>clone</code>では、ファイルと履歴を取得し、通常は<code>origin</code>も自動設定されます。取得したフォルダーでもう一度<code>git init</code>する必要はありません。</p>



<p>共有先の更新を取り込むには、作業中の変更がない状態で次を使います。</p>



<pre class="wp-block-code"><code>git switch main
git pull --ff-only</code></pre>



<p><code>--ff-only</code>は、履歴をそのまま進められる場合にだけ取り込む指定です。手元と共有先の両方で別々のコミットが増えている場合は、勝手にまとめずに止まります。</p>



<p>止まったときは、履歴を確認してマージやリベースを検討します。初心者のうちは、理由が分からないまま強制pushしないことが大切です。</p>



<p>参考：<a href="https://git-scm.com/docs/git-pull">Git公式・git pull</a></p>



<h2 class="wp-block-heading"><span id="toc43">チームで使う基本の流れ</span></h2>



<p>チームでは、「mainから作業用ブランチを作り、変更を提案してから取り込む」という進め方ができます。</p>



<pre class="wp-block-code"><code>git switch main
git pull --ff-only
git switch -c fix/top-page-title</code></pre>



<p><code>index.html</code>のタイトルを変更します。</p>



<pre class="wp-block-code"><code>sed -i 's/&lt;title&gt;Git練習サイト&lt;\/title&gt;/&lt;title&gt;Git変更履歴の練習サイト&lt;\/title&gt;/' index.html
git diff
git add index.html
git diff --cached
git commit -m "トップページのタイトルを分かりやすく変更"
git push -u origin fix/top-page-title</code></pre>



<p>ここで共有先の画面を開きます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>サービス</th><th>画面で行う操作</th></tr></thead><tbody><tr><td>GitHub</td><td>作業ブランチから<code>main</code>へのPull Requestを作成する</td></tr><tr><td>GitLab</td><td>作業ブランチから<code>main</code>へのMerge Requestを作成する</td></tr><tr><td>Bitbucket</td><td>作業ブランチから<code>main</code>へのPull Requestを作成する</td></tr></tbody></table></figure>



<p>説明には「何を変えたか」「なぜ変えたか」「どう確認したか」を記載します。例えば、「ブラウザーのタブで用途が分かるようにタイトルを変更。表示と文字コードを確認」と書けば、確認する側も判断しやすくなります。</p>



<p>レビューや必要なテストが終わったら、画面上でマージします。承認人数やmainへの直接pushを制限する設定は、サービスとプラン、チームの方針に合わせて決めます。</p>



<p>手元のmainにも、マージ後の変更を取り込みます。</p>



<pre class="wp-block-code"><code>git switch main
git pull --ff-only</code></pre>



<h2 class="wp-block-heading"><span id="toc44">競合が起きたらどうする？</span></h2>



<p>同じ箇所を別々に編集し、Gitがどちらを採用するか判断できないと、マージ時に競合が起きます。</p>



<p>例えば、ファイルに次のような目印が入ります。</p>



<pre class="wp-block-code"><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
&lt;h1&gt;社内向けのお知らせ&lt;/h1&gt;
=======
&lt;h1&gt;お客様向けのお知らせ&lt;/h1&gt;
&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature/change-heading</code></pre>



<p>この目印は、完成したHTMLではありません。両方の変更の意図を確認し、最終的に必要な内容へ編集して、目印を削除します。</p>



<p>ローカルの<code>git merge</code>で起きた競合を直す場合は、次のように進めます。</p>



<pre class="wp-block-code"><code>git status
# 対象ファイルを編集し、内容と動作を確認する
git add index.html
git diff --cached
git commit -m "見出しの競合を解消"</code></pre>



<p>まだマージを完了しておらず、今回のマージを中止する場合は<code>git merge --abort</code>を使います。マージ前から未記録の変更があると元の状態への復元が難しくなる場合があるため、最初に作業をコミットするなどしてから始めます。</p>



<p>ここで説明しているのはマージの競合です。リベース中の競合は、続行や中止のコマンドが異なります。</p>



<h2 class="wp-block-heading"><span id="toc45">Linuxの現場で管理すると便利なもの</span></h2>



<p>Gitは、Webアプリのソースコード以外にも使えます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>管理対象の例</th><th>役立つ場面</th></tr></thead><tbody><tr><td>PHP・Pythonなどのコード</td><td>不具合が発生した変更を調べる</td></tr><tr><td>バックアップ用シェルスクリプト</td><td>処理条件や通知先の変更理由を残す</td></tr><tr><td>Apache・Nginxの設定テンプレート</td><td>設定変更をレビューする</td></tr><tr><td>systemdのサービス定義</td><td>起動コマンドや環境設定の変更を追う</td></tr><tr><td>導入手順・障害対応メモ</td><td>手順の変更と修正理由を共有する</td></tr></tbody></table></figure>



<p>サーバー設定を管理する場合も、まず作業用リポジトリにテンプレートを用意して確認し、別の手順で適用する方法が取れます。<code>/etc</code>全体をそのまま登録すると、認証情報などまで含める可能性があります。</p>



<p>本番サーバーでは、Gitのマージと公開を別の作業として考えます。PHPなら依存パッケージの導入、LaravelならキャッシュやDB変更、設定ファイルなら構文確認など、必要な処理はアプリごとに異なります。</p>



<h2 class="wp-block-heading"><span id="toc46">導入時に押さえておきたいこと</span></h2>



<h3 class="wp-block-heading"><span id="toc47">データベースやアップロード画像は別にバックアップする</span></h3>



<p>Gitでソースコードを管理しても、MySQLのデータや利用者がアップロードした画像まで自動で保存されるわけではありません。必要なデータのバックアップと復旧手順は、別途用意します。</p>



<h3 class="wp-block-heading"><span id="toc48">.gitをWebから読める状態にしない</span></h3>



<p>Webサーバーの公開ディレクトリに<code>.git</code>が置かれていると、設定によっては履歴やコードが外部へ漏れる可能性があります。公開ディレクトリの外で管理し、公開に必要なファイルだけ配置する方法や、Webサーバー側でのアクセス制限を検討します。</p>



<h3 class="wp-block-heading"><span id="toc49">変更は「説明できる単位」で記録する</span></h3>



<p>フォーム修正、デザイン変更、バックアップ処理変更を一つにまとめると、後から特定の変更を取り消しにくくなります。</p>



<p>一方で、意味のない細切れにする必要もありません。「このコミットは何をしたものか」を一文で説明できる区切りを意識すると、履歴が読みやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc50">pushに失敗したら、まず原因を確認する</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>表示例</th><th>最初に確認すること</th></tr></thead><tbody><tr><td><code>Permission denied (publickey)</code></td><td>公開鍵の登録、SSHエージェント、使用アカウント、アクセス権</td></tr><tr><td><code>remote origin already exists</code></td><td><code>git remote -v</code>で、originがすでに登録されていないか</td></tr><tr><td><code>src refspec main does not match any</code></td><td>初回コミットの有無、現在のブランチ名</td></tr><tr><td><code>non-fast-forward</code></td><td>共有先に未取得の履歴がないか。先に取得して履歴を確認する</td></tr></tbody></table></figure>



<p>「送れないから<code>--force</code>を付ける」という対応は、共有先の履歴を上書きするおそれがあります。エラーの理由を確認してから進めましょう。</p>



<h2 class="wp-block-heading"><span id="toc51">よく使うコマンド早見表</span></h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>コマンド</th><th>用途</th></tr></thead><tbody><tr><td><code>git init</code></td><td>新しく管理を始める</td></tr><tr><td><code>git clone URL</code></td><td>既存のリポジトリを取得する</td></tr><tr><td><code>git status</code></td><td>作業中の状態を確認する</td></tr><tr><td><code>git diff</code></td><td>まだステージングしていない変更を確認する</td></tr><tr><td><code>git add ファイル名</code></td><td>次のコミットに含める内容を選ぶ</td></tr><tr><td><code>git diff --cached</code></td><td>コミット予定の変更を確認する</td></tr><tr><td><code>git commit -m "説明"</code></td><td>履歴を記録する</td></tr><tr><td><code>git log --oneline</code></td><td>履歴を一覧表示する</td></tr><tr><td><code>git show HEAD</code></td><td>直近のコミットを確認する</td></tr><tr><td><code>git switch -c ブランチ名</code></td><td>新しいブランチを作って切り替える</td></tr><tr><td><code>git switch main</code></td><td>mainへ切り替える</td></tr><tr><td><code>git merge ブランチ名</code></td><td>別のブランチの変更を取り込む</td></tr><tr><td><code>git remote -v</code></td><td>共有先を確認する</td></tr><tr><td><code>git push</code></td><td>コミットを共有先へ送る</td></tr><tr><td><code>git pull --ff-only</code></td><td>履歴をそのまま進められる場合に共有先の更新を取り込む</td></tr><tr><td><code>git restore -- ファイル名</code></td><td>作業ファイルの変更を取り消す。対象の未記録の編集は失われる</td></tr><tr><td><code>git restore --staged -- ファイル名</code></td><td>ステージングを取り消し、編集内容は残す</td></tr><tr><td><code>git revert --no-edit コミットID</code></td><td>指定した通常のコミットを打ち消す新しいコミットを作る</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc52">最初は、一つのフォルダーから始めればよい</span></h2>



<p>Gitのコマンドを最初から全部覚える必要はありません。まずは練習用フォルダーで、<code>status</code>、<code>diff</code>、<code>add</code>、<code>commit</code>、<code>log</code>を使ってみてください。</p>



<p>変更を確認し、理由を付けて記録する。それだけでも、「修正前はどうなっていたか」が分かるようになります。</p>



<p>次にGitHubなどへ共有し、ブランチとレビューを取り入れれば、複数人での作業にもつなげられます。</p>



<p>小さな修正ほど、「これくらいなら大丈夫」と記録を省きがちです。その小さな変更が原因で困ったとき、履歴があるかどうかで調査の始めやすさが変わります。次の修正から、変更の理由も一緒に残してみましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/h7g01v70k3ryhqt5pqqvj4ebwu0o0tn4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
