20201028のGitに関する記事は10件です。

【初心者備忘録】Gitコマンドを使用して リモートリポジトリからファイルを削除する

gitを使用し始めたが何もわからず四苦八苦...
とりあえず学んだことを備忘録としてまとめておく。

参考サイト

https://www.findxfine.com/programming/995557962.html

方法

内容としてはそれほど難しいことではなかった。
まず、ローカルのファイルをrmにて削除する。

git rm [削除したいファイル名]

これで、ローカルからファイルが削除されているはず。

次に、削除したという変更内容をcommitする。

git commit -m "delete"

 
最後にpushすることでリモート側に変更内容が反映される。

git push origin master

 
これで、リモート、ローカル共にファイルの削除が完了。
実際にやってみると難しくはないが、理解しないと必要なものまで消してしまう恐れがある。
もっと勉強する必要があると感じた今日この頃である...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

複数のgitアカウントの切り替え

一つのPCで業務用、副業用、個人用など使い分けが発生するとき用のメモ。

globalの確認

メインで使うアカウントはgitの初期設定時にglobalで設定されているはず

$ cat ~/.gitconfig

[user]
    name = hoge
    email = hoge@example.com

$ git config --global user.name
hoge
$ git config --global user.email
hoge@example.com

globalを修正したいとき

$ git config --global user.name "huga"
$ git config --global user.email "huga@example.com"
$ cat ~/.gitconfig

[user]
    name = huga
    email = huga@example.com

特定のリポジトリでアカウント切り替えが必要なとき

$ git config --local user.name
hoge
$ git config --local user.email
hoge@example.com
$ git config --local user.name "huga"
$ git config --local user.email "huga@example.com"
$ git config --local user.name
huga
$ git config --local user.email
huga@example.com
$ cat ./.git/config

[user]
    name = huga
    email = huga@example.com

pushする前にgit logでどのアカウントでcommitされているか確認できる

$ git log
Author: huga <huga@example.com>

リポジトリにアクセスする際の手順

実際にリポジトリにアクセスする際にはホストの向き先の設定をしないと以下のようなエラーが発生した

ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

configに以下のように追記

~/.ssh/config
Host github.com-hoge
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_hoge_rsa

Host github.com-huga
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_huga_rsa

gitリポジトリのoriginのURLを確認する
デフォルトではgit@github.com:[Account name]/[Repository name].gitの形式になっている

$ git remote -v
origin  git@github.com:huga/example-app.git (fetch)
origin  git@github.com:huga/example-app.git (push)

gitリポジトリの向き先URLをconfigに追記したホスト名に変更する

$ git remote set-url origin git@github.com-huga:huga/example-app.git
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitのマージ、リベース再学習メモ

散々記事として書かれている内容ですが Git におけるマージ、リベース関連の話です。
車輪の再発明な感じはしますが、ツール操作の再学習もかねて試したのでそのメモとして残します。

お断り。
コマンドのサンプル以外では、マージ、リベースのようにカタカナで記載しています。

準備

初期状態

履歴のイメージ。
pic01.drawio.png

補足
矢印の方向が上記のよう描いているのは、各コミットは親のコミット ID を持っているからです。

topic ブランチ作成

git branch topic

履歴のイメージ。この時点では、main ブランチ、topic ブランチ共に C2 を指している。
pic02.drawio.png

main ブランチでコミット

履歴のイメージ。main ブランチは C3 を指している。
pic03.drawio.png

topic ブランチでコミット

履歴のイメージ。topic ブランチは C4 を指している。
pic04.drawio.png
アプリでの見え方。GitKrakenでは main ブランチが枝分かれしたように見えますが、この辺はツール依存です。

GitKraken Fork
pic04k.png pic04f.png

いったん、マージする前の準備ができました。

変更を取り込む

topic ブランチ作成後に main ブランチが変更されています。複数人で共同開発している場合、変更内容を topic ブランチに取り込んでテストし、main ブランチにマージします。

ここでは2種類の方法を記載します。

topic ブランチをリベースする

C2 から topic ブランチを作成しましたが、これを C3 から topic ブランチを作成したようにするのがリベースです。

git checkout topic
git rebase main

