はじめに
※前回の記事の続きになります。
今回は、「GitHubを使う上で起こる様々な問題を対処できるようにしよう」という目標でやっていきます。
今回も前回と同様に初心者向けなので、
- 本格的な運用を学びたい
- ある程度の問題に対処できる
- GitHubをちゃんと学びたい
という方には向いていない内容になっています。注意してください。
また、教材として作ったので一部内容がわかりづらいかもしれません。
しかし前回よりレベルが上がったと仮定して図の多用はやめたのですっきりとまと待ってるかなと思います。
今回使用した環境
- Windows 11(25H2)
- GitHub Desktop
- Git LFS(Git Large File Storage)
- Unity Hub & Unity Editor(6000.3.11f1)
元に戻す
ここからは変更した内容を戻すことに焦点を当てて説明していきます。
どうしても開発をしていると「ある地点の状態に戻したい」ということが多々あるかなと思います。または「壊してしまって戻さないといけない」みたいな時も出てくると思います。
そういったときの対処について解説していきます。
1. Discard
簡単に言うと、「最後にCommitした状態」に戻せます。
例えば、
のように、まだCommitする前で「編集中に大事なファイルを消してしまい元に戻したい」という状況になったとします。
このような場合、
「Branch」→「Discard All Changes」を選んでみましょう。
すると変更がすべて取り消され、「最後にCommitした状態」になります!
2. Undo&Reset
次はResetコマンドというものを紹介したいのですが、GitHub Desktopには便利な「Undo」という機能もあるので合わせて紹介します。
resetコマンドは、簡単に言うとCommitの取り消しができるコマンドで、Pushする前に使える操作です。
(Push後は注意するところがあるのであまりお勧めできません。)
オプションがいくつかあるので、それについて説明します。
〇soft(Undo)
まずはsoftです。これは「Commitを一旦取り消せる」というコマンドです。
では、コマンドプロンプトを起動します。
起動のさせ方は前回の「Git LFS」のセットアップ時と同じになっているので参照してください。
もしくはGitHub Desktopの画面上側にある「Repository」→「Open in Command Prompt」からでも起動できます。
例えば最後にしたCommitを一旦取り消したいときは、
git reset --soft HEAD~1
というコマンドを使います。
実行後、GitHub Desktopを見ると、
こんな感じでCommitだけが取り消された感じになってます。
(Commitしたときに変更した内容は取り消されません)
コマンドを解説すると、HEAD~1の部分で、どこまでのCommitを取り消すか指定しています。今回の場合だとHEAD(今の最新の状態)から~1(一つ前)を指定しています。
これをHEAD~2にすると2つ前のCommitまで一気に取り消ししてくれます。
ただし先ほどから言っているように「変更は保持される(取り消されない)」ので、あくまでCommitだけ取り消しになるのがこのsoftの特徴です。
もしくは、このように左下「Undo」を押すとgit reset --soft HEAD~1と同じ操作をすることができます。
〇mixed
softの「ステージの変更」を保持しないバージョンです。
ここのチェックボックスのチェックが入ってるか入ってないかっていう設定を引き継がずにしたいときはmixedにしましょう。
例ですが、
git reset --mixed HEAD~1
または
git reset HEAD~1
と打ち込むと、一つ前のCommitへ戻せます。(基本は変わらないです)
しかしステージの変更は引き継がれていないと思うので、設定を引き継ぎたくないときはこれを使いましょう。
〇hard
最後が名前の通り一番強いです。
今まで変更内容が残っていたと思うのですが、これは変更自体もすべて戻してしまいます。
正確に言うと違いますが、イメージとしては「指定したCommitまでの取り消し」に加えて「Discard all changes」を使う感じです。
例を出すと、
git reset --hard HEAD~1
という感じになります。
実行すると指定したCommitに戻って変更がすべて消えたと思います。
強制リセットしたいときに使えますが、使うには少し注意がいるので気を付けましょう。
Pull requestの問題(コンフリクト)
次はPull requestの際の問題の解決方法を教えます。
例えばGitHubのPull requestの画面で、
のように出た場合は、そのままではマージできないということを示しています。
なぜマージできないかというと、相手のコードと自分のコードで「競合(コンフリクト)」が起きてしまっているからです。
例で出すと、
int score = 200;
int score = 100;
こんな感じの時に、「どっちにすればいいんだ?」となってしまうことこそがコンフリクトです。
こうなったら手動で解決しなければなりませんが、きちんと解決する方法があるので安心してください!
〇解決方法
まず、発生してしまった場合はGitHub Desktopで一度Fetchしましょう。
その後上側にあるバーから「Branch」→「Update from main」を押します。
するとmainブランチの内容を選択しているブランチへ取り込もうとします。
(「main」→「feature」みたいな感じで取り込んでくれます)
するとPull requestと逆のことをしようとしているだけなので、当然うまくマージできなくてコンフリクトが発生します。
このようになった場合、例に出したSample.csのコンフリクトが起きている場所に、
<<<<<<< HEAD
int score = 100;
=======
int score = 200;
>>>>>>> main
と自動的にソースコードを書き換えて表示してくれます。
また、該当するファイルはGitHub Desktop上だと警告マーク(
)がつくと思います。
これの見方ですが、「=======」で区切られていて、上が自分のコード、下が相手のコード(マージされる側のブランチの内容)になっています。
修正のやり方は簡単で、どっちのコードを優先すればいいのかを手動で書き直してあげるだけです。
なので、自分のやつを通したいなら
int score = 100;
こうするだけでOKです。
逆に相手の方(今回の場合はmainブランチ)に合わせるなら、
int score = 200;
と書き換えてあげればOKです。
最後にCommitとPushをして、GitHubに上げましょう。そうすると、問題がきちんと直っているようであれば「Ready to merge」と出てマージできる状態になると思います。そうなれば修正完了です!
最後に
いかがでしたか!
ここまで学べば一通りの運用ができるんじゃないかなって思いますが、もっと詰めればさらに効率よく、安全に運用することができます。
ぜひ「もっとGitHubについて知りたい!」っていうことがあったら、調べてみましょう!
2回分で「意外と簡単に始められる!」っていうのがわかってもらえたらうれしいです!
最後までありがとうございました!









