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

Windowsのパスワードを変更した時にgitの認証が通らなくなった

Windowsのパスワードを変更して、gitの認証が通らなくなって困りました。

$ git pull
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/ko-flavor/atcoder-java.git/'

コントロールパネル > ユーザー アカウント > 資格情報マネージャー
編集したい資格情報の右側の↓をクリック。

image.png

編集から、パスワードを入力して、保存。

これで解決しました!

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

ざっくりgitコマンド

タイトル通りで自分用のメモ書きなのでいずれ追記したり、体系的にまとめていきたいと思います。

ブランチを削除する

$ git branch -d ブランチ名

ブランチを強制削除

$ git branch -D ブランチ名

リベース

git rebase ブランチ名

リモートで削除されているブランチをローカルでも削除する

$ git fetch --prune

対象のローカルブランチをリモートブランチに強制プッシュ

$ git push -f origin ローカルブランチ:リモートブランチ

working directory内の変更を破棄(元に戻す)

$ git checkout -- ファイル名

ブランチ一覧にコミットメッセージなどの詳細を加えて表示

$ git branch -v
$ git branch -vv

※ -vv オプションの方がリモートブランチ情報などより詳細な情報になる

コミットしていない内容を一時退避(変更内容をコミットしないとブランチ変更できないのでそういう時に使う)

$ git stash

一時退避した内容(stash)を戻す

$ git stash pop stash@{0}

stash@{0}は適宜変更

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

[git] 複数のリモートリポジトリを扱う&サブモジュール&複数のリモートリポジトリのサブモジュール

複数のリモートリポジトリを扱うための説明です.
さらにサブモジュールの扱い方も説明し,サブモジュールのリモートリポジトリを複数にする方法までまとめます.

GitHub+GitLabなどにしてサーバーダウンに備えましょう!

複数のリモートリポジトリを登録,同時にpushする

GitHub+GitLabとか,サーバーダウン対策にもなると思います.次のコマンドを1回だけ操作すると.git/configが追加されます.

git remote set-url origin --add (2つめのリモートリポジトリのurl)

fetchしてくるリポジトリ

上記の方法でやると,.git/config

[remote "origin"]
    url = git@(1つめのリモートリポジトリのurl):username/hoge.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@(2つめのリモートリポジトリのurl):username/hoge.git

のようになるが,この順番に注意.

$ git remote -v
origin  git@(1つめのリモートリポジトリのurl):username/hoge.git (fetch)
origin  git@(1つめのリモートリポジトリのurl):username/hoge.git (push)
origin  git@(2つめのリモートリポジトリのurl):username/hoge.git (push)

1つめの方をfetchしてくるようになっている.remote-tracking branchの設定に起因?

リポジトリ内に別のリポジトリ

リポジトリ内で別のリポジトリを管理したいとき.特定のcommitを参照できます.

  • リポジトリにサブモジュールを追加する
git submodule add (リモートリポジトリのurl) (必要ならディレクトリ名)

.gitmodules にそのサブモジュールの情報が入ります.

別のローカルリポジトリで,追加済みのサブモジュールを追加する

git submodule update -i
  • リポジトリ内のサブモジュールを全てmergeする 大元のリポジトリでgit pullするとサブモジュールのリポジトリもfetchのみされるので,それを全て一括mergeしたい場合
git submodule foreach git merge

- サブモジュールを最新のブランチにする(全てgit pullする)

git submodule foreach git pull origin master

(参考)
-- https://qiita.com/sotarok/items/0d525e568a6088f6f6bb
-- https://qiita.com/kinpira/items/3309eb2e5a9a422199e9

submoduleで複数のリモートリポジトリ

同様にsubmoduleのリポジトリ内で

git remote set-url origin --add (2つめのリモートリポジトリのurl)

してやればよい.(大元のリポジトリの).git/modules/hoge/config.git/configと同様の情報がある.

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

gitでたまに使うコマンド

概要

git関連でたまに使うコマンドリンクをまとめて見られるようにメモ

ブランチ一括削除

https://qiita.com/satoshi03/items/c53aab17f3270477e33a

//while
git branch | grep <文字列> |  while read branch ; do git branch -d ${branch} ; done ;  
//xarges
git branch | grep <文字列> | xargs git branch -d

特定コミット抽出して反映(cherry-pick)

https://qiita.com/ta__ho/items/8204a22a53b02ee0817e
https://img.atwikiimg.com/www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/git-cherry-pick.html

//-nを付けるとstageの状態で止まる
git cherry-pick -n <コミットID>
//マージコミットを抽出したい場合
git cherry-pick -n -m 1 <コミットID>

別リモートリポジトリを同じremote内に追加

https://qiita.com/chihiro/items/d018599ef13c35781412

・別リモートリポジトリを追加した時点でcherry-pickで別リポジトリから抽出は可能
・チェックアウトした別リモートリポジトリのブランチをマージすることも可能

//同じ場所にリモートリポジトリを追加。ローカル名は何でもいい。origin_testとか。
git remote add <ローカル名> <url>
git fetch <ローカル名>

