20200926のGitに関する記事は8件です。

この行がマージされたプルリクを見たい

最近よくコードリーディングをしているので、GitLensを重宝しています。
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

コミットIDやコミットメッセージを簡単に見られるので、
「なぜこの変更が行われたのか」を確認することができます。神。

ただ、この情報だけでは足りず
「このコミットがマージされたプルリクを見たい」となることがあります。
こうなると、

  1. GitHubで該当のCommitを開く
    https://github.com/[user|org]/[repo]/commit/[commit_id]
  2. プルリクへのリンクがあるのでクリック

と確認することになりますが、繰り返していくと面倒になってきます。
そこで、シェルを作りました。

git-open-pr
#!/bin/bash -eu

DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch" | sed "s/.*: //")

COMMIT_ID=$(grep -Fxf \
  <(git log --first-parent --merges --pretty=format:%H $DEFAULT_BRANCH; echo) \
  <(git log --ancestry-path --merges --pretty=format:%H $1..$DEFAULT_BRANCH; echo) \
| tail -n 1)

COMMIT_MSG=$(git log $COMMIT_ID -n1 --pretty=format:%s)
PR_NO=$(echo $COMMIT_MSG | egrep --only-matching '#\d+')

GIT_URL=$(git remote get-url origin)
REPO_PATH=${GIT_URL#git@github.com:}
REPO_SIGN=${REPO_PATH%.git}

open "https://github.com/$REPO_SIGN/pull/${PR_NO#\#}"

使い方

  1. 上記のシェルを git-open-pr とか名付けて
  2. chmod 744 git-open-pr(実行権限を付与)
  3. PATHが通っている場所においてください
    (私は自作シェル置き場($HOME/binなど)を作って、
    .bash_profile.zshrcexport PATH=PATH:$HOME/binと書いてあります)
  4. 該当のレポジトリでCommit IDを指定して実行
  $ git-open-pr xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

GitHubのプルリクページが一発で開きます

前提

  • 多分Macでしか動作しません
  • GitHubで「Create a Merge Commit」でマージされたプルリクでないと開けません
  • マージコミットのsubjectが Merge pull request #100 from branch_name の形式になっていることを利用しています

動作確認環境

% sw_vers -productVersion
10.15.6   # Catalina

% xcode-select --version
xcode-select version 2373.

% git --version
git version 2.28.0

きもち

vscode拡張とか作ってvscode上で完結したいな...

参考

https://ja.stackoverflow.com/questions/12852/特定のコミットに対して-それが対象のブランチへ-どのマージコミットでマージされたかを判定するには
https://git-scm.com/docs/pretty-formats

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

初めてのGitコマンド一覧【初心者向け】

エンジニア4ヶ月目のtomoakiです。
実務でよく使っているGitコマンドについて、備忘録も兼ねてまとめていきます。

現場に入りたてのエンジニアがよく使うコマンドを中心に記載しているので、過不足あると思いますがご容赦ください。m(_ _)m
適宜、追加していく予定です。

git init

gitプロジェクトを新規作成します。
作成したいディレクトリに移動してからgit initコマンドを叩いてください。

$ git init
Initialized empty Git repository in <ディレクトリ名>/.git/

git clone

指定したリポジトリ名のプロジェクトを、指定したディレクトリにコピーします。

$ git clone <リポジトリ名> <ディレクトリ名>

Cloning into '<ディレクトリ名>'...
remote: Enumerating objects: 190, done.
remote: Counting objects: 100% (190/190), done.
remote: Compressing objects: 100% (128/128), done.
remote: Total 190 (delta 53), reused 172 (delta 38), pack-reused 0
Receiving objects: 100% (190/190), 70.62 KiB | 420.00 KiB/s, done.
Resolving deltas: 100% (53/53), done.

git status

ワーキングツリー、ステージングエリアの状況を確認します。
変更したファイルや新規追加したファイルがステージングエリアにある場合は以下のように表示されます。

$ git status

On branch <ブランチ名>
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   <変更したファイル名>

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    <新規作成したファイル名>

ステージングエリアに追加したファイルがある場合は、以下のように表示されます。

$ git status

On branch <ブランチ名>
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   <ステージングエリアに追加したファイル名>

git add

ワーキングツリーで編集したファイルをステージングエリアにアップします。

# ファイル名を指定して追加する場合
$ git add <ファイル名>

# ステージングエリアの全てのファイルを追加する場合(.は全てのファイルを意味します)
$ git add .

# 編集したファイルの一部を追加する場合
$ git add -p

-pオプションをつけて実行すると、以下が表示されます。
表示された箇所を追加する場合は「y」、追加しない場合は「n」、さらに細かく指定する場合は「s」を入力します。

(1/1) Stage this hunk [y,n,q,a,d,s,e,?]?

-pオプションは、便利なので覚えておくと何かと役に立ちます。

git commit

ステージングエリアに上がっているファイルをローカルリポジトリにコミットします。
-mオプションで、コミットメッセージを追加できます。

$ git commit -m "<コミットメッセージ>"

[master aa1db46] <コミットメッセージ>
 8 files changed, 67 insertions(+), 21 deletions(-)
 create mode 100644 <コミットしたファイル名>

git commit --amend

コミットメッセージを修正したい場合は、git commit --amendコマンドが使えます。
開いたvimエディタで直接コミットメッセージを編集できます。

なお、git commit --amendで修正して良いのは、git pushする前のコミットのみです。
git push後だとコンフリクトが発生するので、注意してください。

$ git commit --amend

↓↓ vimエディタが開き、コミットメッセージを編集できる

<コミットメッセージ>

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Sat Sep 26 14:59:19 2020 +0900
#
# On branch master
# Changes to be committed:
#       modified:   <コミットしたファイル名>

git push

ローカルリポジトリにコミットしたファイルをリモートリポジトリにプッシュします。
git pushコマンドを実行する前に、git remote addコマンドでリモートリポジトリを登録しておいてください。

$ git push <リモートリポジトリ名> <リモートブランチ名>

Enumerating objects: 34, done.
Counting objects: 100% (34/34), done.
Delta compression using up to 8 threads
Compressing objects: 100% (17/17), done.
Writing objects: 100% (18/18), 2.56 KiB | 2.56 MiB/s, done.
Total 18 (delta 10), reused 0 (delta 0)
remote: Resolving deltas: 100% (10/10), completed with 9 local objects.
To <リポジトリ名>

続く…

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

Gitで間違えてコミットしたファイルをadd前の状態に戻したい!泣

タイトルの通りです。
先に結論を書いておきます。

git reset HEAD^

以上です。これで解決です。

ここからは、読まなくても問題ないです。
タイトルだけだとよくわからないという方は、お読みください。

(経緯)
あるブランチで作業していたら、いったん今の作業を退避させて、別の作業をしたいと思い、
意気揚々とgit commitし、
git stashしようとおもったのですが、

$ git stash
No local changes to save

あれ?
あーーー!!そうだ、なぜコミットしてしまったんだ、、、泣
(git stashはコミットしていない変更がある状態で上記のコマンドを実行すると、変更した部分が退避されます。)

やばいやばい、ここはgit revert HEADか?
いや、それだとこれまでに変更した作業が消えてしまう、、、、

このまま作業するしかないのか、というときに、やっぱりありました。
(まあそりゃありますよね)

対処前のコミット履歴
$ git log --pretty=oneline | awk '{print $1}'
376980ec2b9005f4a80862da7d0955bd850d9d57
f892d3ceb3632eb38f102ac9d0ed5b587f71a1e3

冒頭でも記載したgit reset HEAD^これで解決です。

対処後のコミット履歴
$ git log --pretty=oneline | awk '{print $1}'
f892d3ceb3632eb38f102ac9d0ed5b587f71a1e3
d34480810741248c1bf8f1d8278f590bc61bc37d

はい、一番上のコミットが消えてますね!
そして、変更したファイルもそのままです。add前の状態に戻っています。

同じような境遇にあわれた方の参考になれば嬉しいです。

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

fatal: remote origin already existsのエラーで怒られたとき

リモートリポジトリをローカルリポジトリに紐付けしようとしたら
以下のエラーが!!

$ git remote add origin git@github.com:com/ユーザー名/リポジトリ名.git
fatal: remote origin already exists.

https://www.sejuku.net/blog/71492
こちらのサイトで解決。

要は、既に紐付き先があるから浮気しないでくれって感じなのでそれに消えてもらって、再度登録をし直せばいいとのこと。

そこで念のためにどのリポジトリに紐付いてるかを確認するために

git remote -v

を入力。

origin  git@github.com:~(fetch)
origin  git@github.com:~(push)


すると今の紐付け先が出てくるので、削除するために

git remote rm origin

を入力。
そしてもう一度

git remote -v

を入力して削除されたかの確認。
削除されてたら何も出てきません。

そして、

git remote add origin git@github.com:ユーザ名/リポジトリ名.git

を入力して、新しいリポジトリの紐付け完了。

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

SourceTreeのインストール

要点

  • 無料利用可能
  • Mac、Windows に対応
  • インストールはexe形式のインストーラーを使う(Scoopは使わない)
  • 詳細オプションは、有効化しない

SourceTreeとは

バージョン管理システム(GitとMercurial)をGUI操作できる無料ツール。
MacとWindowsに対応している。

インストール手順(通常版)

1. インストーラーをダウンロードする

https://www.sourcetreeapp.com/
公式サイトからインストーラーをダウンロードする

2. インストーラーを起動する

2.1. Install

ダウンロードしたインストーラーを起動します。

2.2. Registration

Bitcuketのアカウント登録を行えますが、Bitcuketを使わないのであれば「スキップ」で問題ありません。
rapture_20200926010925.png

2.3. ツールをインストール

SourceTreeと同時にインストールしたいバージョン管理システム(GitやMercurial)を選択します。
すでにバージョン管理システムがインストールされている場合は、自動選択された状態で表示されます。
rapture_20200926010953.png

詳細オプション

「詳細オプション」の選択は行わない方が無難です。

改行の自動処理を設定する

取得したテキストの改行コードが全て LF から CRLF 自動変換されます。Windows上のDockerでLinuxを動作させる時など、CRLF が問題を起こす原因となります。

Configure Global Ignore

グローバル無視リストを作って exe、dll、obj のような通常はリポジトリにプッシュしないような拡張子のファイルを無視する設定。この設定はチャックしないで、意図的に拡張子を個別設定した方が無用な混乱を避けられます。

2.4. Preferences

アカウント名とメールアドレスを登録します。
rapture_20200926011140.png

インストール手順(Scoop版)

Scoopを使わずにexe形式のインストーラーでインストールする方が無難です。
SourceTree を Scoop でインストールすること自体は可能ですが、SourceTree から参照しているパスが固定なのでトラブルが発生するようです。

Scoopを使用したインストール手順

1. パッケージを検索する

SourceTreeのパッケージが extras バケットに存在することが確認できる。

PowerShell
PS C:\> scoop search sourcetree
Results from other known buckets...
(add them using 'scoop bucket add <name>')

'extras' bucket:
    bucket/sourcetree

2. パッケージを含むバケットを追加する

extras バケットをパッケージのダウンロード元として追加する。

PowerShell
PS D:\> scoop bucket add extras
Checking repo... ok
The extras bucket was added successfully.

3. パッケージをインストールする

SourceTreeパッケージをインストールする。

PowerShell
PS D:\> scoop install sourcetree
Updating Scoop...
Updating 'extras' bucket...
Installing 'sourcetree' (3.3.9) [64bit]
SourceTree-3.3.9-full.nupkg (23.3 MB) [========================================] 100%
Checking hash of SourceTree-3.3.9-full.nupkg ... ok.
Extracting SourceTree-3.3.9-full.nupkg ... done.
Linking ~\scoop\apps\sourcetree\current => ~\scoop\apps\sourcetree\3.3.9
Creating shim for 'sourcetree'.
Creating shortcut for Atlassian SourceTree (sourcetree.exe)
'sourcetree' (3.3.9) was installed successfully!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

バージョン管理システム

バージョン管理システムについて

大きく分けると2つのバージョン管理システムが存在する。
一つ目はSubVersionやCSVなどの集中型バージョン管理システム
二つ目はGitのような分散型のバージョン管理システム

以前では集中型バージョン管理システムが使われていましたが、
源氏ではGitへ移行されており、分散型バージョン管理システムが主流になっています。

バージョン管理システムに言えること

チーム開発において生産性の高いか開発環境を提供できる

  • 変更履歴が残る為、後でどのような作業を行なっていたか経緯を追うことが可能。
  • 同じファイルを複数人が同時に変更ができる。
  • タグによってリリースの成果物を管理できる。
  • 過去の任意のバージョンまで戻すこと(リバート)ができる

上記で簡単にバージョン管理システムについて説明してきましたが、
筆者は現在GitLabの学習をしていますので、これからはそちら
情報を投稿していこうと思います。

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

Ruby on RailsにてRails new〜デプロイまでの忘備録1

Ruby on RailsにてRails new〜デプロイまでの忘備録です!

何回かに分けて、Rails newコマンドでアプリケーション作成からデプロイまでの一連をつらつらと書いていきます。
1回目は、Railsアプリケーション雛形作成からリモートリポジトリへpushまで書いていきます。

足りない点や間違っている点があったら、教えていただけると嬉しいです。

※Ruby,Rails,GitはPCにインストール済みを想定します。
GitHubもリポジトリの作成等の説明は省きます。

環境

開発環境
言語:Ruby 2.5.1
FW:Ruby on Rails 5.2.4
DB:PostgreSQL
test:RSpec
バージョン管理:Git,GitHub

環境:MacBookAir
※VirtualBox,Docker等の仮想環境はRailsの基礎を重視するために導入しませんでした。
デプロイ先:heroku
AWSも環境と同じ理由で導入しませんでした。

Railsアプリ作成

Rails newコマンドを使ってアプリケーションのディレクトリを作成しましょう!

ターミナル.
rails new <App_name> -option

実際に私はDBにPostgreSQLを使用したかったので下記のようなコマンドを入力して、最初にアプリケーションに組み込みました。(後でも変更可能です)

ターミナル.
rails new App_name -d postgresql

そうするとRailsアプリケーションに必要なディレクトリがスルスル作られます。

作成後、今いるディレクトリから先ほど作成したディレクトリにcdコマンドで移動します。

ターミナル.
 cd App_name

さて、DBを作成しておきましょう!

ターミナル.
 rails db:create

これでDBが作成されます。

ターミナル.
 rails s

Railsのサーバーを立ち上げ
http://localhost:3000
にブラウザからアクセス!

正しくサーバーが立ち上がったのが確認できましたか?
ちなみに終了はcontrol + c で終了できます。

Git管理を始める

Gitを使い始めましょう!

ターミナル.
git init

これでGit管理する準備は整いました。
Git関連ディレクトリは、隠しディレクトリとして設定されているので、command + shift + . で可視化しておいてもいいかも知れません

作ったアプリケーションをステージングする
私は大体、ステージングの前にステータス(git status)や差分(git diff)の確認を行っていますが割愛します。(変更されたファイルの状態を確認すること)

ターミナル.
git add .

add .(ドット)で全ての変更されたファイルをステージングします。
この場合はRails newで作成された全ファイルですね!

ターミナル.
git commit -m "first commit"

上のコマンドで、変更を記録します!
commitの後ろの -m はオプションであり、コメントを残すためのオプションです!
commitする際は必ずコメントを残すことが決められているので、コメントはどういう変更したのかが理解できるように追加しましょう

次はリモートリポジトリへpush!

GitHubにリモートリポジトリを作成したら

ターミナル.
git push

と打つと怒られます。
要はリモートリポジトリの接続先が分からないので教えてあげます。
(怒られついでに下記のコマンドを入力するように求められます)

ターミナル.
git remote add <name> <url>

実際のコマンドっぽく書くと↓

ターミナル.
git remote origin https://github.com/×××

これでOK
あとは下記のコマンドでpushされる。

ターミナル.
git push -u origin master

初回だけは上記のコマンドを使用するが2回目以降はgit pushだけでOK!
ブランチを切ったりする場合も同じです。

今回はここまでとします。
あくまで、自分用の忘備録として書いていますが、
ご覧いただきありがとうございました!

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

Githubで'Untracked files'がどうにも消えない時の対応

状況

作業していたローカルブランチでの変更を無き物にしたい。

やったこと

  1. git checkout -- .→Untracked filesは消えません

次にやったこと

  1. git co masterでmasterブランチに切り替え。
  2. git branch -D branch名でブランチの削除→まだまだUntracked filesは消えません。

その次にやったこと

  1. git fetch originからの
  2. git merge origin/masterでリポジトリから取得しての上書き→まだまだUntracked filesは消えません。

そのまた次にやったこと

  1. git clean -dfn → git clean -dfしたときの未追跡の変更差分(Untracked files)がどうなるかの確認。
  2. git clean -df → ようやくUntracked filesは消えました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む