20201027のGitに関する記事は5件です。

【git】git stash の使い方を具体例を使ってわかりやすくしてみた

はじめに

Git Hubを使用するときに、次のようなことありませんか。

  • プルリクして他の人に確認をしてもらっている時にそのプルリクの内容を使用して開発を続けたい。

  • 作業するブランチを間違えて本来作業したいブランチにその作業した内容を反映させたい。

そんなときにstashというコマンドが便利のなので使用例と共に紹介していこうと思います。
git初心者のためもっと便利な方法がありましたら指摘してただけると幸いです。

前提として

  • git hub の基本的な使い方(comit,push,pullなど)が分かっていること

私の使用している環境

  • pc:macOS Catalina 10.15.7
  • 統合開発環境:atom version1.50.0

stashについて

stashとは・・・
一言で言うとコミットからの変更履歴をstash listに避難(保持)ができるコマンドです。

具体例を使用して説明していきます。

大まかな手順をまとめておきます。

  • 手順①Aブランチをつくってtest1.pyプルリクエスト
  • 手順②プルリクエスト後Aブランチのままtest1.pyに内容を追加
  • 手順③test1.pyに追加した内容をgit stash listに避難させる
  • 手順④git stash list でstashした内容の確認
  • 手順⑤新しいブランチを作成(Bブランチ作成)
  • 手順⑥リモートの内容をBブランチにpullする(Aブランチの状態によってpullしてくる箇所が異なる)
  • 手順⑦git stash listの内容を反映することができるコマンドを確認
  • 手順⑧git stash listの内容を反映する

手順①Aブランチをつくってtest1.pyプルリクエスト

masterブランチからAブランチを作成後、以下のファイルをコミットしてプルリクエストをした。

test1.py
# 最初のコミット
print("test1")

次にプルリクエストを待っている間にコミットしたファイルを使用したい。

手順②プルリクエスト後Aブランチのままtest1.pyに内容を追加

Aブランチのままtest1.pyに以下の内容を追加した。

test1.py
# 最初のコミット
print("test1")

# 内容の追加
print("test2")

保存をすると画像みたいにunstagedの箇所にtest1.pyの変更が反映される。

スクリーンショット 2020-10-15 21 53 31

次にこの追加した内容を違うブランチに反映したい。
同じブランチでそのままコミットすることも可能ですが、基本的に相手に確認してもらっている最中にコミットするのはあまり気持ちのいいものではないので避けたい。今回の例は追加のみでしたが実際は手順①でプルリクしている箇所の間違いに気づいて修正することも考えられます。(相手からすると途中までみてたのに勝手に内容変えられると最初から見ないといけないじゃないかクソが!となってしまします。笑)
 

手順③test1.pyに追加した内容をgit stash listに避難させる

変更内容を避難させる。
ターミナル(windowsの場合はコマンドプロンプト)にてgit stashコマンドを実行します。するとAブランチにあるtest1.pyファイルは以下のようになります。

ターミナル
git stash

<実行後>

test1.py
# 最初のコミット
print("test1")

手順①でコミットした時のファイルの内容に戻ります。言い方を変えると手順②で追加した内容をgit stash listに避難させています。unstagedの箇所にあったtest1.pyの変更もなくなります。(以下の画像のようになります。)

スクリーンショット 2020-10-15 22 08 48

手順④git stash list を確認するコマンドの確認

避難させたgit stash listを確認する。使用するコマンドは以下のとおりです。

git stash list

(内容)
git stash listを確認できます。
(使用例)

ターミナル
git stash list

<以下実行結果>
stash@{0}: WIP on branch_name: commit_id2 commit_comment2

上のstash@{0}に先ほど避難させた内容が入っています。この0はstash listの0番目だよってことを示しています。複数ある場合はこの数字によって使用したいstash listを指定します。実行しても何も起きない場合はgit stash list がないことを示します。
※git stash listにsatsh@{0}があるときにgit stash listコマンドを実行すると実行前のstash@{0}はstash@{1}となる。新たにstashされた内容がstash@{0}となる。{}の中の数字が小さいほど新しいstash listの内容である。

git stash show stash@{0} -p

(内容)
git stash list の退避内容が確認できます。stash@{0}の中の0はgit stash list が複数ある際にどのstash listを確認したいかを指定するものです。-pの部分は--patchでも代用可能です。

(使用例)

ターミナル
git stash show stash@{0} -p

<以下実行結果>
# 最初のコミット
print("test1")
+
+# 内容の追加
+print("test2")

git diff stash@{0}

(内容)git stash list のdiff(差分)を表示できます。言葉での説明はわかりにくいので使用例をみてください。

(使用例)

ターミナル
git diff stash@{0}

<以下実行結果>
# 最初のコミット
print("test1")
-
-# 内容の追加
-print("test2")

手順⑤新しいブランチを作成(Bブランチ作成)

反映をさせる前に新しいブランチを作ります。ここではmasterブランチからBブランチを作ります。

