20210115のGitに関する記事は9件です。

__git_ps1: command not found

事象 : shと打ったらなんか言われるようになった。

  • 環境 : Windows10 Pro バージョン1909
# なんか言われた
ponsuke@tarou MINGW64 /c/git/git-repo (develop)
$ sh
sh: __git_ps1: command not found
# 何しても言われるようになった・・・ブランチ名が表示されなくなってしまった・・・
ponsuke@tarou MINGW64 /c/git/git-repo
$ cd .git
sh: __git_ps1: command not found

原因 : git_ps1コマンドが消失したから?

参考 : bash_completionで「-bash: __git_ps1: command not found」となった時の対処法 - くりにっき

対応 : Git Bashを再起動する

その画面を閉じてまた起動すれば大丈夫!

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

Gitアカウントを2つ使用して運用するには

はじめに

会社で使用している設定ファイルの中には個人的に使ってる設定ファイルも含まれているので、
そーいうのは個人的なアカウントのリポジトリで管理している。
このままだと会社のアカウントでPushされてしまうので、
このリポジトリのファイルは個人アカウントでコミットしたい。
みたいな設定の仕方の忘却録。

まずは個人用アカウントへ繋ぐ為の公開鍵・秘密鍵を作成&設定

$cd ~/.ssh/{$個人アカウント用}
$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

今使用しているのとは別にしたいので、適当に名前つける。
一回目のタイミングで名前を指定する。
あとはEnter2回叩く。

生成された公開鍵をGitHubに設定する。
この辺とか参考: https://qiita.com/0ta2/items/25c27d447378b13a1ac3

sshのconfig設定について

vim ~/.ssh/config

configが無ければ作成する。

Host {$社内用}
  HostName github.com
  IdentityFile ~/.ssh/{$社内用}/id_rsa
  User git 
  Port 22
  TCPKeepAlive yes 
  IdentitiesOnly yes 

Host {$個人用}
  HostName github.com
  IdentityFile ~/.ssh/{$個人用}/{$新しく作ったKey名}
  User git 
  Port 22
  TCPKeepAlive yes 
  IdentitiesOnly yes

Hostに適当に名前をつけて接続テスト。

ssh -T {$社内用}
Hi {$社内用アカウント名} You've successfully authenticated, but GitHub does not provide shell access.

ssh -T {$個人用}
Hi {$個人用アカウント名} You've successfully authenticated, but GitHub does not provide shell access.

テスト成功であればこんな感じにsuccessfullyと出る。
もし、接続失敗することがあれば、~/.ssh/known_hostsの中身を消して試してみる。

gitconfigについて

まず、gitconfig設定には、システム全体system、ユーザー全体global、個別リポジトリ用localの3種類がある。
読み込み順は、systemgloballocal の順に読まれるのでlocal設定があればlocalの設定が反映される。
各設定の確認は下記で行える。

git config --system --list // gitをinstalしたディレクトリ
git config --global --list // ~/.gitconfig
git config --local --list  // 対象リポジトリ内の .git/config

社内用で使用しているのはglobal設定なのでこれはそのままにしておいて、
個人用リポジトリ内でのlocalの設定をしていく。

// 任意の場所で
git clone {$該当のリポジトリ}
cd {$該当のリポジトリ}/.git
vim config

cloneしてきた.git内にあるconfigがlocal設定ファイルになる。

[user]
    name  = 該当のユーザID
    email = 該当のメールアドレス

このlocal設定に個人用を追加しておく。

git config --local user.name "該当のユーザID"
git config --local user.email "該当のメールアドレス"

これでも名前とメールアドレスを追加出来る。

あと、このリポジトリのremoteの設定をしておかないとpush出来ないので設定する。

git config remote.origin.url
git@github.com:[該当のユーザID]/[リポジトリ].git

これで確認してみると@マーク以下がgithub.comになってので、
これだとssh configで設定しているHostNameが2つ存在するので接続Errorになる。
ssh configで設定した情報を元に@マーク以下を修正。

git remote set-url origin git@[個人用ホスト名]>:[ユーザID]/[リポジトリ].git

一旦、pushする前にgit logなどで確認しておくと良い。
社内用でpushする時は会社のアドレスで、個人のファイルを修正した時はlocalで設定したものが反映される。

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

Gitコマンド【チートシート】

「忘れちゃっても実装できる仕組み」を作りたくて、基本的なgitコマンドをまとめました。

今後も長らくお世話になるものだと思うので、自分を含め他の人のお役に立てれば幸いです。

init【リポジトリの準備】

ディレクトリにリポジトリを作成.

$ git init

