しんさんのブログ

科学や技術のこと読書のことなど

Git初心者が読むメモ

2023/9/27追記

このブログの方法では最近のgithubで問題が起きることがわかりました。 1)ローカルのdefault branchをmastar -> mainに変更する。

git config --global init.defaultBranch main git config --system init.defaultBranch main

2) リモートリポジトリへ初めてローカルからpushするときに問題が発生する。 以下のブログに問題の発生の様子とその対処法が書いてある。 [Git] fatal: refusing to merge unrelated historiesを解決する話 - Qiita

2020/11/25追記:非常にわかりやすい解説がありましたのでリンク張っておきます。初心者はこれを読めばversinon 管理について知ることができます。

一人でコードの開発をするときにも、バージョン管理とバックアップも兼ねてのリモートリポジトリの利用は便利だなと思います。 そのために必要なコマンドのメモ集です。 最近はGitHubでもprivateリポジトリを無料で持てるので、一人開発もGitHubを使用しています。

Gitの初期設定

Gitの設定をするにはgit configコマンドを使う

  • 設定の一覧の表示

    git config --list

  • 特定の設定を確認

    git config user.name

  • ユーザー名の設定

    git config --global usr.name hoge

  • メールアドレスの設定

    git config --global user.email hoge@hoge

  • editorの設定

    git config --global core.editor "code --wait"

Gitの基本操作

  • git init/git clone: Gitローカルリポジトリの作成/取得
  • git add ステージングエリアに変更を登録
  • git reset ステージングエリアに追加した変更をワークツリーに戻す
  • git commit コミットを作成
  • git rm Gitで管理しているファイルの削除
  • git branch ブランチによる作業場所の確保
  • git checkout ワークツリーの変更を取り消す
  • git merge: 変更を取り込む
  • git status ローカルリポジトリの状態を確認する
  • git diff 各エリアの差分を確認する
  • git log コミット履歴を確認する
  • git push: ローカルリポジトリをリモートリポジトリに反映する

初めてのGit作業の手順

プロジェクト用にからのディレクトリを作成する

そのディレクトリで git init を実行する

git init

.git fileが作成されローカルリポジトリのmaster が作られる. ファイルはすべてワークツリーに配置される。 .gitignoreに登録するとGit管理外になる。 存在するファイルはすべてワークツリーに配置されuntracked状態になる。
すでにリモート上にリポジトリが存在するときにはgit cloneを使用して、リモートからローカルにcloneする.

git clone --recursive https://someuser@bitbucket.org/someuser/test.git

README.md fileを作成する

gitの状態を確認

git status  

管理対象に追加(ステージングエリアに上げる).

git add <file/dir name>

or カレントディレクトリ全部
git add . or git -A
-Aオプションは可能なファイル全部を表す

コミット対象から外す

git rm

コミット対象の差分を確認

ファイルの修正前と修正後の差分を確認

  • ステージングエリア登録後にワークツリーにどんな変更があったのかを調べる。ワークツリーとステージングエリアの差分を表示。

    git diff

  • Gitディレクトリとステージングエリアの差分。ステージングエリアにどんな変更が登録されているかを見る。

    git diff --cached

--cachedオプションはコミット対象(ステージングarea)の差分を表示することを意味する

ファイルをGitで管理しないようにする

.gitignore ファイルを作りそこにfileName/dirName書き込む

ファイルの状態の確認を行う(変更されたファイルの一覧)

git status

コミットするためにユーザー名とメールアドレスの設定が必要

git config --global user.email "abc@def.ghi"
git config --global user.name "Hoge hoge"

(--globalを付けるとそのPCでのすべての操作に関してこの内容を使う)

gitの設定の確認

git config --list

コミットを行う

コメントをつけてcommitするには

git commit -m "first comment"

詳細な変更も記述してcommitを行うには
-mを付けないとVSCodeが立ち上がってエディタ上でコメントを入力できる

git commit -V

コミットの確認 (最後にコミットされているファイルと現在のファイルの比較され、差分が表示される)

1commitにつき1行だけのコンパクト表示

git log --oneline

変更箇所の詳細表示

git log -p xxxxxx

どのファイルがどれくらい変更されてるかの統計情報

git log --stat

ローカルリポジトリでの操作を取り消す

ワークツリーへの変更を取り消して、Gitディレクトリにあるファイルに取り換える git checkout, ステージングエリアへの変更を取り消す git resetがある。

git checkout: ファイルが直前のコミット(または直前のステージングエリアへの登録ファイル)に戻る。変更をいろいろやったがやっぱり直前のコミット状態に戻したいときに使う。パラメータにブランチ名を指定するとブランチの切り替えにも使える。

git checkout -- hoge git checkoutは上記の状態の取り消しのほかにブランチを作るブランチを切り替えるコミットした状態に切り替えるなど4つの目的で使える。 新たにgit restoreコマンドが上記の取り消しに使うコマンドとして提唱されている ブランチ切り替えに関してはgit switchコマンドがある

ステージングエリアにファイルが残っていると上記操作が意図通りにならないのでステージングを取り消すにはgit resetを使う git reset: git addしたステージングエリアへの登録を取り消す

コミットを取り消す

git reset HEAD hoge.cpp  

HEADは直前のコミットを取り消すことを意味する
git revert コミットID
を使う方法もある。この方法はコミットの取り消しをコミットするというようなイメージ

コミットしたファイルをGitの管理から外し削除する

git rm finename
git rm -r directoryname

git rmでワークエリアからファイルが削除される(削除するとともに削除した状態をステージングする)がGitディレクトリからは削除されていない。git commitすることで削除するというのをコミットしてGitディレクトリからも削除される。

git rm --cached

(.gitignoreに書き込んでおく)

現状の状態の確認