//追加したリモートリポジトリからブランチチェックアウト   
git checkout -b <任意のブランチ名> <ローカル名>/<抽出したいブランチ>

submodule削除・再追加

http://takaaki-kasai-tech.blogspot.com/2014/02/how-to-remove-git-submodule-using-each-version.html
https://qiita.com/kinpira/items/3309eb2e5a9a422199e9

※git バージョンが1.8.5以上の場合。

$ git submodule deinit path/to/submodule
$ git rm path/to/submodule
$ rm -rf path/to/submodule
$ git submodule add 【リポジトリURL】 【追加したいディレクトリ】
//具体例
$ git submodule deinit -f aaa/bbb
$ git rm aaa/bbb
$ git submodule add https://git.git aaa/bbb

※git バージョンが1.8.3未満は以下を個別に削除する必要がある。

//削除するサブモジュールの場所。
.git/config
.gitmodules
//git rm でサブモジュールパス削除
.git/modules/aaa/bbb
//rm -rf で直接サブモジュールパス削除

コンフリクト一方修正

https://qiita.com/nantekkotai/items/2ed17c3d774211d234a4

//現在ブランチの修正に変更
$ git checkout --ours AAAA.txt
//マージする側ブランチの修正に変更
$ git checkout --theirs fileB.txt

//実行後はaddする
$ git add <ファイル名>

コミット打ち消し・修正・取消

https://qiita.com/kansiho/items/2bacecdb95d752cb38b7
https://qiita.com/ritukiii/items/74ee3274c3f218511a0c
https://qiita.com/chihiro/items/2fa827d0eac98109e7ee

・reset
・amend
・revert
・【危険】push -f

//ローカル上で修正残して直前コミット取消
git reset --soft HEAD^
//ローカル上で修正含めて直前コミット取消
git reset --hard HEAD^

//ローカル上でコミット直後に再度直前コミットのソース修正・コメント修正等をして、同じコミットにしたい場合
git commit --amend

//取り消した内容を残してコミットする
git revert <commit>

//戻したい位置までコミット戻してリモート強制更新
git reset --hard <commit_id>
git push origin HEAD --force

差分抽出

//[1]取得ソースの branch名/hashtag/tag名
//[2]ベースのbranch名/hashtag/tag名
//[3]変更あるbranch名/hashtag/tag名
git archive [1] `git diff --name-only [2] [3] --diff-filter=ACMR` -o [zipファイル名].zip

stage から Unmerged paths,Untracked filesに戻す・削除

https://qiita.com/rch1223/items/9377446c3d010d91399b
 ※戻す方法は上記にいろいろ載ってる
https://qiita.com/k0uh0t/items/ae885bf2d5e05614b80f

//stage から Unmerged paths
git reset <ファイル名>
git reset .

//変更前に戻す
git reset HEAD <ファイル名>

//gitから削除
git rm -rf フルパス

//Untracked filesのディレクトリ含めた削除
git clean -fd

コンフィグ関連

・文字コード設定とか
https://nekonenene.hatenablog.com/entry/2015/04/18/210706
・git logが見やすくなる
https://blog.toshimaru.net/git-log-graph/
・git for windows改行関連
https://qiita.com/uggds/items/00a1974ec4f115616580

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

【Git】Gitよく使うコマンド個人メモ

ディレクトリ毎回打ち込むのめんどくさ

ターミナルで上矢印キー押したらシャットダウンしても前回のコマンド辿れる

リポジトリ作成からPushまで

cd <任意のディレクトリ>
git init
git remote add origin <リモートのURL>
git add .
git commit -m "Commit Message"
git push -u origin master

今どんな状態か確認

git status

ブランチ作成してリモートに登録

git checkout -b <任意のブランチ名>
git push -u origin <任意のブランチ名>

ブランチ削除

git branch -D <任意のブランチ名> //ローカル削除
git push --delete origin <任意のブランチ名> //リモート削除
git fetch -p //GUI上で削除したリモートをローカルに反映

コミットのコメント修正

git commit --amend -m "新しいコメント"

ローカルでごちゃごちゃいじったものを元に戻す

git checkout .

過去のごちゃごちゃした履歴を見る

git reflog //qで閉じる

過去のコミットの履歴を見る

git log --oneline

過去のコミットの状態まで戻る

git reset --hard <commit ID> //hardだとそのコミット自体も消える

特定のブランチを指定してクローン

git clone -b ブランチ名 リポジトリのアドレス
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitに慣れていない人がよくハマるパターンと対処法まとめ

はじめに

Gitって難しいですよね。本当に!

プログラミング歴1年弱の自分がチーム開発に加わる様になってに一番不安なのはGitの扱いです。
ミスにビクビクしながら、日々を過ごしています。

そんな僕が初学者達が現場でうま〜く立ち回れる様に、Gitに慣れていない人がよくハマるパターンと対処法をまとめました。参考になれば幸いです。

作業ブランチ間違えて作業しちゃった!!パターン

これは僕が一番やっちゃうやつです!
作業している途中や、git statusしている辺りでブランチを間違えていた事に気がつきます!