ベアリポジトリの作成

$ git init --bare

グループ書き込み権限を有効にする.

$ git init --shared

remote 【リモートリポジトリの一覧】

リモートリポジトリの一覧表示

$ git remote

リモートリポジトリの追加

$ git remote add [username] [remote repository PATH]

リモートリポジトリの名前変更

$ git remote rename [remoterepository] [new name]

リモートリポジトリの情報を見る

$ git remote show [remote repository]

リモートリポジトリで排除されたブランチをローカルからも削除

$ git remote prune [remote repository]

fetch 【リモートリポジトリの情報のついかと更新】

リモートリポジトリの最新情報を追加

$ git fetch [remote repository]

リモートリポジトリの削除情報をローカルに更新

$ git fetch --prune

branch【ブランチの操作】

現在のブランチの確認と、新しいブランチを作成

$ git branch &[new branch]

すべてのブランチを確認

$ git branch -a

リモートブランチを確認

$ git branch -r

ブランチを削除

$ git branch -d [branch]

ブランチの名前を変更

$ git branch -m [branch] [new branchname]

他のユーザーのブランチ、自分のブランチを関連付ける

$ git branch --set-upstream [my branch] [other branch]

add 【インデックスに追加・登録する】

ファイルやディレクトリをインデックスに登録.

$ git add [filename]

すべての変更を含むワークツリーの内容をインデックスに追加.

$ git add -A

以前コミットしたことがあるファイルだけインデックスに追加.

$ git add -u

commit【コミットの操作】

インデックスに追加されたファイルをコミット

$ git commit

コミットメッセージを添えてコミット

$ git commit -m “[comment]”

新規を除く変更されたファイルをインデックスに追加してコミット

$ git commit -a

直前のコミットを修正

$ git commit --amend

status ファイルの変更を表示

前回のコミットと比較してどのファイルが変更されたかを表示.

$ git status

log 【コミットログの操作】

コミットログを参照

$ git log

コミットログの先頭7桁のコミットIDを表示

$ git log --oneline

コミットログのHEADの位置を明示

$ git log --decorate

コミットログを縦グラフで表示

$ git log --graph

指定した文字がコミットログに含まれるコミットを表示

$ git log --grep [filter]

diff 【差異を表示】

インデックスとワーキングツリーの差異を表示

$ git diff

HEADとインデックスの差分を表示

$ git diff --cached

コミット間の差異を表示

$ git diff [commit id 1] [commit id 2]

checkout

コミットされた過去のファイルを復元

$ git checkout [commit id] [filename]

ブランチを変更

$ git checkout [branch]

コンフリクトしたときに上方を指定してファイル内容を採用

$ git checkout --ours [filename]

コンフリクトしたときに下方を指定してファイル内容を採用

$ git checkout --theirs [filename]

show 【表示に関する操作】

最新のコミット内容を表示

$ git show

タグを指定してコミット内容を表示

$ git show [tagname]

reset 【やり直しなどの操作】

インデックスを現在のHEADの状態にする

$ git reset [commit id]

インデックスからファイルをアンステージ

$ git reset HEAD [filename]

すべてをコミットIDの状態に戻す

$ git reset --hard [commit id]

git reflogで確認した番号の状態に戻す

$ git reset --hard HEAD@{[number]}

直前の状態に戻す

$ git reset --hard ORIG_HEAD

rm 【ファイルを削除】

ワークツリーとインデックスからファイルを削除

$ git rm [filename]

インデックスのファイルを削除

$ git rm --cached [filename]

mv 【ファイル名を変更】

インデックスとワークツリーに同ファイル存在時、ファイル名を変更

$ git mv [filename 1] [filename 2]

revert / rebase 【コミットの取り消し】

コミットIDのコミットを取り消す

$ git revert [commit id]

rebase

コミットIDから古い順にコミットを表示

  • コミットの行を消すとコミットの取り消し
  • 先頭のpickをほかのものに置き換えるとコミットメッセージなどの編集が可能
$ git rebase -i [commit id]

直前のgit rebaseの編集を中止

$ git rebase --abort

git rebaseの変更を適応

$ git rebase --continue

clone 【リポジトリをコピー】

リポジトリをコピー

$ git clone [repository PATH] [new repository PATH]

push 【リモートリポジトリに変更を書き込む】

リモートリポジトリに変更を書き込む.

$ git push [remote repository PATH] [branch]

リモートリポジトリにすべてのタグをアップロード

$ git push [remote repository] --tags

リモートリポジトリに指定したタグをアップロード

$ git push [remote repository] [tagname]

指定したブランチ,もしくはタグをリモートリポジトリから削除