# もしくは
git rebase main topic

履歴のイメージ。
pic06.drawio.png

この絵では枝分かれしたよう描いていますが、実際は一直線に並ぶイメージです。
説明はじめの方で main ブランチで C3 を作成したときに似ています。
pic07.drawio.png

リベース前後の履歴イメージ比較。コミット C4 の親が C2 から C3 に替わりました。

リベース前 リベース後
pic04.drawio.png pic07.drawio.png

アプリでの見え方。

GitKraken Fork
pic07k.png pic07f.png

これをマージするとどうなるでしょう。

チェリーピックで変更内容を取り込む

他のブランチの特定のコミットだけを取り込む仕組みがチェリーピックです。

履歴のイメージ。新しいコミットが作成されますが、変更内容は C3 と同じ。
pic102.drawio.png

アプリでの見え方。画像内の C3 などはコミットコメントで、コメントもそのまま新しいコミットとして作成されていることが分かります。

GitKraken Fork
pic10k.png pic10f.png

これをマージするとどうなるでしょう。

マージする

変更取り込み有無やマージの方法で履歴がどう変わるでしょうか。

変更を取り込まずにマージする

通常テスト後にマージするため、topic ブランチに変更を反映しないことはないと思いますが、直接マージできるケースの例です。

git checkout main
git merge topic

履歴のイメージ。main ブランチはマージによって新しいコミット C5 となります。
pic05.drawio.png

マージ前後の履歴イメージの比較。

マージ前 マージ後
pic04.drawio.png pic05.drawio.png

アプリでの見え方。

GitKraken Fork
pic05k.png pic05k2.png

リベース後にファストフォワードなしでマージする

通常 Git はファストフォワードありでマージしようとするのですが、先にファストフォワードなしの例を示します。

topic ブランチを main ブランチに対してマージする際、 --no-ff オプションを付けるとファストフォワードなしのマージとなり、コミットを作成してくれます。

git checkout main
git merge --no-ff topic

履歴のイメージ。C3 から分岐した C4C5 としてマージされます。

pic08.drawio.png
マージ前後の履歴イメージの比較。

マージ前 マージ後
pic07.drawio.png pic08.drawio.png

アプリでの見え方。

GitKraken Fork
pic08k.png pic08f.png

リベース有無によるForkの履歴の見え方を比較してみます。

リベースなし リベースあり
pic05k2.png pic08f.png

リベース後にファストフォワードありでマージする

こちらが Git デフォルトの動作です。

先ほどとは異なり --no-ff オプションを付けなかった場合、main ブランチにはコミットは作成されず、指し示すコミットだけが変更されます。

git checkout main
git merge topic

履歴のイメージ。
pic09.drawio.png

main ブランチが指し示すコミットを先に進めるだけの処理が「ファストフォワード(早送り)」となります。
マージ前後の履歴イメージの比較。

マージ前 マージ後
pic07.drawio.png pic09.drawio.png

アプリでの見え方。

GitKraken Fork
pic09k.png pic09f.png

アプリでも履歴のイメージ図のような見え方になっています。

マージ前 マージ後
pic07f.png pic09f.png

ご覧の通り、topic ブランチで作成した痕跡が残らないため、私はリベースするなら --no-ff オプションを付ける運用にしています。

チェリーピック後にマージする

最後に、チェリーピックを行ったときのマージです。

履歴のイメージは、ごく普通に新しいコミット C6 が作成されてマージされたものとなります。
pic11.drawio.png

チェリーピックしたときにコンフリクトが発生していなければ、コミット C6 の変更内容はコミット C4 と同じになります。これはコミット C3C5 は変更内容が同じのためです。

アプリでの見え方。

GitKraken Fork
pic11k.png pic11f.png

補足:プルとマージ

今回はあえて触れなかったリモートとの連携に関して少しだけ触れておきます。

他人の更新は基本的にリモートにあるためそれをローカルへ取り込む必要があります。
この方法としてはプルとフェッチがあります。
フェッチはリポジトリーの情報をローカルへ持ってくるだけ。プルはフェッチを行った後、ローカルブランチに対するマージを行う操作になります。

