敵の速さを 80 から 200 に変えたら、手触りが良くなった気がします。ところが翌日、ほかの値もいくつか触ったあとでは、どれをどう変えたのか思い出せません。フォルダをコピーして MyGame_old を残していても、違いは2つを開いて見比べるしかありません。
Git に載せると、この違いが1行で読めます。Godot のシーンはテキストで保存されていて、インスペクタで変えた値がそのまま1行になっているからです。ただ、始めたとたんに見慣れないファイルが大量に並んだり、ブランチを切り替えたらエディタに英語の確認が出たりもします。
この記事では、Godot プロジェクトを Git に載せ、変えた値を差分で読み、ブランチで試して戻す方法を解説します。
この記事でわかること
- インスペクタで変えた値が、差分の1行になる理由
- Git に載せるファイルと、載せない
.godot/フォルダ- ブランチを切り替えたときにエディタが出す確認と、押すボタン
- 同じ行を2つのブランチで変えたときの、衝突の読み方
- 実践:ブランチで敵の速さを試して、元に戻す
動作確認環境: Godot 4.7 / Git 2.28 以降
Godotのシーンと差分:変えた値が1行になる
Git は、プロジェクトフォルダの中身を好きなときに記録しておき、あとで比べたり戻したりする道具です。記録1回分を コミット と呼びます。2つの記録を比べて、増えた行と消えた行を並べたものが「差分」です。
Godot と Git の相性が良いのは、Godot が保存するファイルのほとんどがテキストだからです。シーンの .tscn も、プロジェクト設定の project.godot も、スクリプトの .gd も、メモ帳で開けます。敵のシーン enemy.tscn を開くと、中身はこうなっています。
[gd_scene format=3 uid="uid://…"]
[ext_resource type="Texture2D" uid="uid://…" path="res://icon.svg" id="1_…"]
[ext_resource type="Script" uid="uid://…" path="res://enemy.gd" id="2_…"]
[node name="Enemy" type="Sprite2D" unique_id=…]
texture = ExtResource("1_…")
script = ExtResource("2_…")
speed = 200.0
[node …] の行がノード1つの始まりで、その下に並ぶのが、インスペクタで変えた値です。最後の speed = 200.0 は、インスペクタで Speed を 200 にした結果です。
大事なのは、値が初期値のままなら行が書かれないことです。@export var speed := 80.0(@export はインスペクタに出す印)と書いたスクリプトなら、80 のあいだ speed の行はありません。200 にして保存すると1行増え、80 に戻して保存すると消えます。

だから、速さを変えたときの差分は「enemy.tscn に speed = 200.0 が1行増えた」だけです。どの値を触ったのかメモを取っていなくても、差分を見れば分かります。ブランチで試して比べられるのも、衝突したときに直せるのも、この1行が読めるからです。
他のエンジンでいうと: Unity のシーンも、テキスト形式で保存していれば Git で差分を読めます。Unreal Engine の
.uassetはバイナリなので、中身を比べるにはエディタ の比較機能を使います。
行が書かれるのは、値を変えたシーンのファイルです。enemy.tscn で変えれば enemy.tscn に、main.tscn に置いた敵を選んで変えれば main.tscn に書かれます。
Gitに載せるファイルと.gitignore
プロジェクトフォルダには、自分で作ったファイルのほかに、Godot が作る .godot/ フォルダがあります。中身は、画像を読み込んだ結果のような作り直せる控えと、エディタの画面の状態のような、そのPCだけの情報です。これを Git に載せると、変更一覧が自分の触っていないファイルで埋まります。
新しいプロジェクトを作る画面の下のほうに、Version Control Metadata という項目があります。ここが既定の Git なら、.gitignore も一緒に作られます。Git に無視させるファイルを書いておく一覧で、.godot/ はここで外れます。None で作ったプロジェクトには、Project → Version Control → Create/Override Version Control Metadata... からあとで作れます。