$ git push [remote repository] :[branch or tagname]

pull

リモートリポジトリの変更を取り込む

$ git pull [remote repository PATH] [branch]

merge 【ブランチ同士をマージ】

現在のブランチをほかのブランチとマージ

$ git merge [branch]

tag

タグの一覧を表示

$ git tag

タグとそのメッセージ[行数指定]の一覧を表示する(行数指定なしの場合1行)

$ git tag -n[number]@

タグを,フィルターをかけて表示する.

$ git tag -l [filter]

現在のコミットIDにタグを関連付けする.

$ git tag [tagname]

コミットIDを指定してタグを関連付けする.

$ git tag [tagname] [commit id]

現在のコミットIDにメッセージ付きのタグを関連付けする.

$ git tag -a [tagname]

指定したタグを削除する.

$ git tag -d [tagname]

stash

現在の状態を保存する.

$ git stash

メッセージ付きで現在の状態を保存する.

$ git stash save “[message]”

保存した状態の一覧を表示する.

$ git stash list

最新の保存状態を復元する.

$ git stash pop

番号を指定して保存状態を復元する.

$ git stash pop stash@{[numbar]}

保存状態をリストに残したまま最新の保存状態を復元する.

$ git stash apply

保存状態をリストに残したまま指定した番号の保存状態を復元する.

$ git stash apply stash@{[number]}

保存状態を削除する.

$ git stash drop stash@{[number]}

保存状態をすべて削除する.

$ git stash clear

reflog

過去にHEADが指していたコミット一覧をを表示する.

$ git reflog

ブランチを指定して過去にHEADが指していたコミット一覧を表示する.

$ git reflog [branch]

cherry-pick

別のブランチのコミットを現在のブランチにコピーする.

$ git cherry-pick [commit id]

config

使用されるリポジトリの設定を表示する.

$ git config -l

ユーザ名の設定.

$ git config --global user.name [username]

メールアドレスの設定.

$ git config --global user.email [email address]

出力結果を色づけする.

$ git config --global color.ui auto

まとめ

テーブルにすべきか、コードにすべきか悩みましたが、とりあえずコピペ出来る校舎にしてみましたがいかがでしょうか。

とりあえず最初は

  1. リモートリポジトリをクローン
  2. ブランチを切って作業
  3. 変更してコミット
  4. コミットメッセージを添えてプッシュ
  5. レビューを受けて修正
  6. マージして1にもどる

という開発の基本的な流れができるようになりましょう!

長文お疲れさまでした!

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

特定のブランチで修正されたファイル一覧を出す

結論

これでOK。

git diff --name-only <分岐先ブランチ名> `git merge-base <分岐先ブランチ名> <分岐元ブランチ名>`

CIツールなどを使っていて、unknown revision or path not in the working tree. で怒られる場合は ブランチ名oringin/ブランチ名に修正すればいける(場合がある)

削除したファイルは表示したくない場合(2021/1/15 14:15追記)

git diff --name-only --diff-filter=ACMR `git merge-base <分岐先ブランチ名> <分岐元ブランチ名>` <分岐先ブランチ名>

参考

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

git rebase -i を利用してコミットをまとめる

作業の前に

万一に失敗したときのため、ローカルにバックアップをとるなどリスクヘッジをしておくと安心です。

作業手順: checkout→log→rebase

まとめる対象のブランチにチェックアウト

$ git checkout branch_name

コミットログから「まとめる対象の一つ前のコミットID」を取得する

$ git log

* commit ffc5767e557a84faea786a17d1f3d23ac10e330c
| Author: hoge <hoge@example.com>
| Date:   Fri Sep 18 04:08:27 2020 +0000

rebaseしてコミットをまとめる

$ git rebase -i ffc5767e557a84faea786a17d1f3d23ac10e330c

参考

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

git init後のデフォルトブランチ名をmainに

概要

ローカルリポジトリのデフォルトブランチ名変更

目的

git init コマンドで空のGitローカルリポジトリを作成する際のデフォルトブランチ名を master から main に変更したい。

環境

  • ホストトOS
    • Windows 10
  • 仮想化ツール
    • VMware Workstation Player 16.1.0
  • ゲストOS
    • CentOS 8
  • Git
    • 変更前
      • Git version 2.26.0
      • yum で日本の某ミラーサイトから最新取得
    • 変更後
      • Git version 2.30.0
      • 2021年1月15日現在の最新安定板ソース

背景

下記リンクのAWSハンズオンでAWSを実践しようと思い立ち、記載の手順通りに実施しようとした。