今まで記載してきたリベースやマージの部分を理解すると、プル操作にあるオプションが少しは理解しやすいのではないでしょうか。

・オプションなし:可能な限りファストフォワードをします。ファストフォワードできない場合はコミットを作成してマージします。--ff オプションと同じ。
--no-ff:リモートの変更を必ずコミットを作成してマージします。
--rebase:リモートの変更をリベースして取り込み、ローカルで変更した内容を反映します。
--squash:リモートの複数の変更をまとめてチェリーピックするような挙動をします。マージ済みの扱いになりますが、自動的なコミットは行われません。

最後に

コンフリクトが発生してない単純なケースでのまとめのため、実際はもっと複雑です。大人数で開発していると、裏ではどんどんマージが行われ、チェリーピックに追われる日々みたいなこともあります。

みんなで共有しているブランチでリベースだけはやめましょう:sob:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCodeを開くとソース管理が5000件と表示される。

Qiita初投稿となります。

VScodeを開くとアクティブな変更が多すぎますと警告が出る。

サイドバーを見るとソース管理の部分が5000件になっていた。
無視しようと思いましたが、すごく気になる。。。

それから、ググっても中々出てこず1時間格闘の末に
次の記事を見つけました。

Visual Studio CodeとGitHubの連携

ソース管理が5000件と表示された時の対処法
無事、ダウンロードが済んだところで何故かソース管理が5000件になっていました...。
調べてみたところ、いつの間にか隠しフォルダの.gitができていたのが原因のようです。

Gitの学習を中途半端にしていた事があり、
久しぶりに触った時にgit initを入力した事を思い出しました。

実際に確認すると隠しフォルダに
.gitフォルダが作成されていましたので削除。
記事通り消すことができました。

一応、念の為に隠しフォルダの探し方も載せておきます。

隠しフォルダの探し方

command + shift + .

これはすぐに出てきたのですが、
肝心のホームディレクトリをどこで表示させるのかわからず。

またググらせていただき、次の記事を見つけることができました。

ターミナルからFinderを開く

ターミナルで次のコマンドを入力
open ~

以上を踏まえて、結果的には下記の手順ですね。

1 . open ~ ターミナルからホームディレクトリを開く
2 . command + shift + . 隠しフォルダを表示→.gitフォルダ削除

これで解決したという話です。

以上、ほとんど無いエラーだと思いますが、
私のメモ代わりに投稿させていただきました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

git : vscodeで扱うgitのあれこれ(個人メモ)

初書:2020/10/28
PC:macOS 10.15.7
git version 2.28.0

前書き

個人的メモなので、さほど解説とかはないかも

前提

gitの理解

拡張機能

・GitLens
・Git Graph

バージョン確認

ターミナルにて

% git --version

gitの開始

ターミナルにて

% git init

名前とメールアドレスの設定

ターミナルにて / git initの後

% git config --local user.name xxx
% git config --local user.email xxx@example.com

xxxxxx@example.comは任意に変更
なお、グローバルで変更する場合は、--local--global

終わりに

git自体実はあんまり理解していないので、随時追加していく…かも

参考サイト

君には1時間でGitについて知ってもらう(with VSCode) - Qiita

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git Bash for Windows で構築する GitHub・GnuPG の環境(自分用メモ)

目標

Windows において Git Bash を使って GitHub へGPG署名付きコミットできるように設定します。

前提

  • GitHubアカウントは作成済みとします

Git Bash for Windows をインストールしよう

ダウンロード

https://git-scm.com/ よりダウンロードします。

インストール

インストーラ Git-2.29.1-64-bit.exe(2020/10/28現在の最新版)をダブルクリックします。

2020-10-28_15h35_35.png

基本的に Next の連打で問題ないと思いますが、尋ねられるオプションで気になるところがあれば、適宜デフォルト以外のラジオボタンを選択してください。

2020-10-28_15h51_07.png

インストールが完了したら、Launch Git Bash を選択すると MinGWのターミナルが起動します。
これで Bash が使えるようになりました。

SSH鍵の設定をしよう

SSH鍵の作成

ssh-keygenコマンド(Git Bash に同梱されています)でSSH鍵を作成します。
プロンプトにたいしてはEnter連打でも構いませんが、気になる人は適宜パスワード等を設定しましょう。