対処法

1 git stash -u  
 一旦、作業していた分を退避する

2 git checkout 正しいブランチ名
 正しいブランチに切り替える

3 git stash pop 
 退避していた分を正しいブランチの方に持ってくる

作業中に他の作業が差し込みで入った時なども、git stashで一旦退避させる事でブランチの切り替えが可能になります!

commitメッセージを記入し忘れたー!パターン

これはgit commitした後、ボーッとしててcommitメッセージを書き忘れたり、commitメッセージを書き間違えた時ですね。

対処法

これは簡単です!

git commit --amend -m 修正後のcommitメッセージ

git add .でいらんファイルまでステージングしちゃったー!パターン

本当はgit add .ではなく、git statusgit add ファイル名で1ファイルずつステージングしていくべきなのですが、自分は一度にcommitするファイルが多い為、git add .を好んで使います。

そうすると、なぜかステージング済にpackage.json君などの変更しちゃいけない子が行ってしまう時があります。そんな時の対処法はこちらです。

対処法

# ファイル名を指定して戻したい時
git reset ファイル名

#git addした全てのファイルを戻したい時
git reset .

いらない追跡対象外のファイルがなぜかたくさんあって、このままだとcommitできねえー!!パターン

多分、pathの設定ミスによって起きるんだと思いますが、、
追跡対象外のファイルが大量に変更済エリアに雪崩れ込んでくることがあります。

そんな時の一時的な対処法です。

対処法

# カレントディレクトリ内の追跡対象外のファイルを確認する
git clean -n
# カレントディレクトリ内の追跡対象外のファイルを削除
git clean -f

これで邪魔なファイル達は消えてくれるので、commitが進められます。

プルリクを送る先を間違えたーー!パターン

これは正確にはGitじゃなくて、Githubでのミスなのですがご愛嬌。
Githubからプルリクエストを送る時にdevelopに送りたいのに間違えてmasterに送っちゃったー!レビュアーの人に見られる!!的な場合の対処法ですね。

対処法

1 Githubで対象のプルリク のページに行きます。
2 下記の画像の右上のEditの所をクリックして完了です!
スクリーンショット 2020-03-05 0.35.52.png
3 下記の画像の様に、送り先のブランチを切り替えて、右上のSaveを押します。
スクリーンショット 2020-03-05 0.38.29.png

プルリクエストのLGTMぐらいカッコ良く出してええ!!パターン

これまた正確にはGitではありませんが、プルリクのレビュアーをする際にただテキストでOKやLGTMを出すだけでは味気ないですよね。
あまり開発で貢献できない分、コミュニケーションでチームを盛り上げて行きたい!そんな時の対処法はこちらです。

対処法

LGTMの画像を作って送りましょう。
https://lgtm.fun/

プルリクを出した人が乃木坂のファンならこちらを送り
image.png
最近鬼滅の刃を見た様ならこちらを送りましょう!
image.png

まとめ

とはいえ、今回書いたハマるパターンといってもうっかりミスがほとんどです!普段から確認を怠らない姿勢でGitを扱う事が一番の対処法だと思います。

補足(2020/3/7追記)

コメントにありましたが、常にシェルのpropmtにブランチやステータスを表示できるみたいです。

うっかりミスが多い人は参考にして下さい。
http://tm.root-n.com/unix:command:git:bash_prompt

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

【GitHub】開発中ブランチを安全に退避させてプルリクを作成するまでのタイムアタック【Pull Request】

素早くプルリクを出そう

エンジニアたるもの、自分が書いたコードがマージされて初めて仕事です。
マージされる前には、 プルリクエスト(プルリク)を出す必要があります。

最近、プルリクを結構な頻度で投げられるようになったので、ちょっと数えてみました。
大体、一ヶ月で75プルリク、1営業日あたり3.75個のプルリクを出していました。

この背景にあるのは、プルリクを早く作るためのコツを習得したことにあると考えています。

というのも、プルリクは差分を作る作業以外に、変更点を確認したり、プッシュしてからブラウザを開いてプルリクを作成したり、意外に雑用が多いです。
この面倒な作業をいかに早くできるようになるかのタイムアタックです。

この記事では、素早くプルリクを出すコツを習得したような気になっている私が、私のやり方をかなり正直に伝えます

ただし、差分の中身や、レビューにかかる時間は計算に入れていません。プルリクにまつわるコード修正以外の作業の時間を最小化することを目指しています。

よっしゃ!修正箇所発見!

あなたは my-branch で絶賛開発中だとします。

origin/master で修正が必要な箇所が見つかりました。
あなたがその修正をすることになりました。

しかし、開発中ブランチをどうしましょう。。

一旦開発ブランチの変更を退避して、ブランチを変える必要があります。
修正後、 my-branch に戻ってくる未来を信じましょう。

git status 開発中ブランチの変更ファイルを確認する

プルリクだけでなく、gitを扱うものとして、 git status は一番使うコマンドと言っても間違いではありません。
実際、私が一回のプルリクで git status は10~20回は軽く打つと思います。