一緒にできる .gitattributes(改行の書き方をそろえる設定)、画像の隣の .import、スクリプトの隣の .uid もコミットします。載せるもの・外すものの詳しい話は プロジェクト整理入門 にあり ます。
Godot は、記録の置き場(リポジトリ)までは作りません。git init をターミナル(文字でコマンドを打ち込む画面。Windows なら PowerShell など)で打つか、GitHub Desktop のような画面付きの道具で作ります。エディタの中で Git を操作するには、別配布の Git プラグインが要りますが、この記事では使いません。
コミットと差分の確認
コミットは、差分を読んでから取ります。入れる変更を選び(git add)、ひとこと添えて記録します(git commit)。
git diff # まだ git add していない変更を見る(新しいファイルは出ない)
git add -A # 変わったファイルを全部、記録に入れる候補にする
git commit -m "敵を速くした" # ひとこと添えて記録する
新しく作ったファイルは git diff には出ないので、git status で一覧も確かめます。
差分を先に読むのは、入れたくない変更に気づくためです。敵の速さだけを変えたつもりでも、シーンに置いた敵をうっかりドラッグしていたり、別のシーンまで保存していたりします。git add の前なら、そのファイルだけ最後の記録の状態へ戻せます。
git restore main.tscn # main.tscn の変更を捨てて、最後の記録の状態に戻す
そのシーンを Godot で開いていたら、ウィンドウに戻ったときに読み直しの確認が出るので、Reload from disk を押します。

いつコミットするかの目安は、ゲームが起動して、変えたことを1文で言えるときです。「敵を速くした」「タイトル画面を足した」くらいの区切りです。保存のたびでは細かすぎ、1週間に1回では戻りたい地点を選べません。
ブランチで試す
敵をもっと速くしてみたいけれど、ダメだったときに元へ戻す手間は避けたい。そういうときは ブランチ を作ります。今の記録から枝分かれした、もう1本の作業の流れです。ブランチの上でどれだけ変えてコミットしても、最初からある main は動きません。気に入れば main に取り込み、気に入らなければブランチごと捨てます。

git switch -c try-fast # try-fast というブランチを作って切り替える
git switch main # main へ戻る
ブランチを切り替えると、Git はプロジェクトフォルダの中のファイルを、切り替えた先の内容へ書き換えます。Godot を開いたままでも切り替えられます。Godot のウィンドウに戻ったとき、開いているシーンが書き換わっていれば、次の確認が出ます。

タイトルは「Files have been modified outside Godot」です。Godot の外でファイルが変わった、という知らせで、書き換わったシーンの名前が並びます。押すのは Reload from disk です。切り替えた先の内容でシーンを開き直します。もう1つの Ignore external changes は、エディタが持っていた切り替える前の内容で保存し直します。切り替えた先のファイルが上書きされてしまいます。
スクリプトは、エディタで編集途中でなければ、確認なしで読み直されます。切り替える前に保存とコミットを済ませておけば、戻ったときは Reload from disk を押すだけです。
衝突(コンフリクト)の直し方
ブランチを main に取り込むとき、同じ行が両方で変わっていると、Git はどちらを残すか決められずに止まります。これが衝突です。2人で作るときの話に聞こえますが、ひとりでも起きます。main で speed を 120 にしてコミットし、try-fast では 200 にしていた、という場合です。git merge try-fast で取り込もうとすると、enemy.tscn にこう書き込まれます。
[node name="Enemy" type="Sprite2D" unique_id=…]
texture = ExtResource("1_…")
script = ExtResource("2_…")
<<<<<<< HEAD
speed = 120.0
=======
speed = 200.0
>>>>>>> try-fast
<<<<<<< HEAD の下が、今いるブランチ(ここでは main)の行です。======= の下が、取り込もうとした try-fast の行です。残したい1行だけにして、印の3行を消します。保存してから git add enemy.tscn と git commit --no-edit を打てば、取り込みは終わりです。--no-edit を付けないと、メッセージを書く画面(Windows では vim)が開いて止まることがあります。