手順⑥リモートの内容をBブランチにpullする(Aブランチの状態によってpullしてくる箇所が異なる)

Bブランチ作成後に、リモートの内容をpullするのですが、Aブランチのプルリクがマージされているのか、されていないのかでpullしてくる箇所が変わってきます。

1.マージされている場合

git pull origin masterによりリモートのmasterブランチの内容をBブランチに反映させる。その時のtest1.pyの内容は以下のとおりである。

test1.py
# 最初のコミット
print("test1")

2.マージされていない場合
git pull origin Aによりプルリク中のAブランチの内容を反映させる。これでもtest1.pyのAブランチの内容をBブランチに反映させることができる。反映内容は上記と同様。

test1.py
# 最初のコミット
print("test1")

※注意

2の方法によりpullしてきた箇所を修正すると、AブランチのプルリクがマージされたあとBブランチのプルリクをマージしようとするとコンフリクトしてしまいます。コンフリクトしても都度解消すれば特に問題はありません。
pullしてきた箇所を修正せず追加のみだとコンフリクトはおきません。

(補足)Aブランチの内容をBブランチにpullしたいときにAブランチに複数のコミットがあり、その中の1つの内容を反映させたい場合があると思います。その時はgit cherry-pickという便利なコマンドがあります。cherry-pickについて知りたい方は以下のurlでわかりやすく説明されている方がおられますのでそちらを参考にしてください。

[git]他ブランチの作業を自分のブランチに持ってくる方法まとめ

手順⑦git stash listの内容を反映することができるコマンドを確認

反映ができるコマンドは主に2つあります。

○1つ目

git stash apply stash@{0}

こっちは反映した後にgit stash listはそのまま残ります。

○2つ目

git stash pop stash@{0}

こっちは反映した後にgit stash list を削除されます。

{}の中の数字は整数を入れてどのstash listの内容を反映するのかを指定します。
stash listを指定しない場合は、デフォルトでstash@{0}指定されます。

手順⑧git stash listの内容を反映する

手順⑦で確認したgit stash popコマンドにより避難させた内容を以下のとおり反映します。

ターミナル
git stash pop stash@{0}

実行後のtest1.pyファイル

test1.py
# 最初のコミット
print("test1")

# 内容の追加
print("test2")

これで手順①でプルリク後からの変更内容をBブランチに反映することができました。
このあとにgit stash listを実行してもstash@{0}はありません。git stash apply stash@{0}により実行した場合だとstash@{0}は残っています。

参照url

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

Tigを導入して今日から君もSourceTree離れしよう!!

この記事の対象者

普段からSourceTreeを使用している方

Tigとは

Gitの履歴や差分を可視化してくれる超絶便利な機能です。
https://github.com/jonas/tig

Homebrewを導入している場合は、brew intall tigでインストールすることができます。

SourceTreeから離れてTigを使おうと思ったきっかけ

  1. リポジトリの容量が重いとSourceTreeがフリーズする
  2. SourceTreeの起動速度が遅い
  3. SourceTreeが度々モサモサする
  4. 最初の初期設定云々がめんどくさい
  5. めんどくさい
  6. Dockerの中に入っているフォルダがSourceTreeで管理できないことがあった(設定でできる様です)
  7. VSCodeからそのままGIT操作がしたかった
  8. なんかカッコいい
  9. なんか黒い画面から操作してるとカッコいい
  10. スタバとかで黒い画面操作してるとカッコいい

そもそもSourceTreeでは大した操作はしていなかった

普段の操作例

  • コミット
  • プッシュ
  • フェッチ
  • プル
  • チェックアウト
  • マージ
  • リセット

ぐらいでした。

これをコマンドで入力すると

コミット
git commit or git commit -m "コミット内容"

プッシュ
git push (リモートと紐付けできていればこれでOK)

フェッチ
git fetch

プル
git pull

チェックアウト
git checkout <branch>

マージ
git merge <branch>

リセット
git reset --soft HEAD^

結構簡単ですね!!

具体的にTigを使用すると何ができるのか

コマンド入力例から見てみましょう!

tigを入力すると現在のブランチの履歴がターミナルから閲覧できます。
スクリーンショット 2020-10-27 22.32.43.png

キーボードの矢印もしくはJ,Kで上下することができEnterを押すと詳細な変更点を閲覧することができます。
スクリーンショット 2020-10-27 22.36.44.png

一枚目のスクショのときにcmd+suntracked, changed, commitedのファイルをそれぞれ閲覧することができ、commitedにしたい時はuでcommitedにすることができます。ファイルの上でEnterを押すと詳細な変更点を閲覧することができます。
スクリーンショット 2020-10-27 22.38.28.png

commitしたいファイルをcommitedに移動したらcmd+cでコミット画面を表示することができます。
スクリーンショット 2020-10-27 22.42.12.png

vimの操作でiで編集モードに入り、control+cで編集を終了します。
コミット内容に問題がなければ:wqでコミットを確定します。