git status
コミットの履歴
git log

Gitで管理しないファイルを設定する

.gitignore というファイルを作成しそこに無視したいファイル名やディレクトリ名を書く。

コミット履歴の確認

git log

コミットメッセージ以外の詳しい作業内容の情報も欲しいとき

git log -p

リモートリポジトリへ登録

gitHubにアクセスし、新規リポジトリを作成する
1. gitHubにアクセスし、新規リポジトリを作成する
2. 右上のタブから"New repository"を選択
3. Repository name を決める
4. private/publicの選択
5. create repositoryをクリックしてリポジトリを作成する

remote repositoryへの登録

git remote add origin https://github.com/hogehoge/hogename.git

ローカルでの開発内容を共有リポジトリに反映させる

git push -u origin master

-uオプションは次回から入力を省略するためのもの
git push -u origin master とすると、次回から git push だけで引数に指定した origin master で勝手に push してくれる
ユーザ名やパスワードを聞かれるので入力
origin は共有リポジトリのこと。レポジトリの場所(URL)の別名
master はブランチの名前
master は大事なブランチなので、個人利用では自由にpushしても大丈夫だがチームでの場合はmasterには通常pushしない
ブランチはGUIから確認可能(<>Codeタブのすぐ下に n branches と出ていて、クリックすると詳細が見れる)

以上で、初めてローカルリポジトリを作りそれをリモートのmasterブランチに反映させる方法が終了.

実際に作業は、共同作業ということを考えるとコード集約を妨げないように、自分専用のブランチを作って、そこで作業を行う.
  1. まずは現在のブランチを確認: git branch
    アスタリスクのついていものが現在のブランチ
  2. 新しブランチを作成する: git branch [ブランチ名]
  3. ブランチ切り替え: git checkout [ブランチ名]
  4. ブランチ先へのコミット(上で書いたmasterへの作業と同じ)
  5. 状態確認をする:
    • git status
    • git diff
    • git commit -m "hogehoge"
  6. リモートにPushする:
    git push origin ブランチ名

コンフリクト解消方法

もしコンフリクトがあると git fetch
git pull
すると、CONFLICTと表示される。
VSCodeなどでコンフリクトしている部分を修正 git add, git commitでマージコミットする
最後にgit pushでリモートに送る

ブランチでの作業が終了して、ブランチをmasterにマージする
  1. masterとの差分の確認 git diff master
  2. マージ先(master)に移動: git switch -c master
  3. 作成したブランチをマージ先にマージ:git merge ブランチ名
  4. ログ確認(変更内容がマージ先に反映されているか確認): git log
  5. リモートに反映: git push origin master
  6. マージが終了したので、作業用ブランチを削除: git branch -d ブランチ名
  7. ブランチの削除をリモートに反映: git push origin :ブランチ名
    (コロンを忘れないように)

ローカルリポジトリのmasterブランチにリモートリポジトリoriginのmasterブランチを取り込みたいとき

git switch -c master #(ブランチをマスターに切り替え)

 chekoutの代わりに、git switch -c [ブランチ名]、と書くのが推奨されています。確かにこちらの方がわかりやすい。 git fetch origin master #(リモートリポジトリからコピーする)

プルリクエストでブランチをマージする方法

pull requestを作成すると自分がプロジェクトに対して加えた変更を他の人に知らせることが出来る。

  1. リモートにpushする git push origin hoge
  2. プッシュ後にgithubのプロジェクトページを開く
    行進されたブランチが黄色で表示されている
    ここからプルリクエストを作成する
  3. ベースブランチを自分のアカウントのリポジトリに変える
  4. プルリクのコメントを入力
  5. レビュアーを指定する
  6. Crate pull requestをクリックする
  7. reviewがChange Approvedになったらマージする Create a merge commit: ブランチも含め全コミットが追加される Squash and merge トピックブランチのコミットをまとめたコミットが追加される Rebase and merge ベースブランチのコミット履歴を一直線にする

リモートリポジトリの内容をローカルに反映する

反映する方法は2種類ある. pullとfetch
Pullはローカルリポジトリだけでなくワークツリーにも反映されパソコン内のファイルが即座に書き変わる.
フェッチはローカルリポジトリへの取得のみなのでワークツリーに変更を反映するにはpullするかマージする必要がある。pull = fetch + merge

  1. git pull origin master
  2. git fetch origin

ファイルやディレクトリ名を変更したり、移動する

git mv <sourceFilename> <dstFilename>

ブランチ名変更

git branch -m <sourceBranchName> <dstBranchName>

ブランチ削除

git branch -d <BranchName>

ブランチの切り替え

git switch -c [ブランチ名]

ブランチのマージ

git merge <BranchName>

ブランチの状況の確認には

git log --all --graph --pretty=oneline
既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit initしてファイルを追加したりすると何がおきるか
git push -u origin master

error: src refspec master does not match any.
error: failed to push some refs to 'https://github.com/hoge/hogehoge.git'
となりエラーが出る

既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit clone してから、ファイルを追加したりすると何がおきるか

add -> commit -> push で新たなファイルをリモートリポジトリのmasterに登録できた

[ここまでをまとめると]

Gitサーバー上でプロジェクトを作成.すると,内容が空のリポジトリができる(GUI 操作)
Gitサーバーからリポジトリを複製して,手元に作業ツリーを作成 (git clone).空の作業ツリーができる.
作業ツリーにソースコードを追加し,フォルダをGitに追加 (git add)
変更をコミットする (git commit)
コミットした変更をGitサーバに送り込む (git push)
他のメンバーもGit上のリポジトリを複製 (git clone) すると, ソースコード一式が既に入った作業ツリーが取得できる

過去の状態に戻す方法:

git branch devbranch2 comitID