zomiの「なんでもやってみます!」

プログラミングメモ多め。Java学習中。

久々にGitを触ってみる(Windows編)

1.はじめに

こんにちは。プログラマ2年目のzomi(ぞみ)です。

今日は以前書いたコードをGitで管理していきたいと思ったので、久しぶりにGitを触っていきます。

↓以前の記事

unozomi.hatenablog.com

2.環境

3.現在の状況

  • プログラミング学習中はMacでGitを使用していた(→アカウントは登録済み)
  • 実務ではSVNを使用している(→1年以上Gitを触っていない…)
  • 今回はWindowsで久々にGitを触りたい

SVNとは:(引用)

他のバージョン管理システムとも共通する基本的な機能として、「リポジトリ」(repository)と呼ばれるサーバ上の保管領域でファイルを集中的に管理し、複数の作業者が並行して内容を更新していくことができるようにする。作業者側にリポジトリを置かない集中型バージョン管理システムに分類される。

SVNは「サブバージョン」と読みます。

ローカルリポジトリを置かず、サーバ上のリモートリポジトリでバージョンを管理します。

4.手順

今回行った手順をまとめます。以下の記事を参考に進めました。

tech-blog.rakus.co.jp

①Git Bashのインストール

すべてデフォルト状態でインストールを行いました。

インストールが終わったら起動して、バージョンを確認しました。

$ git --version
git version 2.40.1.windows.1

②初期設定

新規登録する場合は初期設定で「ユーザ名」「メールアドレス」を設定するようですが、以前使用していたため行いませんでした。

「何で設定していたっけ・・・?」

というレベルだったので、確認してみました。( git config --list で確認しました。)

$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
...
user.name=XXX
user.email=xxx.yyy@gmail.com
merge.ff=false
pull.rebase=merges

③リモートリポジトリの作成

GitHubにログインして、リモートリポジトリを作成します。

④ローカルリポジトリの作成

ディレクトリを作成します。今回は「vending」としました。

Git Bashディレクトリに移動してgit init を入力し、初期化を行います。

ユーザー名@パソコン /c/java/vending
$ git init
Initialized empty Git repository in C:/java/vending/.git/

⑤ローカルリポジトリにコミットする

事前にコミットしたいファイルの準備をしていたので、このままコミットを進めていきます。

git add ファイル名(または . で全指定)でインデックスに追加します。

git commit -m “メッセージ内容”でインデックスに存在するファイルをローカルリポジトリへ追加します。

ユーザー名@パソコン /c/java/vending (master)
$ git add .

ユーザー名@パソコン /c/java/vending (master)
$ git commit -m "[Add] files"
[master (root-commit) 9e0ccbf] [Add] files
 3 files changed, 18 insertions(+)
 create mode ...
...

⑥ローカルリポジトリとリモートリポジトリの紐づけ

git remote add origin ~ を実行します。

ユーザー名@パソコン /c/java/vending (master)
$ git remote add origin https://github.com/ユーザー名/ディレクトリ名.git

URLはGitHubで確認することができます。[Code] > [HTTPS]

余談ですが、Git Bushへの貼り付けの仕方が分からず悩みました。(マウスの中央ボタンでできました!)

git push origin mainでプッシュを行います。

5.エラーの解消

プッシュして無事完了!となるところが、エラーになりました。

リモートのmasterブランチの内容をローカルのmainブランチに持ってくる→再度git push origin mainでプッシュを行えばOKだったように思いますが、いろいろとやった結果 強制的にマージしてプッシュする方法を取りました。

見たい方はどうぞ!

There isn't anything to compare.
main and master are entirely different commit histories.

比較するものは何もない。
mainとmasterはまったく別のコミット履歴だ。

デフォルトのブランチをmainとしていたので、

git push origin mainとしていたら 出なかったであろうエラー。

そこでいろいろと試してみました。

①追跡するリモートブランチの設定

以下のコマンドで、origin/masterブランチをそのままコピーする、mainブランチを作成します。

ユーザー名@パソコン /c/java/vending (master)
$ git branch --set-upstream-to origin/master main
fatal: branch 'main' does not exist

②リモートリポジトリの最新の履歴の取得

git fetchを行います。

ユーザー名@パソコン /c/java/vending (master)
$ git fetch
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 582 bytes | 72.00 KiB/s, done.
From https://github.com/ユーザー名/ディレクトリ名
 * [new branch]      main       -> origin/main

③リモートから最新の履歴を取得してローカルにマージ

git pullを行います。

// masterをmainにマージ→origin/mainにプッシュしたい
ユーザー名@パソコン /c/java/vending (master)
$ git pull origin master
From https://github.com/ユーザー名/ディレクトリ名
 * branch            master     -> FETCH_HEAD
Already up to date.

④mainブランチに切り替え

git checkout mainを行います。

※origin/masterとローカルのmainを紐づけているので、分岐したことを教えるエラーが出ています。

ユーザー名@パソコン /c/java/vending (master)
$ git checkout main
Switched to branch 'main'
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

(あなたのブランチと 'origin/master' が分岐しました、
ブランチと 'origin/master' は分岐しており、それぞれ 1 と 1 の異なるコミットがあります。)