HEAD コミット、ここでは my-branch のコミットから変更されたファイル一覧が出力されます。

$ git status -sb

この -sb オプションは、ブランチを表示した上でシンプルな表記にしてくれるため、 git status -sb をエイリアスにすると良いです。

git stash 開発中ファイルを退避

git stash で差分のあるファイルを一時保存します。

$ git stash

新しく追加したファイルはトラッキングされてないので git add してから git stash しておきましょう。

git switch masterブランチに移動

続いて、プルリクを出すターゲットとなるブランチに移動します。ここでは、 master です。

$ git switch master

git pull masterブランチを最新版にアップデート

この master ブランチは最新版とは限りません。移動した瞬間、次のコマンドで最新版にします。
普通の使い方をしていれば、Fast-forwadでシンプルにコミットがくっついてきます。

$ git pull

git switch -c masterから新しくブランチを生やす

最新版のmasterブランチから、プルリクのための修正ブランチを生やします。
git checkout -b でやっているのはちょっとナウくないですね。

$ git switch -c pr1-fix-handler-error

git switchとrestoreの役割と機能について などを参考にしてください。

プルリクを出す

さて、ここまでで およそ30秒くらい を目指しましょう。
続いては、実際にファイルを修正します。

ただし、今回は修正の中身自体には興味がないのでスキップします。

修正が終わったあと、コミット・プッシュし、プルリクを作るところまでやってみます。

git diff で修正内容の差分を見る

修正した内容が本当に正しいかは、差分を見て確認しましょう。
問題なければ、修正作業は終了です。

$ git diff origin/master

git add ステージング領域に上げる

git status で変更されたファイル一覧を見ながら、コミットするファイルをステージングに上げていきます。

$ git add handler.go

git status で変更されたファイルが限られている場合、時間短縮のために以下のコマンドを使ってもよいです。

$ git add .

よくおかしなファイルがコミットされるから一個ずつ上げることを推奨することがあります。
しかし、私の持論として、問題は git add ではなく、その手前の段階の git status での確認不足にあると考えられます。

git commit コミットメッセージは、プルリクのdescriptionを書く

さて、ついにコミットです。 git commit -m "commit-message" は便利ですが、ここでは単純に以下のコマンドを使います。

$ git commit

このコマンドを打つと、エディタが起動します。そして、次のような入力画面が現れます。

  • 一行目 プルリクのタイトル
  • 二行目は空行
  • 三行目以降 プルリクのdescription

を書いていきます。
重要なことは、ここで 人に見せる意識でメッセージを残す ことです。

  1 ↲
  2 ; Please enter the commit message for your changes. Lines starting↲
  3 ; with ';' will be ignored, and an empty message aborts the commit.↲
  4 ;↲
  5 ; On branch master↲
  6 ; Your branch is up to date with 'origin/master'.↲
  7 ;↲
  8 ; Changes to be committed:↲
  9 ;»------new file:   handler.go↲
 10 ;↲↲

コミットしたあとに、コミットメッセージを修正したいときや、別ファイルもコミットに加えたいときは --amend で一個前のコミットを上書きできます。

$ git commit --amend

git rebase 最新版のmasterにコミットをつなぎ直す

さて、あなたは素早く修正したつもりでしたが、思いの外masterブランチの開発速度が早く、コミットが進んでしまっていたようです。
場合によっては、プッシュするとコンフリクトしてしまうかもしれません。

こんなときは、まず git fetchorigin/master をアップデートしたあと、 git rebase でコミットを最新版の origin/master につけ直します。

$ git fetch
$ git rebase origin/master

git push リモートリポジトリにブランチを作る

最新版の origin/master から一つだけコミットが伸びたブランチが出来上がりました。
これをリモートリポジトリにプッシュします。

$ git push

hub pull-request プルリクを出す

無事にブランチはプッシュできました。ここでGitHubを開くようではタイムアタックで勝ち上がることはできません。

hub コマンドで、まずプルリクを作ります。
以下のコマンドを実行すると、コミットメッセージが並んだ入力画面が開きます。

あなたがさきほど頑張って書いておいたコミットメッセージはそのままプルリクのタイトルと説明文にすることができます。
入力画面を閉じると、プルリクが実際に作られます。

$ hub pull-request -a zawawahoge
$ hub pull-request -a zawawahoge
https://github.com/your-organization/your-repo/pull/123

プルリクのURLが出力されました。

上記のコマンドでレビュアーも指定できるのですが、私はまずGUIで確認してからGitHub上で指定するようにしています。
GitHubの差分は見やすいので、自分自身のミスも発見しやすくなります。

大丈夫そうだと思ったら、思い切ってレビュアーを設定しましょう!

プルリクの修正

親切なチームメンバーの方々が、コメントを残してくれました。
少なからず変更点がありました。面倒臭がらず直していきます。

git merge 最新版のmasterをマージする

修正の前に、最新版の origin/master をマージしておきましょう。

$ git merge origin/master
$ git add .
$ git commit -m "simple message"
$ git push