印が残っているあいだ、Godot はそのシーンを開けないので、先にテキストエディタで印を消します。
ノードを足した・消した・並べ替えた変更どうしがぶつかって読み取りにくいときは、git merge --abort で取り込みをやめ、片方の内容を採用して、もう片方の操作をエディタでやり直すほうが早く済みます。
ぶつからないようにするには、ブランチごとに触るシーンを分けます。
実践:ブランチで敵の速さを試して、元に戻す
横スクロールの敵、シューティングの弾、落ち物パズルのブロック —— 速さを変えて手触りを比べたい場面は、どのジャンルにもあります。ここでは敵が1体歩くだけのプロジェクトを作り、速さをブランチの上で試して、main と行き来して比べてから捨てます。

① 置くもの
新しいプロジェクトから始めます。Git を入れて(git-scm.com から入れられます)、ターミナルで git --version と打つと版が表示される状態にしておいてください。
- 新規プロジェクトを作る。Version Control Metadata は既定の Git のまま
- Sprite2D をルートにしたシーンを作り、名前を Enemy にする。Texture に
icon.svgをドラッグし、enemy.tscnとして保存する - Enemy にスクリプト
enemy.gdを付ける
# enemy.gd(Enemy の Sprite2D)
extends Sprite2D
@export var speed := 80.0 # 1秒に進むピクセル数
func _process(delta: float) -> void:
position.x += speed * delta
if position.x > 1152.0: # 中心が画面の右端を越えたら、左端へ戻す
position.x = 0.0
- Node2D をルートにしたシーンを作り、名前を Main にする。FileSystem ドックから
enemy.tscnをドラッグして子に置く - 置いた敵の Position を (0, 324) にして、
main.tscnとして保存する main.tscnを開いたまま F5 を押し、メインシーンを聞かれたら Select Current を選ぶ。敵が左から右へ歩けば準備完了
最後に、プロジェクトのフォルダでターミナルを開き、最初の記録を取ります。
git init -b main # 記録の置き場を作る。最初のブランチの名前は main
git add -A
git status # 記録に入るファイルを確かめる
git commit -m "敵を1体置いた"
GitHub Desktop なら、File → Add local repository... でフォルダを選びます。リポジトリではないと表示されるので、その中の create a repository から作ります。Git ignore は None のままにしてください。作ると同時に「Initial commit」という最初の記録が取られます。
② ブランチの上で試す
try-fast というブランチを作って切り替えます。ここからの main はブランチの名前で、シーンの main.tscn とは別物です。
git switch -c try-fast
Godot で enemy.tscn を開き、ルートの Enemy の Speed を 200 にします。Ctrl + S で保存したら、ターミナルで差分を見ます。
git diff
[node name="Enemy" type="Sprite2D" unique_id=…]
texture = ExtResource("1_…")
script = ExtResource("2_…")
+speed = 200.0
記録してから、main へ戻ります。
git commit -am "敵を速くしてみる" # -a は、記録済みのファイルの変更をまとめて入れる(新しいファイルは入らない)
git switch main
Godot のウィンドウをクリックすると確認が出るので、Reload from disk を押します。
同じ操作を GitHub Desktop でするときの対応です。
| やること | コマンド | GitHub Desktop |
|---|---|---|
| ブランチを作って切り替える | git switch -c try-fast | 上部の Current branch → New branch |
| 差分を見る | git diff | 左の Changes でファイルを選ぶ |
| 記録する | git commit -am "…" | 下の欄に書いて Commit ボタン |
| ブランチを切り替える | git switch main | Current branch の一覧から main |
| ブランチを捨てる | git branch -D try-fast | 一覧の try-fast を右クリック → Delete... |
③ 動かして確かめる