⑤リモートから最新の履歴を取得してローカルにマージ

git pullを行ってからマージしたところ、うまく行かなかったので

強制的にマージを行いプッシュして事なきを得ました。。。

ユーザー名@パソコン /c/java/vending (main)
$ git pull origin main
From https://github.com/ユーザー名/ディレクトリ名
 * branch            main       -> FETCH_HEAD
Already up to date.

ユーザー名@パソコン /c/java/vending (main)
$ git merge master
fatal: refusing to merge unrelated histories

// 強制的にマージ
ユーザー名@パソコン /c/java/vending (main)
$ git merge --allow-unrelated-histories master
hint: Waiting for your editor to close the file...
Merge made by the 'ort' strategy.
 ...
 3 files changed, 18 insertions(+)
 create mode 100644 xxx
 create mode 100644 yyy
 create mode 100644 zzz

// 強制的にマージしたのでリモートのmainにプッシュ
ユーザー名@パソコン /c/java/vending (main)
$ git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 367 bytes | 367.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/ユーザー名/ディレクトリ名.git
   3174e74..e946720  main -> main

6.参考

e-words.jp

www.ricksoft.jp

qiita.com

qiita.com

qiita.com

note.com

qiita.com

qiita.com

backlog.com

www-creators.com

www-creators.com

dev.classmethod.jp

7.おわりに

エラーで苦戦しましたが、調べてやってみることが 一番上達の近道なのかなと感じました。 Gitは奥が深いですね...

何かありましたら、ご意見やご感想をいただけると幸いです。 読んでいただき、ありがとうございました。

Javaで何か作りたい①1種類だけ販売してくれる自動販売機

1.はじめに

こんにちは。プログラマ2年目のzomi(ぞみ)です。

今日は現在学習中のJavaを使い、簡単なものを作りたいと思います。

2.環境

Windows 11 Pro 22H2

3.学習中の教材

以下の「スッキリわかるJava」を使用しています。

スッキリわかるJava入門 第3版 (スッキリわかる入門シリーズ) | 中山清喬, 国本大悟, 株式会社フレアリンク |本 | 通販 | Amazon

4.Javaの開発3ステップ

ソースコードの作成と編集

コンパイルによる変換

③完成プログラムの実行

「スッキリわかる~」を学習すると「dokojava」という機能を使用することができます。

とてもお手軽なのですが、実際に自分でも3ステップを体感してみたいと思い環境構築をやってみます。

①c:に「java」フォルダを作成→Main.javaファイルを追加します。

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

コンパイルを行う

コンパイルとは:プログラム言語をコンピュータが理解できる言語に変換すること

C:\java>javac Main.java

③完成プログラムの実行

クラスファイルがあることを確認してから実行します。

C:\java>dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は **** です

 C:\java のディレクトリ

2023/06/17  16:00    <DIR>          .
2023/06/17  16:00               413 Main.class

C:\java>java Main
Hello world

5.今回作成したもの

160円のペットボトルしか販売していない自動販売機です。とにかく作ってみることを意識!

①数字を入力する

②160以上の場合:お釣りの金額を表示して「お買い上げありがとうございました!」で終了(1)

 160未満の場合:160以上を入力するまで「お金が足りません。お金を入れなおしてください。」を繰り返す→160以上を入力したら(1)となるので終了

(1)フローチャート

(2)コード

public class Main {
    public static void main(String[] args) {
        System.out.println("お金を投入してください。");
        // お金を入れる処理
        int money = new java.util.Scanner(System.in).nextInt();
        while ( money < 160 ) {
            System.out.println("お金が足りません。");
            System.out.println("お金を入れなおしてください。");
            money = new java.util.Scanner(System.in).nextInt();
        }

        // お釣りの計算の処理
        int change = money - 160;
        // お釣りを表示する
        System.out.println("投入金額は" + money + "円なので、お釣りは" + change + "円です。");
        System.out.println("お買い上げありがとうございました!");
    }
}

今回は学習内容のうち、3つの要素を入れてみました。

  • 繰り返し
  • キーボードから1つの整数を受け付ける
  • 計算

(3)エラー

以下のエラーが出ました。原因は文字コードの相違です。(ファイル形式をUTF-8で保存しています。)

コンパイルの際に「-encoding UTF-8」をつけることで解消しました。

Main.java:15: エラー: この文字(0x81)は、エンコーディングwindows-31jにマップできません
        // System.out.println("縺願イキ縺?荳翫£縺ゅj縺後→縺?縺斐*縺?縺セ縺励◆?シ?");
                                                            ^
エラー18個

C:\java>javac -encoding UTF-8 Main.java

6.参考

eng-entrance.com

www.ntt.com

qiita.com

qiita.com

qiita.com

7.おわりに

形にするのは楽しいですね!いろいろなものを作り アウトプットしていく習慣を身に着けたいと思います。 学習過程が進んだ際にリファクタリングもしていけたらと思います。 何かありましたら、ご意見やご感想をいただけると幸いです。

読んでいただき、ありがとうございました。