bash
$ ssh-keygen -t rsa -b 4096 -C "あなたのメールアドレス"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/あなた/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.

SSH公開鍵をGitHubへ登録しよう

上で作成したSSH公開鍵(あなたのホームディレクトリ/.ssh/id_rsa.pub)をエディターで開いて、その全文をクリップボードにコピーします。

GitHub の SSH and GPG keys を開き、New SSH Key をクリックします。

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_609660_5bc39f39-4795-50eb-c048-aa39ba7624f8.png

タイトルを入力し、クリップボードの中身をペーストして Add SSH key をクリックします。

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_609660_5a3bdead-71e3-e2a7-19dd-52122eeec16b.png

SSH接続してみよう

ssh githubと入力するだけでGitHubに接続できるよう ~/.ssh/config を作成します。

~/.ssh/config
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

テストしてみます。

bash
$ ssh github
PTY allocation request failed on channel 0
Hi sprout2000! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

「認証できたけど、GitHubではシェルアクセスを提供してないよ」的なメッセージが表示されれば成功です。

Git の設定をしよう(その1)

まずはユーザ名とメールアドレス(GitHubに登録しているもの)を設定します。

bash
$ git config --global user.name "あなたのユーザー名"
$ git config --global user.email "あなたのメールアドレス"

設定した内容を確認するには、 git config --list が使えます。

$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=input
core.fscache=true
core.symlinks=true
credential.helper=manager-core
pull.rebase=false
credential.https://dev.azure.com.usehttppath=true
user.name=あなたのユーザー名
user.email=あなたのメールアドレス

Windows では下2行以外がデフォルトで(もしくはインストールオプションにしたがって)設定されています。

GnuPG の設定をしよう

Git Bash には GnuPG (gpgコマンド)も同梱されています。

bash
~$ which gpg
/usr/bin/gpg

GPG鍵を作成しよう

gpg --gen-key を使ってGPG鍵を作成します。

bash
$ gpg --gen-key
gpg (GnuPG) 2.2.23-unknown; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: Taro Qiita
Email address: foobar@example.com
You selected this USER-ID:
    "Taro Qiita <foobar@example.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O

Pinentry というウィンドウがあらわれるので、パスワードを入力してOKをクリックします。

2020-10-28_16h36_41.png

gpg -k で作成した(もしくはインポートした)GPG鍵の一覧を表示できます。

bash
$ gpg -k
/c/Users/あなた/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2020-10-28 [SC] [expires: 2022-10-28]
      3E54C458203B8AEF5A670F5F4C859AB53E971CC0
uid           [ultimate] Taro Qiita <foobar@example.com>
sub   rsa2048 2020-10-28 [E] [expires: 2022-10-28]

すでに GPG鍵を作っている場合

そのGPG鍵の秘密鍵をインポートしてください。

$ gpg --import private-key.gpg

秘密鍵をインポートすると公開鍵も同時にインポートされます。

bash
$ gpg -k
/c/Users/あなた/.gnupg/pubring.kbx
-------------------------------------
pub   rsa2048 2020-10-28 [SC] [expires: 2022-10-28]
      3E54C458203B8AEF5A670F5F4C859AB53E971CC0
uid           [unknown] Taro Qiita <foobar@example.com>
sub   rsa2048 2020-10-28 [E] [expires: 2022-10-28]

ただし、インポートしただけでは「信用」の項目が unknown となってしまうので、信用の設定をしましょう。

bash
$ gpg --edit-key あなたのメールアドレス
Secret key is available.

sec  rsa2048/4C**********1CC0
     created: 2020-10-28  expires: 2022-10-28  usage: SC
     trust: unknown       validity: unknown
ssb  rsa2048/0ABBE7F******D65
     created: 2020-10-28  expires: 2022-10-28  usage: E
[ unknown] (1). Taro Qiita <foobar@example.com>

gpg> trust          <--- 'trust' と入力

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5    <--- '5' と入力
Do you really want to set this key to ultimate trust? (y/N) y

gpg> quit           <--- 'quit' で編集終了

GPG公開鍵を GitHub へ登録しよう

GPG公開鍵をエクスポートします。