main と try-fast を行き来しながら、F5 で動かします。ゲームはそのつど止めてから切り替えてください。見るのは3つです。
①の git status に並ぶのは、project.godot や enemy.tscn など10個です。.godot/ はありません。出てきたら、プロジェクトを作るときに Version Control Metadata を None にしています。②の git diff は +speed = 200.0 の1行だけです。差分が main.tscn に出たら、main.tscn に置いた敵を選んで変えています。
main に戻して Reload from disk を押すと、インスペクタの Speed は 80 に戻ります。F5 で動かすと、敵は画面の左端から右端まで約14秒かけて歩きます。git switch try-fast で切り替え、もう一度 Reload from disk を押します。動かすと、同じ距離を約6秒で横切ります。値が変わらないなら、確認で Ignore external changes を押しています。
仕上げに、main にいる状態で git branch -D try-fast を打ち、ブランチを捨てます。enemy.tscn に speed の行は無く、記録を1件1行で並べる git log --oneline は「敵を1体置いた」の1行だけです(GitHub Desktop で作ったなら「Initial commit」)。ブランチの上で試した変更は消え、main は最初の記録のままです。
ポイントは2つです。
- 差分の1行が、変えた値そのもの: 初期値と同じ値は保存されないので、インスペクタで変えた数だけ行が増えます。差分が1行なら、変えたのも1か所です
- 切り替えたら Reload from disk: Godot は、開いているシーンが書き換わったことに気づいて確認を出します。切 り替える前に保存とコミットを済ませておけば、押すのはこのボタンだけです
気に入った変更を残すなら、捨てる代わりに main で git merge try-fast を打ちます。main 側に新しい記録が無ければ、「Fast-forward」と出てそのまま取り込まれます。ゲームを書き出すようになったら、書き出し先のフォルダも .gitignore に1行足しておきます(エクスポート入門)。
うまくいかないときは
| 症状 | 原因 | 直し方 |
|---|---|---|
git commit で「Please tell me who you are.」と出る | そのPCで Git を初めて使い、名前とメールを設定していない | git config --global user.name "名前" と git config --global user.email "メール" を打ってから、もう一度コミットする |
.gitignore があるのに、.godot/ のファイルが変更一覧に出る | .gitignore を置く前に .godot/ をコミットしていた | git rm -r --cached .godot で記録からだけ外し、そのままコミットする。フォルダ自体は消えない |
| 切り替えたら変更が付いてきた/「Your local changes ... would be overwritten」で止まる | コミットしていない変更は、どのブランチにも入っていない | コミットしてから切り替える。要らない変更なら git restore <ファイル> で捨てる(git add 済みなら、先に git restore --staged <ファイル>) |
おまけ:先に知っておくと良いこと
- 画像と音は「変わった」としか出ない:
.pngや.oggはテキストではないので、差分には変わったことしか出ません。大きな素材を何度も差し替えるなら、その素材を入れる前に Git LFS を設定し、本体を別の置き場へ逃がします。GitHub は 100 MiB を超えるファイルを受け付けません - 秘密は
.godot/の中: 書き出しのパスワードや暗号化キーは、.godot/の中に分けて保存されます。書き出しの設定export_presets.cfgはコミットしてかまいません。スクリプトや JSON に書いたキーは外れないので、そこには書かないでください - GitHub に送れば、PCが壊れても残る: GitHub にリポジトリを作って送り先を登録し、
git pushで送っておくと、別のPCでも同じ記録から続けられます
まとめ
- シーンはテキスト: インスペクタで変えた値は
.tscnの1行になる。初期値のままなら行は無い - コミットの前に差分を読む: 入れたくない変更は
git restoreで戻す .godot/は載せない: 新規作成時の Git の設定で、.gitignoreが外してくれる- 試すならブランチの上 で:
git switch -cで作り、気に入らなければgit branch -Dで捨てる。切り替えたら Reload from disk を選ぶ - 衝突は印の間を読む: 残す1行を選んで印を消す。印が残ったシーンは Godot で開けない
まずは今作っているプロジェクトを Git に載せ、インスペクタで値を1つ変えてから git diff を打ってみてください。変えた値が1行で見えれば、どの値を触ったかを覚えておく必要はなくなります。最初のコミットには、どんなメッセージを書きますか。