rebase コミット履歴をきれいにする

修正の結果、 fixtrivial change みたいなコミットがたくさんついてしまうことありますよね。
こういうときは、思い切って git rebase して origin/master からのコミットをすべて書き換えることもあります。
一個だけコミットを修正したいときは git commit --amend も有効です。

$ git rebase origin/master -i
$ git push -f

または

$ git commit --amend
$ git push -f

rebase した場合は、 git push -f でforce pushしないとプッシュできません。なぜなら、コミット履歴がごっそり書き換わっているからです。
用法と用量を守ってforce pushしましょう。

GitHub上でのレビュー後の修正コミットもわからなくなるので、マージする直前なんかにやるといいです。

re-reviewしてもらったあと、ついに approve いただきましたー!

プルリクのマージ

マージは気持ちが良いものです。
approveされたら、堂々とマージしましょう。
バグが起きたら、リバートするなり、再度修正プルリクを出しましょう。

squash mergeでプルリクを一つのコミットに潰す

GitHubでリポジトリの設定を変えると、プルリクのコミット履歴を一つにまとめてマージしてくれるsquash mergeがあります。
チームと相談して、merge commitがいるかどうか議論してからsquash mergeの導入を検討すると良いです。

前の開発ブランチに戻る

git stash pop で元のブランチでの開発環境を復活させる

もう忘れかけていた最初のブランチ・・・。
名前も忘れちゃったけど、ちょっと思い出してみると my-branch でした。

$ git switch first-branch
$ git stash pop

ようやく、元の開発環境に完全に戻ることができました。

まとめ

長くなりましたが、いかがでしたでしょうか?
最近もくもくと一人でタイムアタックしているのですが、誰にも認識されずやっててつまらない気がしたので、いっそ外部公開しようと思って記事にしてみました。

参考になれば幸いです。

面白かったと思ってもらえたらいいねしてもらえると嬉しいです!

Twitter(zawawahoge)もやってますので、フォローしてくれると泣いて喜びます。

(おまけ) エイリアス大公開

5個くらいしか登録してないですが、あると便利なエイリアス紹介しておきます。
完全に自己流なのでご注意。

alias gf='git fetch'
alias gs='git status -sb'
alias gd='git diff'
alias gw='git switch'
alias gp='git pull'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【GitHub】開発中ブランチを安全に退避させてプルリクを作成するまでに使うGitコマンド紹介【Pull Request】

素早くプルリクを出そう

エンジニアたるもの、自分が書いたコードがマージされて初めて仕事です。
マージされる前には、 プルリクエスト(プルリク)を出す必要があります。

最近、プルリクを結構な頻度で投げられるようになったので、ちょっと数えてみました。
大体、一ヶ月で75プルリク、1営業日あたり3.75個のプルリクを出していました。

この背景にあるのは、プルリクを早く作るためのコツを習得したことにあると考えています。

というのも、プルリクは差分を作る作業以外に、変更点を確認したり、プッシュしてからブラウザを開いてプルリクを作成したり、意外に雑用が多いです。
この面倒な作業をいかに早くできるようになるかのタイムアタックです。

この記事では、素早くプルリクを出すコツを習得したような気になっている私が、私のやり方をかなり正直に伝えます

ただし、差分の中身や、レビューにかかる時間は計算に入れていません。プルリクにまつわるコード修正以外の作業の時間を最小化することを目指しています。

よっしゃ!修正箇所発見!

あなたは my-branch で絶賛開発中だとします。

origin/master で修正が必要な箇所が見つかりました。
あなたがその修正をすることになりました。

しかし、開発中ブランチをどうしましょう。。

一旦開発ブランチの変更を退避して、ブランチを変える必要があります。
修正後、 my-branch に戻ってくる未来を信じましょう。

git status 開発中ブランチの変更ファイルを確認する

プルリクだけでなく、gitを扱うものとして、 git status は一番使うコマンドと言っても間違いではありません。
実際、私が一回のプルリクで git status は10~20回は軽く打つと思います。

HEAD コミット、ここでは my-branch のコミットから変更されたファイル一覧が出力されます。

$ git status -sb

この -sb オプションは、ブランチを表示した上でシンプルな表記にしてくれるため、 git status -sb をエイリアスにすると良いです。

git stash 開発中ファイルを退避

git stash で差分のあるファイルを一時保存します。

$ git stash

新しく追加したファイルはトラッキングされてないので git add してから git stash しておきましょう。

git switch masterブランチに移動

続いて、プルリクを出すターゲットとなるブランチに移動します。ここでは、 master です。

$ git switch master

git pull masterブランチを最新版にアップデート

この master ブランチは最新版とは限りません。移動した瞬間、次のコマンドで最新版にします。
普通の使い方をしていれば、Fast-forwadでシンプルにコミットがくっついてきます。

$ git pull

git switch -c masterから新しくブランチを生やす

最新版のmasterブランチから、プルリクのための修正ブランチを生やします。
git checkout -b でやっているのはちょっとナウくないですね。

$ git switch -c pr1-fix-handler-error