~$ gpg -a --export あなたのメールアドレス > public-key.gpg

エクスポートした public-key.gpg をエディターで開いて、その全文をクリップボードにコピーします。

GitHub の SSH and GPG keys を開き、New GPG Key をクリックします。

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_150106_44d0f921-5331-4980-34fd-9460d239eaec.png

クリップボードの中身をペーストし、Add GPG key をクリックします。

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_150106_5a54f1d5-93bf-a5fc-f056-de87c5f0c1f4.png

Git の設定をしよう(その2)

コミット時にGPG鍵を必要とするように設定します。

bash
$ git config --global gpg.program `which gpg`
$ git config --global user.signingkey "あなたのメールアドレス"
$ git config --global commit.gpgsign true

今後はレポジトリで git commit するたびに Pinentry がGPG鍵のパスワードを要求してくるようになりました。

2020-10-28_17h27_42.png

謝々

Git でコミット作成者を偽装する方法/署名付きコミットでの対策@Siketyan さんの記事)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

github.com の default branch が main になっていたので敢えて master に戻した話

github.com で新規に repository を作成すると default branch が main になっていた。

やったことのメモ(最短じゃないので適当)

git branch master
git checkout master
touch README.md
git add ./README.md
git commit -m 'first commit'
git merge main
git gc
git push origin main
git branch -D main
(create branch master as empty on the web github.com)
(change default to branch master on the web github.com)
git push -f origin master
git push --delete origin main
git branch -r
git rebase -i HEAD~~
(fixup)
git log
git commit --amend
git log
git push -f origin master
touch README.md
git add ./README.md
git commit -m 'first commit'
git push origin master
git remote set-head origin --auto
git branch -r
git gc

https://github.com/nomissbowling/change_main_to_master

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

git cherry-pickで別ブランチのコミットを取り込む

コミットを取り込みたいブランチへ移動

git checkout development

取り込みたいコミットIDを確認

git log

ローカルブランチにコミットを取り込む

git cherry-pick <commitid>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitの基本

gitとは
ソースコードを始めとするファイルの変更履歴を管理するためのシステムです。
変更履歴を記録するシステムののことをバージョン管理システムと言います。

gitをなぜ使う必要があるのか
ファイルの変更履歴を管理するため

gitを使う上での利点
何か問題があった時に過去のファイルに戻れるようにしておくため

githubとは
gitの仕組みを利用したwebサービスのこと。gitの機能に対してチーム開発の便利な機能と付け加え、
gitにおけるリモートリポジトリの役割もになっている。
github上にチームで共有のプロダクト(ソースコード)を配置し、開発者はgithub上からソースコードをコピーしたり、ソースコードをgithub上のリポジトリに反映させることができる

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubプライベートリポジトリのCloneでremote: Repository not found.

GitHubのプライベートリポジトリをCloneしようとした際に、以下のようなエラーが出ました。
解決したので共有します。

$ git clone https://github.com/username/dummy.git
Cloning into 'dummy'...
remote: Repository not found.
fatal: repository 'https://github.com/username/dummy.git/' not found

解決策:Gitbashのバージョン更新、ユーザ名の指定

普段はWindowsで作業をしており、Git for WindowsのGit Bashを使用していましたが、
長らくアップデートをしていなかったのが主な原因だったようです。

# アップデート前
$ git --version
git version 2.23.0.windows.1

# アップデート後
$ git --version
git version 2.29.0.windows.1

アップデート後に、ユーザ名を指定して実行することでCloneすることが出来ました。

$ git clone https://username@github.com/username/dummy.git

パスワードが聞かれるので応答する。

※Gitをアップデートせずにユーザ名を指定してもCloneはできませんでした
※ユーザ名を指定しなかった場合はnot foundのままでした。

Git for Windowsのアップデート方法

Git for Windowsのアップデートは、以下のコマンドで実行できます。

$ git update-git-for-windows

同様のエラーが出てしまい他の方法を試してもClone出来ないという方は、
アップデートしてみるのも良いかもしれません。

今回は以上です。

参考

Git Bashを手動でアップデートする方法【Git for Windows】
私家版 Git For Windowsのインストール手順

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む