【Godot】Godot × Git入門:変えた値を差分で読み、ブランチで壊さずに試す

作成: 2026-09-23最終更新: 2026-10-10

インスペクタで変えた値が差分の1行で読めるGodotの性質を使い、ブランチで試して戻す手順を解説します。

敵の速さを 80 から 200 に変えたら、手触りが良くなった気がします。ところが翌日、ほかの値もいくつか触ったあとでは、どれをどう変えたのか思い出せません。フォルダをコピーして MyGame_old を残していても、違いは2つを開いて見比べるしかありません。

Git に載せると、この違いが1行で読めます。Godot のシーンはテキストで保存されていて、インスペクタで変えた値がそのまま1行になっているからです。ただ、始めたとたんに見慣れないファイルが大量に並んだり、ブランチを切り替えたらエディタに英語の確認が出たりもします。

この記事では、Godot プロジェクトを Git に載せ、変えた値を差分で読み、ブランチで試して戻す方法を解説します。

ブランチが枝分かれする線と、speed = 200.0 の1行だけが光る差分のカードを、人形が指さしている

この記事でわかること

  • インスペクタで変えた値が、差分の1行になる理由
  • Git に載せるファイルと、載せない .godot/ フォルダ
  • ブランチを切り替えたときにエディタが出す確認と、押すボタン
  • 同じ行を2つのブランチで変えたときの、衝突の読み方
  • 実践:ブランチで敵の速さを試して、元に戻す

動作確認環境: Godot 4.7 / Git 2.28 以降

Sponsored

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 に戻して保存すると消えます。

仕組みの図。Speed が初期値の80なら.tscnに行が無く、200にして保存すると1行増え、差分にもその1行だけが出る

だから、速さを変えたときの差分は「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... からあとで作れます。

.gitignoreや.gitattributesも含めた10個のファイルは記録に入り、.godot/ だけが .gitignore で止められる

一緒にできる .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 を押します。

コミット前の差分の見直し。enemy.tscn の speed の1行は残し、うっかり動かした main.tscn の position の変更は捨てる

いつコミットするかの目安は、ゲームが起動して、変えたことを1文で言えるときです。「敵を速くした」「タイトル画面を足した」くらいの区切りです。保存のたびでは細かすぎ、1週間に1回では戻りたい地点を選べません。

Sponsored

ブランチで試す

敵をもっと速くしてみたいけれど、ダメだったときに元へ戻す手間は避けたい。そういうときは ブランチ を作ります。今の記録から枝分かれした、もう1本の作業の流れです。ブランチの上でどれだけ変えてコミットしても、最初からある main は動きません。気に入れば main に取り込み、気に入らなければブランチごと捨てます。

ブランチの図。main の記録から try-fast が枝分かれし、その上で速さを200にする。気に入れば main へ取り込み、気に入らなければ捨てる
git switch -c try-fast   # try-fast というブランチを作って切り替える
git switch main          # main へ戻る

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

切り替えたあとの確認。Reload from disk は切り替えた先の内容で開き直し、もう一方はエディタの内容で上書きする

タイトルは「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)が開いて止まることがあります。

衝突の図。main は speed を120に、try-fast は200にしていて、取り込むと印に挟まれた2行が並ぶ。残す1行を選んで印を消す

印が残っているあいだ、Godot はそのシーンを開けないので、先にテキストエディタで印を消します。

ノードを足した・消した・並べ替えた変更どうしがぶつかって読み取りにくいときは、git merge --abort で取り込みをやめ、片方の内容を採用して、もう片方の操作をエディタでやり直すほうが早く済みます。

ぶつからないようにするには、ブランチごとに触るシーンを分けます。

Sponsored

実践:ブランチで敵の速さを試して、元に戻す

横スクロールの敵、シューティングの弾、落ち物パズルのブロック —— 速さを変えて手触りを比べたい場面は、どのジャンルにもあります。ここでは敵が1体歩くだけのプロジェクトを作り、速さをブランチの上で試して、main と行き来して比べてから捨てます。

実践の場面。main では敵がゆっくり歩き、try-fast では同じ敵が速く歩く。切り替えるたびに Reload from disk を挟んで行き来する

① 置くもの

新しいプロジェクトから始めます。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 mainCurrent branch の一覧から main
ブランチを捨てるgit branch -D try-fast一覧の try-fast を右クリック → Delete...

③ 動かして確かめる

差分は speed の1行だけ。main の敵は約14秒、try-fast では約6秒で横切り、捨てたあとも記録は1つ

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でも同じ記録から続けられます
Sponsored

まとめ

  • シーンはテキスト: インスペクタで変えた値は .tscn の1行になる。初期値のままなら行は無い
  • コミットの前に差分を読む: 入れたくない変更は git restore で戻す
  • .godot/ は載せない: 新規作成時の Git の設定で、.gitignore が外してくれる
  • 試すならブランチの上で: git switch -c で作り、気に入らなければ git branch -D で捨てる。切り替えたら Reload from disk を選ぶ
  • 衝突は印の間を読む: 残す1行を選んで印を消す。印が残ったシーンは Godot で開けない

まずは今作っているプロジェクトを Git に載せ、インスペクタで値を1つ変えてから git diff を打ってみてください。変えた値が1行で見えれば、どの値を触ったかを覚えておく必要はなくなります。最初のコミットには、どんなメッセージを書きますか。

次に読む次のカテゴリ「エディタ拡張・テスト」へ
エディタ拡張・テスト

カスタムノードの作成とエディタ拡張(class_name・@icon・@export)

この記事を読む
Godot このセクションのノート104