上記の手順ではReactプロジェクトをローカルリポジトリとして初期化し、
リモートリポジトリへpushする手順となっている。

  • git init 後のデフォルトブランチは master

他方、GitHubは昨年秋頃より新規リポジトリのデフォルトブランチ名を master から main に変更していた。

  • GitHubリポジトリ新規作成後のデフォルトブランチは main

リモートリポジトリにはない新規ブランチとして master をpushしても良かったが、
GitHubの声明を読む感じだと今後はGitのデフォルトブランチは main になるのが主流と考えられる。
個人的に main を意識づけしたくローカルリポジトリのデフォルトブランチを変更する方法を調査した。

過程

  • 所要時間 : 2時間
    • 調査 : 1時間30分
    • 実施 : 30分
  1. Git version 2.30.0のソースコードをダウンロード
  2. make configure
  3. ./configure
  4. make prefix=/usr/local all
  5. make prefix=/usr/local install
  6. ゲストOS再起動 <= インストールに成功しても再起動しないと反映されなかった。常駐サービスの再起動でも反映可能か?
  7. npx create-react-app amplifyapp <= 適宜作業ディレクトリにて
  8. git init <= 6.で作成した amplifyapp ディレクトリに移動して実行
  9. git remote add origin git@github.com:{GitHubアカウント}/{新規作成したリモートリポジトリ名}.git
  10. git add .
  11. git commit -m "{適宜コミットコメント}"
  12. git push origin main <= AWSハンズオンサイトではブランチ名が master だったのを main に変更

※途中、Ed25519方式の鍵ペアを作成してGitHubのSSH秘密鍵に登録した。割愛。

結果

問題なくリモートリポジトリの main ブランチに反映できた。
CentOS 8 のyumリポジトリでは、Git最新版が2.27系の模様(2020/01/15現在)。
仕方なくGit公式リポジトリから最新ソースを取得してビルドした。
git config --global init.defaultBranch main でデフォルトブランチ名を main に変更した。
その結果、AWSハンズオンの手順の通りにローカルリポジトリのmainブランチの変更をリモートリポジトリのmainブランチに反映できた。

参照 および 引用

技術情報をご共有頂きましてありがたい限りです。 m(_ _)m

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

VSCode を使って社内 Gitlab の Issue・MR を操作する

はじめに

gitlab 謹製の VSCode の拡張機能 GitLab Workflow が便利だったので、紹介します。

この拡張を使うと、VSCode と Gitlab がシームレスに繋がります。

機能紹介

この拡張機能では、以下のようなことが可能です。

※こちらに挙げたのは一部です。詳細はこちら

  • VSCode で、自分にアサインされている Issue や MR の一覧や詳細を閲覧できる
    • MR は、description とファイル差分もそれぞれ閲覧可能
    • デフォルトのビューは以下の 5 つだが、表示したい Issue や MR はカスタム可能
      • Issues assigned to me: assignee が自分の Issue
      • Issues created by me: author が自分の Issue
      • Merge Requests assigned to me : assignee が自分の MR
      • Merge Requests created by me : author が自分の MR
      • All project merge requests : すべての MR
    • 特に、差分を VSCode の differ で見れるのはありがたい sidebar.png
  • VScode から、Gitlab のAdvanced Searchを行うことができる
    • Issue, MR, Commit, Wiki 等の横断検索が可能
    • GitLensでは Commit の検索は可能なので、使い分け
  • VSCode で、Issue や MR の詳細・編集が可能
    • GUI 上はコメントの追加しかできないが、GitLab Quick Actionsが使用可能なので、大抵のことはできる。以下、一部抜粋
      • /assign me : assignee を自分に
      • /assign @user_name : assignee を @user_name
      • /unassign : assignee を空に
      • /create_merge_request <branch name> : MR 作成
      • /due <date> : due date の指定
      • /label ~label1 ~label2 : ラベル追加
    • issue.png
  • Snippet の作成・挿入が可能
  • GitLabCI 構成の検証が可能

環境

Windows 10: version 2004
Gitlab: GitLab Community Edition 13.6.1
GitLab Workflow: version3.9.0
VSCode: 1.52.1

設定手順

参照: setup

Step1: PAT(Personal Access Token)の発行

  1. https://your-gitlab-domain/profile/personal_access_tokensを開く
    • 或いは Settings> Access Tokens
  2. Add a personal access token の必要項目を埋める

    • Name: Token の名前
    • Expires at: Token の期限
    • Scopes: api, read_userを選択 add_personal_access_token.PNG
  3. Create personal access tokenをクリック

  4. 発行された画面上部の Token をコピー
    token.png