git switchとrestoreの役割と機能について などを参考にしてください。

プルリクを出す

さて、ここまでで およそ30秒くらい を目指しましょう。
続いては、実際にファイルを修正します。

ただし、今回は修正の中身自体には興味がないのでスキップします。

修正が終わったあと、コミット・プッシュし、プルリクを作るところまでやってみます。

git diff で修正内容の差分を見る

修正した内容が本当に正しいかは、差分を見て確認しましょう。
問題なければ、修正作業は終了です。

$ git diff origin/master

git add ステージング領域に上げる

git status で変更されたファイル一覧を見ながら、コミットするファイルをステージングに上げていきます。

$ git add handler.go

git status で変更されたファイルが限られている場合、時間短縮のために以下のコマンドを使ってもよいです。

$ git add .

よくおかしなファイルがコミットされるから一個ずつ上げることを推奨することがあります。
しかし、私の持論として、問題は git add ではなく、その手前の段階の git status での確認不足にあると考えられます。

git commit コミットメッセージは、プルリクのdescriptionを書く

さて、ついにコミットです。 git commit -m "commit-message" は便利ですが、ここでは単純に以下のコマンドを使います。

$ git commit

このコマンドを打つと、エディタが起動します。そして、次のような入力画面が現れます。

  • 一行目 プルリクのタイトル
  • 二行目は空行
  • 三行目以降 プルリクのdescription

を書いていきます。
重要なことは、ここで 人に見せる意識でメッセージを残す ことです。

  1 ↲
  2 ; Please enter the commit message for your changes. Lines starting↲
  3 ; with ';' will be ignored, and an empty message aborts the commit.↲
  4 ;↲
  5 ; On branch master↲
  6 ; Your branch is up to date with 'origin/master'.↲
  7 ;↲
  8 ; Changes to be committed:↲
  9 ;»------new file:   handler.go↲
 10 ;↲↲

コミットしたあとに、コミットメッセージを修正したいときや、別ファイルもコミットに加えたいときは --amend で一個前のコミットを上書きできます。

$ git commit --amend

git rebase 最新版のmasterにコミットをつなぎ直す

さて、あなたは素早く修正したつもりでしたが、思いの外masterブランチの開発速度が早く、コミットが進んでしまっていたようです。
場合によっては、プッシュするとコンフリクトしてしまうかもしれません。

こんなときは、まず git fetchorigin/master をアップデートしたあと、 git rebase でコミットを最新版の origin/master につけ直します。

$ git fetch
$ git rebase origin/master

git push リモートリポジトリにブランチを作る

最新版の origin/master から一つだけコミットが伸びたブランチが出来上がりました。
これをリモートリポジトリにプッシュします。

$ git push

hub pull-request プルリクを出す

無事にブランチはプッシュできました。ここでGitHubを開くようではタイムアタックで勝ち上がることはできません。

hub コマンドで、まずプルリクを作ります。
以下のコマンドを実行すると、コミットメッセージが並んだ入力画面が開きます。

あなたがさきほど頑張って書いておいたコミットメッセージはそのままプルリクのタイトルと説明文にすることができます。
入力画面を閉じると、プルリクが実際に作られます。

$ hub pull-request -a zawawahoge
$ hub pull-request -a zawawahoge
https://github.com/your-organization/your-repo/pull/123

プルリクのURLが出力されました。

上記のコマンドでレビュアーも指定できるのですが、私はまずGUIで確認してからGitHub上で指定するようにしています。
GitHubの差分は見やすいので、自分自身のミスも発見しやすくなります。

大丈夫そうだと思ったら、思い切ってレビュアーを設定しましょう!

プルリクの修正

親切なチームメンバーの方々が、コメントを残してくれました。
少なからず変更点がありました。面倒臭がらず直していきます。

git merge 最新版のmasterをマージする

修正の前に、最新版の origin/master をマージしておきましょう。

$ git merge origin/master
$ git add .
$ git commit -m "simple message"
$ git push

rebase コミット履歴をきれいにする

修正の結果、 fixtrivial change みたいなコミットがたくさんついてしまうことありますよね。
こういうときは、思い切って git rebase して origin/master からのコミットをすべて書き換えることもあります。
一個だけコミットを修正したいときは git commit --amend も有効です。

$ git rebase origin/master -i
$ git push -f

または

$ git commit --amend
$ git push -f

rebase した場合は、 git push -f でforce pushしないとプッシュできません。なぜなら、コミット履歴がごっそり書き換わっているからです。
用法と用量を守ってforce pushしましょう。

GitHub上でのレビュー後の修正コミットもわからなくなるので、マージする直前なんかにやるといいです。

re-reviewしてもらったあと、ついに approve いただきましたー!

プルリクのマージ

マージは気持ちが良いものです。
approveされたら、堂々とマージしましょう。
バグが起きたら、リバートするなり、再度修正プルリクを出しましょう。

squash mergeでプルリクを一つのコミットに潰す