その後はターミナルからgit pushでリモートにpushすることができます。

初めのうちはTigの操作というよりはVimの操作に手こずりますが、Vimを覚えておくとDockerの中のファイルを編集したりするときにスムーズに作業が完了するので覚えておいて損はないとおもいます。

ターミナルからGIT操作することに何を抵抗を感じるのか

私もそうだったのですが、なんとなく色付きでリッチに履歴を見たい!
GUI操作のほうが簡単!
周りの人はみんなSourceTreeを使っているから!!
なんかこわい。
コマンド操作が分からない。
なんか黒い画面がこわい。

というのが主な理由でした。

最後に

最初はSourceTreeから離れるのが不安だと思います。
その場合はSourceTreeとターミナルを併用して両方からGit操作することをオススメします。
徐々にターミナルを使用することで抵抗感なく移行することができるようになるとおもいます。

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

branchを指定してcloneする方法

背景

YouTubeで、Vuetifyのチュートリアルを学習しようと思った。動画投稿者が、githubにサンプルコードを載せてくれていた。それは、各lessonごとにbranchが切られていたので、ただgit cloneするだけだと、目的のファイルが入手できず、branchごとにcloneする必要があった。

これ→https://github.com/iamshaunjp/vuetify-playlist

方法

$ git clone -b ブランチ名 cloneのhttps

つまり

$ git clone -b git clone -b lesson-2 https://github.com/iamshaunjp/vuetify-playlist.git

です。

参考
https://www.sejuku.net/blog/71801

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

SVN のリポジトリを Git のリポジトリとして clone する

環境

CentOS 7.7

手順

  1. 必要なパッケージをインストールする

    $ sudo yum install -y git-svn

  2. SVN と Git のユーザ情報のマッピングファイルを作成する

    $ vi authors

    authors
    # format
    svn-user-name  = git-user-name <git-user-email>
    
  3. SVN リポジトリを Git のリポジトリとして clone する

    $ git svn clone --stdlayout --no-metadata --prefix=svn/ --localtime --authors-file=authors <svn-repository-url>

clone 時に使用するオプションについて

  • --stdlayout
    • SVN のリポジトリが trunk, branches, tags の構成になっている場合に使用する
  • --no-metadata
    • コミットログに SVN のメタ情報を残さない
  • --prefix=svn/
    • SVN のリポジトリから作成したブランチに、指定したプレフィックスをつける(ex. remotes/svn/trunk
  • --localtime
    • コミットログの Date 情報をローカルのタイムゾーンに合わせる(デフォルトはUTC)
  • --authors-file=authors
    • コミットログの Author 情報を指定したファイルで置換

今回は Git のローカルリポジトリを作成するところまで検証した。
あとは git remote add でリモートリポジトリを追加してプッシュしてやれば良さそう。

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

gitのssh認証

はじめに

gitのssh認証する.

参考文献

環境

  • wls2
  • Ubuntu 20.04 LTS

やっていく

ディレクトリ作成

~/.sshディレクトリを作成し中に入る.

鍵作成

以下を入力.
※※GitHubに登録しているEmailアドレスを使う.

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

SSH Keyの保存場所を聞かれるので,名前を変え保存.

Enter file in which to save the key (/home/[UserName]/.ssh/id_rsa): /home/[UserName]/.ssh/id_rsa_github

パスフレーズを入力.

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type a passphrase]

鍵作成完了

Your identification has been saved in id_rsa_github.
Your public key has been saved in id_rsa_github.pub.

GitHubアカウントにSSH Keyの登録

  1. ~/.ssh/id_rsa_github.pubの内容をクリップボードにコピー
  2. GitHubにログインし、右上のプロフィールをクリック -> Settingsにて設定画面に遷移
  3. 左のメニューからSSH keysをクリック
  4. Add SSH Keyをクリック
  5. Titleに識別できる文字列を入力
  6. Bodyに先ほどクリップボードに入れた値をペースト
  7. Add Keyをクリック

config設定

.ssh内にconfigファイルを作成

vim ~/.ssh/config

権限を修正

chmod 600 ~/.ssh/config

下記を追記

Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_github
  User git

秘密鍵をssh-agentに登録する

まずはssh-agentが動作しているかを確認.

$ eval "$(ssh-agent -s)"

秘密鍵を登録

$ ssh-add ~/.ssh/id_rsa_github
Enter passphrase for /Users/ts/.ssh/id_rsa_github: [Type a passphrase]
Identity added: /home/[UserName]/.ssh/id_rsa_github (/home/[UserName]/.ssh/id_rsa_github)

接続確認

proxyに通していると,認証できないのでテザリングに切り替える.
以下を入力

ssh -T git@github.com

接続するか聞かれるので、GitHubのSSH Keyに記述されているものと一致するのを確認してからyesを入力

Are you sure you want to continue connecting (yes/no)?

次のように出れば認証ok

Hi username! You've successfully authenticated, but GitHub does not provide shell access.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む