Step2: Gitlab Workflow に Token と Domain を設定する

  1. VSCode を開く
  2. Ctrl + Shift + Pで Command Palette を開く(Mac の場合はCmd + Shift + P)
  3. GitLab: Set GitLab Personal Access Tokenを検索してクリック
    set_gitlab_access_token.PNG

  4. your-gitlab-domain > 作成したTokenの順に入力

    • ドメインを入力する際は、末尾に/を入れないようにする(入れるとエラー)
  5. [カスタムドメインを使用している場合のみ]

    1. Settings.jsonを開く
    2. "gitlab.instanceUrl": "http://your-gitlab-domain",を追加
      • こちらも末尾に/を入れないようにする
      • 詳細はこちら

Step3: 実際に使用する

  1. Ctrl + Shift + Pで Command Palette を開く(Mac の場合はCmd + Shift + P)
  2. View: Show Gitlab Workflow を実行
  3. 現在の Workspace に設定されたリモート URL に存在する Issue と MR が、 View に表示される
    • デフォルトでは RemoteName がoriginの URL を使用する。変更したい場合はgitlab.remoteNameを設定する

他にできること

image.png

終わりに

Gitlab Workflow を使うことで、VSCode とブラウザを行き来する機会が減り、より開発に専念できるようになりました。

参考文献

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

GitHubをCUIで使い倒す

ローカルリポジトリとGitHub上のリモートリポジトリとの連携方法をコマンドで行う。備忘録としてメモしておく。用語などは別記事を参照してください。

クローン

GitHub上で作成したリモートリポジトリをローカルに持ってくる方法。

git clone URL

% git clone https://github.com/UserName/Practice.git
Cloning into 'Practice'...
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), done.

プッシュ

git push origin(リモートリポジトリ名) ブランチ名
※originとは、リモートリポジトリのデフォルト名のこと。

% git push origin main  
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 481 bytes | 481.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/UserName/Practice.git
   6914a74..6273315  main -> main

プル

git pull origin ブランチ名

 % git pull origin main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/UserName/Practice
 * branch            main       -> FETCH_HEAD
   6273315..fd0cb5c  main       -> origin/main
Updating 6273315..fd0cb5c
Fast-forward
 index.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitをCUIで使い倒す

Gitをコマンドで使おう!

Terminalを使ったGitの使用法をまとめる。
Gitのインストールの仕方等は他の記事を参考にしてください。

ローカルリポジトリを作成

作業したいローカルディレクトリまでcdコマンドを使って入り、そこでgit initを入力。すると下記のようにコマンドが走り、ディレクトリ内に.gitファイルが作られる(隠しファイル)。

Initialized empty Git repository in /Users/User/htdocs/lesson/.git/

ディレクトリ内の変更を確認

なにかしらファイルを弄ったりしたら、git statusで確認。

% git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    index.html

nothing added to commit but untracked files present (use "git add" to track)

ステージ

git add ファイル名を使ってステージに上げたいファイルを選択。

% git add index.html
% git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   index.html

コミット

git commit -m "任意のコメント"を入力。

 % git commit -m "index.htmlを作成"
[master 6c0933e] index.htmlを作成
 1 file changed, 11 insertions(+)
 create mode 100644 index.html

※コミットの履歴を確認する方法
git log

% git log
commit 6c0933e04321d94a6fa534441e060fac103ea985 (HEAD -> master)
Author: User Name <メールアドレス>
Date:   Thu Jan 14 23:17:20 2021 +0900

    index.htmlを作成

ブランチ作成〜チェックアウト

1. ブランチ作成

git branch ブランチ名

//ブランチを作っていない状態(マスターブランチのみ)
% git branch
* master

//ブランチを作成
% git branch practice
% git branch
* master
  practice //practiceブランチができた!!

2.チェックアウト

git checkout ブランチ名

//practiceにチェックアウト
% git checkout practice
Switched to branch 'practice'

//チェックアウトできたか確認
% git branch
  master
* practice

//'*'がついているものがチェックアウトしているブランチ

マージ

1.チェックアウトしているブランチで編集内容をコミット

先程の流れで、practiceにチェックアウトした状態で、index.htmlを編集したあと、、、

//変更をコミットする
% git add index.html 
% git commit -m "テキストを追加" 
[practice 9d57bc5] テキストを追加
 1 file changed, 1 insertion(+)

2.マージ先のブランチにチェックアウト

説明割愛でござる

3. git merge ブランチ名でマージ

% git merge practice
Updating f859b2a..9d57bc5
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)

以上がローカルでのGitの使い方の基本です。
別記事でGitHubとの連携(push等)を別途解説します。

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