GitHubでリポジトリの設定を変えると、プルリクのコミット履歴を一つにまとめてマージしてくれるsquash mergeがあります。
チームと相談して、merge commitがいるかどうか議論してからsquash mergeの導入を検討すると良いです。

前の開発ブランチに戻る

git stash pop で元のブランチでの開発環境を復活させる

もう忘れかけていた最初のブランチ・・・。
名前も忘れちゃったけど、ちょっと思い出してみると my-branch でした。

$ git switch first-branch
$ git stash pop

ようやく、元の開発環境に完全に戻ることができました。

まとめ

長くなりましたが、いかがでしたでしょうか?
最近もくもくと一人でタイムアタックしているのですが、誰にも認識されずやっててつまらない気がしたので、いっそ外部公開しようと思って記事にしてみました。

参考になれば幸いです。

面白かったと思ってもらえたらいいねしてもらえると嬉しいです!

Twitter(zawawahoge)もやってますので、フォローしてくれると泣いて喜びます。

(おまけ) エイリアス大公開

5個くらいしか登録してないですが、あると便利なエイリアス紹介しておきます。
完全に自己流なのでご注意。

alias gf='git fetch'
alias gs='git status -sb'
alias gd='git diff'
alias gw='git switch'
alias gp='git pull'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

素早くプルリクを出すコツ

素早くプルリクを出そう

エンジニアたるもの、自分が書いたコードがマージされて初めて仕事です。
マージされる前には、 プルリクエスト(プルリク)を出す必要があります。

最近、プルリクを結構な頻度で投げられるようになったので、ちょっと数えてみました。
大体、一ヶ月で75プルリク、1営業日あたり3.75個のプルリクを出していました。

この背景にあるのは、プルリクを早く作るためのコツを習得したことにあると考えています。

というのも、プルリクは差分を作る作業以外に、変更点を確認したり、プッシュしてからブラウザを開いてプルリクを作成したり、意外に雑用が多いです。
この面倒な作業をいかに早くできるようになるかのタイムアタックです。

この記事では、素早くプルリクを出すコツを習得したような気になっている私が、私のやり方をかなり正直に伝えます

ただし、差分の中身や、レビューにかかる時間は計算に入れていません。プルリクにまつわるコード修正以外の作業の時間を最小化することを目指しています。

よっしゃ!修正箇所発見!

あなたは my-branch で絶賛開発中だとします。

origin/master で修正が必要な箇所が見つかりました。
あなたがその修正をすることになりました。

しかし、開発中ブランチをどうしましょう。。

一旦開発ブランチの変更を退避して、ブランチを変える必要があります。
修正後、 my-branch に戻ってくる未来を信じましょう。

git status 開発中ブランチの変更ファイルを確認する

プルリクだけでなく、gitを扱うものとして、 git status は一番使うコマンドと言っても間違いではありません。
実際、私が一回のプルリクで git status は10~20回は軽く打つと思います。

HEAD コミット、ここでは my-branch のコミットから変更されたファイル一覧が出力されます。

$ git status -sb

この -sb オプションは、ブランチを表示した上でシンプルな表記にしてくれるため、 git status -sb をエイリアスにすると良いです。

git stash 開発中ファイルを退避

git stash で差分のあるファイルを一時保存します。

$ git stash

新しく追加したファイルはトラッキングされてないので git add してから git stash しておきましょう。

git switch masterブランチに移動

続いて、プルリクを出すターゲットとなるブランチに移動します。ここでは、 master です。

$ git switch master

git pull masterブランチを最新版にアップデート

この master ブランチは最新版とは限りません。移動した瞬間、次のコマンドで最新版にします。
普通の使い方をしていれば、Fast-forwadでシンプルにコミットがくっついてきます。

$ git pull

git switch -c masterから新しくブランチを生やす

最新版のmasterブランチから、プルリクのための修正ブランチを生やします。
git checkout -b でやっているのはちょっとナウくないですね。

$ git switch -c pr1-fix-handler-error

git switchとrestoreの役割と機能について などを参考にしてください。

プルリクを出す

さて、ここまでで およそ30秒くらい を目指しましょう。
続いては、実際にファイルを修正します。

ただし、今回は修正の中身自体には興味がないのでスキップします。

修正が終わったあと、コミット・プッシュし、プルリクを作るところまでやってみます。

git diff で修正内容の差分を見る

修正した内容が本当に正しいかは、差分を見て確認しましょう。
問題なければ、修正作業は終了です。

$ git diff origin/master

git add ステージング領域に上げる

git status で変更されたファイル一覧を見ながら、コミットするファイルをステージングに上げていきます。

$ git add handler.go

git status で変更されたファイルが限られている場合、時間短縮のために以下のコマンドを使ってもよいです。

$ git add .

よくおかしなファイルがコミットされるから一個ずつ上げることを推奨することがあります。
しかし、私の持論として、問題は git add ではなく、その手前の段階の git status での確認不足にあると考えられます。

git commit コミットメッセージは、プルリクのdescriptionを書く

さて、ついにコミットです。 git commit -m "commit-message" は便利ですが、ここでは単純に以下のコマンドを使います。

$ git commit

このコマンドを打つと、エディタが起動します。そして、次のような入力画面が現れます。

  • 一行目 プルリクのタイトル
  • 二行目は空行
  • 三行目以降 プルリクのdescription

を書いていきます。
重要なことは、ここで 人に見せる意識でメッセージを残す ことです。

  1 ↲
  2 ; Please enter the commit message for your changes. Lines starting↲
  3 ; with ';' will be ignored, and an empty message aborts the commit.↲
  4 ;↲
  5 ; On branch master↲
  6 ; Your branch is up to date with 'origin/master'.↲
  7 ;↲
  8 ; Changes to be committed:↲
  9 ;»------new file:   handler.go↲
 10 ;↲↲

コミットしたあとに、コミットメッセージを修正したいときや、別ファイルもコミットに加えたいときは --amend で一個前のコミットを上書きできます。

$ git commit --amend

git rebase 最新版のmasterにコミットをつなぎ直す

さて、あなたは素早く修正したつもりでしたが、思いの外masterブランチの開発速度が早く、コミットが進んでしまっていたようです。
場合によっては、プッシュするとコンフリクトしてしまうかもしれません。

こんなときは、まず git fetchorigin/master をアップデートしたあと、 git rebase でコミットを最新版の origin/master につけ直します。

$ git fetch
$ git rebase origin/master

git push リモートリポジトリにブランチを作る

最新版の origin/master から一つだけコミットが伸びたブランチが出来上がりました。
これをリモートリポジトリにプッシュします。

$ git push

hub pull-request プルリクを出す

無事にブランチはプッシュできました。ここでGitHubを開くようではタイムアタックで勝ち上がることはできません。

hub コマンドで、まずプルリクを作ります。
以下のコマンドを実行すると、コミットメッセージが並んだ入力画面が開きます。

あなたがさきほど頑張って書いておいたコミットメッセージはそのままプルリクのタイトルと説明文にすることができます。
入力画面を閉じると、プルリクが実際に作られます。

$ hub pull-request -a zawawahoge
$ hub pull-request -a zawawahoge
https://github.com/your-organization/your-repo/pull/123

プルリクのURLが出力されました。

上記のコマンドでレビュアーも指定できるのですが、私はまずGUIで確認してからGitHub上で指定するようにしています。
GitHubの差分は見やすいので、自分自身のミスも発見しやすくなります。

大丈夫そうだと思ったら、思い切ってレビュアーを設定しましょう!

プルリクの修正

親切なチームメンバーの方々が、コメントを残してくれました。
少なからず変更点がありました。面倒臭がらず直していきます。

git merge 最新版のmasterをマージする

修正の前に、最新版の origin/master をマージしておきましょう。

$ git merge origin/master
$ git add .
$ git commit -m "simple message"
$ git push

rebase コミット履歴をきれいにする

修正の結果、 fixtrivial change みたいなコミットがたくさんついてしまうことありますよね。
こういうときは、思い切って git rebase して origin/master からのコミットをすべて書き換えることもあります。
一個だけコミットを修正したいときは git commit --amend も有効です。

$ git rebase origin/master -i
$ git push -f

または

$ git commit --amend
$ git push -f

rebase した場合は、 git push -f でforce pushしないとプッシュできません。なぜなら、コミット履歴がごっそり書き換わっているからです。
用法と用量を守ってforce pushしましょう。

GitHub上でのレビュー後の修正コミットもわからなくなるので、マージする直前なんかにやるといいです。

re-reviewしてもらったあと、ついに approve いただきましたー!

プルリクのマージ

マージは気持ちが良いものです。
approveされたら、堂々とマージしましょう。
バグが起きたら、リバートするなり、再度修正プルリクを出しましょう。

squash mergeでプルリクを一つのコミットに潰す

GitHubでリポジトリの設定を変えると、プルリクのコミット履歴を一つにまとめてマージしてくれるsquash mergeがあります。
チームと相談して、merge commitがいるかどうか議論してからsquash mergeの導入を検討すると良いです。

前の開発ブランチに戻る

git stash pop で元のブランチでの開発環境を復活させる

もう忘れかけていた最初のブランチ・・・。
名前も忘れちゃったけど、ちょっと思い出してみると my-branch でした。

$ git switch first-branch
$ git stash pop

ようやく、元の開発環境に完全に戻ることができました。

まとめ

長くなりましたが、いかがでしたでしょうか?
最近もくもくと一人でタイムアタックしているのですが、誰にも認識されずやっててつまらない気がしたので、いっそ外部公開しようと思って記事にしてみました。

参考になれば幸いです。

面白かったと思ってもらえたらいいねしてもらえると嬉しいです!

Twitter(zawawahoge)もやってますので、フォローしてくれると泣いて喜びます。

(おまけ) エイリアス大公開

5個くらいしか登録してないですが、あると便利なエイリアス紹介しておきます。
完全に自己流なのでご注意。

alias gf='git fetch'
alias gs='git status -sb'
alias gd='git diff'
alias gw='git switch'
alias gp='git pull'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む