- 投稿日:2020-07-27T19:17:56+09:00
git stashの流れ【コミットせず変更を退避ってどうやんの】
最近だけど、あるブランチで作業をしていた時に
急遽他の作業依頼が来たんだよね。あれ、今のブランチの作業履歴ってどうやって保存して
他のブランチを切ればいいん...?って困ったのがきっかけ。stashを使うとコミットしていない変更履歴を退避させておくことが可能みたい。
まじでgitすごい。実はstashのこと知る前は、ローカルに変更したファイル群をそのまま保存して
あとで1ファイルずつまた変更しなおしてたんだよね。
まじでなんでもっと早く教えてくれなかった??????ってブチギレそうになったことが以前ある。まず変更を退避!
$git stash save "XXXXXX"これでブランチ上の変更が退避される。
まあつまり、ブランチは変更が加えられていないクリーンな状態になる。
ちなみにXXXXXXのところはコメントだよ。後でこのstashってなんだっけ...?ってならないためのやつ。
俺はいつも"feature/XXXXXX_yyyymmdd"って感じでstash名に加えて年月日をアンダースコアの後に追記してるかな。※commitしちゃってたらだめだよ。addされた変更もしくはaddされていない変更のみが対象だからね。
やべえ、commitしちゃってたって人は戻す方法があるからそれはそれで調べてね。ごめん。え、本当に退避できてんのかな?
$git stash list // 出力はこんな感じ。もしかしたらちょっとちがうかも。まあいっか。うろ覚えなんでね。 stash@{0}: feature/XXXXXX_yyyymmddこれでさっきのstashがしっかり保存されている(退避されている)ことが確認できたね。
ついにブランチがクリーンな状態に... めでたい。
もう思う存分新規ブランチを切りまくってください。バンバン移動してもらって構いません。よし、退避した変更を元に戻しますか
// stash@{0}の作業を元に戻すよ $git stash apply stash@{0}これでなんと、退避した変更は元通り。
微妙にめんどくさいけど、何回かやれば大丈夫すぐなれる。
あ、一点だけ注意。元に戻すときは、ちゃんと変更を元に戻したいブランチへ再移動してからにしてね。
これが最初できてなくて、若干混乱したことが何回かあるんで~退避履歴溜まってきたし、削除してえ
$git stash drop stash{0}dropしちゃえば削除できるよ。
削除前と後にはlistでしっかり削除確認してね。
あと、間違えてstashを削除してしまっても元に戻す方法はあるらしい...
それについてはまたどこかのタイミングで!最後に復習しよっか これで忘れない
- saveして
- list確認して、他ブランチで作業開始
- 作業が終わったら、ブランチを移動してapplyしてOK
- stashが溜まってきてうぜえってなったらdrop
おわり。
つかれた。
- 投稿日:2020-07-27T18:57:21+09:00
npm versionでアルファ版やRC版にインクリメントする
Node.jsのプロジェクトでは
npm version
コマンドでバージョンをインクリメントできます。package.json, package-lock.jsonの書き換えと、Gitタグの追加が自動化されます。よく使われるmajor
,minor
,patch
の他に、pre*
というプレリリース用のオプションが実装されています。以下の動作確認はnpm v6.14.5で行いました。
次期バージョンのアルファ版作成
# 1.2.3 => 2.0.0-alpha.0 npm version premajor --preid alpha
premajor
を指定すると、次期メジャーバージョンのプレリリース版となります。このとき--preid
オプションを指定すると任意の接頭辞(この場合はalpha
)が付加されます。接頭辞を指定しなかった場合は2.0.0-0
となりました。アルファ版の中でのインクリメント
# 2.0.0-alpha.0 => 2.0.0-alpha.1 npm version prerelease
プレリリース部分の番号をインクリメントするには、
prerelease
を指定します。この場合は--preid alpha
を指定してもインクリメントされます。ただ--preid
なしの方がbeta.0 => beta.1
やrc.0 => rc.1
のときでも同様に動作するので、ミスが起こりにくそうです。アルファ版からRC版に格上げする
# 2.0.0-alpha.1 => 2.0.0-rc.0 npm version prerelease --preid rc2.0.0のプレリリースであることには変わらないので
prerelease
を指定し、--preid
オプションでアルファからRCに変更します。自動的にrc.0
がセットされました。Semverではプレリリース版の接頭辞はアルファベット順に解釈されます。(2.0.0-alpha.1
<2.0.0-rc.0
<2.0.0
)正式版のリリース
# 2.0.0-rc.0 => 2.0.0 npm version major
上記のコマンドで動きましたが、バージョン指定は
minor
でもpatch
でも同じ結果でした。そもそもバージョン番号は上がってないのでどれもしっくり来ません。明示的にnpm version 2.0.0
を実行してもいい気がします。
- 投稿日:2020-07-27T18:57:21+09:00
npm versionでアルファ版やRC版を作成する
Node.jsのプロジェクトでは
npm version
コマンドでバージョンをインクリメントできます。package.json, package-lock.jsonの書き換えと、Gitタグの追加が自動化されます。よく使われるmajor
,minor
,patch
の他に、pre*
というプレリリース用のオプションが実装されています。以下の動作確認はnpm v6.14.5で行いました。
次期バージョンのアルファ版作成
# 1.2.3 => 2.0.0-alpha.0 npm version premajor --preid alpha
premajor
を指定すると、次期メジャーバージョンのプレリリース版となります。このとき--preid
オプションを指定すると任意の接頭辞(この場合はalpha
)が付加されます。接頭辞を指定しなかった場合は2.0.0-0
となりました。アルファ版の中でのインクリメント
# 2.0.0-alpha.0 => 2.0.0-alpha.1 npm version prerelease
プレリリース部分の番号を上げるには、
prerelease
を指定します。この場合は--preid alpha
を指定してもインクリメントされます。ただ--preid
なしの方がbeta.0 => beta.1
やrc.0 => rc.1
のときでも同様に動作するので、ミスが起こりにくそうです。アルファ版からRC版に格上げする
# 2.0.0-alpha.1 => 2.0.0-rc.0 npm version prerelease --preid rc2.0.0のプレリリースであることには変わらないので
prerelease
を指定し、--preid
オプションでアルファからRCに変更します。自動的にrc.0
がセットされました。Semverではプレリリース版の接頭辞はアルファベット順に解釈されます。(2.0.0-alpha.1
<2.0.0-rc.0
<2.0.0
)正式版のリリース
# 2.0.0-rc.0 => 2.0.0 npm version major
上記のコマンドで動きましたが、引数は
minor
でもpatch
でも同じ結果でした。そもそもバージョン番号は上がってないのでどれもしっくり来ません。明示的にnpm version 2.0.0
を実行してもいい気がします。
- 投稿日:2020-07-27T17:42:50+09:00
[Github初心者]ターミナルで新しいブランチを作成する方法
掲示板を作成中、掲示板の基本機能のみ作ってherokuでデプロイした。
ユーザーログインという新規機能安全にデプロイする為に、新機能開発の前にあらかじめgitでmasterではないブランチを作って、テストを行ってからmasterブランチにmergeを行いたい。ブランチ作成&そのブランチに切り替え
$ git checkout -b create-users-table-model
Switched to a new branch 'create-users-table-model'存在するブランチの確認コマンド
$ git branch
* create-users-table-model masterブランチを切り替える
$ git checkout master
Switched to branch 'master'git checkout create-users-table-model
Switched to branch 'create-users-table-model'新しいDBテーブルの作成
$ rails g migration create_users
〜省略〜 warning: The called method `initialize' is defined here invoke active_record create db/migrate/20200727081835_create_users.rb完成。
ここから開発を行っていく。
- 投稿日:2020-07-27T17:42:50+09:00
[Github初心者]ターミナルで新しいブランチを作成してマスターブランチとマージする方法
掲示板を作成中、掲示板の基本機能のみ作ってherokuでデプロイした。
ユーザーログインという新規機能安全にデプロイする為に、新機能開発の前にあらかじめgitでmasterではないブランチを作って、テストを行ってからmasterブランチにmergeを行いたい。ブランチ作成&そのブランチに切り替え
$ git checkout -b create-users-table-model
Switched to a new branch 'create-users-table-model'存在するブランチの確認コマンド
$ git branch
* create-users-table-model masterブランチを切り替える
$ git checkout master
Switched to branch 'master'git checkout create-users-table-model
Switched to branch 'create-users-table-model'新しいDBテーブルの作成
$ rails g migration create_users
〜省略〜 warning: The called method `initialize' is defined here invoke active_record create db/migrate/20200727081835_create_users.rb完成。
ここから開発を行っていく。
DBに必要カラムを追記して作成
db/migrate/'date'_create_users.rbclass CreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| t.string :username t.string :email t.timestamps #created_atなどが自動で追加される #passwordカラムはあとから追加する end end enduserモデル作成
modelsフォルダの下にuser.rbを追加
models/user.rbclass User < ApplicationRecord end保存。$rails cでuserが作成できるか確認。
- 投稿日:2020-07-27T15:01:49+09:00
【備忘録】git mergeでconflictが発生した場合の対処
発生したマージコンフリクト
branchをmasterにチェックアウトしてブランチでの変更をmergeしようとした時にコンフリクトが発生。
初めてのことだったので記録しておくことにしました。
ブランチ作業を終えてmasterブランチにマージしようとしたところ、$ git merge finalpage ・ ・ CONFLICT (content): Merge conflict in config/routes.rb ・ ・ Automatic merge failed; fix conflicts and then commit the result.と、怒られてしまいました。googleで調べてみると、コードの内容に競合が発生した時に起こるとのことらしいですね。git status で確認すると、
On branch master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: routes.rb no changes added to commit (use "git add" and/or "git commit -a")と、なりました。すなわち別々のブランチで修正されていてどっちかにしないとおかしいよ、ってことですね。私の場合、masterブランチの内容とfinalpageブランチ両方で内容の変更が発生しており、双方が両立しないためコンフリクトが発生したのでは、と考えています。
vscodeでコードを確認すると、
routes.rbget 'sessions/new' <<<<<<< HEAD resources :users do member do get '/password_reset', to: 'password_resets#new' post '/password_reset', to: 'password_resets#create' end end ======= resources :users >>>>>>> finalpageとなっていました。
<<< HEAD === >>> finalpage
で囲まれている内容をlocalで修正しなければならないということなので、<<< HEAD === に囲まれた内容にしたいため、
=== >>> finalpage で囲まれている内容は手動で削除し、
git add routes.rbを実行して、git statusでコミット内容を確認すると、On branch master All conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: routes.rbに変わりました。コンフリクトは直せているからcommitしてマージを完了してね、ってことらしいので、あとはコミットしてマージも完了し、解決できました。
参考文献
https://yu8mada.com/2018/06/13/how-to-resolve-a-merge-conflict-in-git/
こちらの執筆者様が非常に分かりやすく解説されていてとても助かりました!
- 投稿日:2020-07-27T14:19:45+09:00
git flow init が完了しているかチェックするシェルスクリプト
git-flow を初めて利用する際には
git flow init
で初期設定を行う必要があります。
チーム開発で利用するための CI 用のシェルスクリプトを作成していた際、この初期設定が完了しているか確認するスクリプトを書いたのでメモしておきます。そもそも Git Flow って何?という方は以下の記事が参考になるかと思います。
スクリプト
#!/bin/bash function warn() { echo "$@" >&2; } function die() { warn "$@"; exit 1; } function checkIfGitFlowBranchExists() { local branch_config local existed_in_local branch_config=${1} existed_in_local=$(git config --get ${branch_config}) if [[ -z ${existed_in_local} ]]; then die "${branch_config} が存在しません。 Git Flow の初期化を行ってください。" fi if ! git branch | egrep "\s+${existed_in_local}" > /dev/null; then die "${branch_config} に指定したブランチが存在しません。" fi } function checkIfGitFlowInitialized() { # cf. https://stackoverflow.com/questions/28464229/programmatically-determine-if-git-flow-is-initialized local master_branch_config local develop_branch_config master_branch_config="gitflow.branch.master" develop_branch_config="gitflow.branch.develop" # 1. gitflow.branch.master が設定されており、設定したブランチが存在すること checkIfGitFlowBranchExists ${master_branch_config} # 2. gitflow.branch.develop が設定されており、設定したブランチが存在すること checkIfGitFlowBranchExists ${develop_branch_config} # 3. gitflow.branch.master と gitflow.branch.develop に指定したブランチが別のブランチであること if [[ $(git config --get ${master_branch_config}) == $(git config --get ${develop_branch_config}) ]]; then die "master ブランチと develop ブランチを分けてください。" fi # 4. release/hotfix ブランチが設定されていること if [[ -z $(git config --get "gitflow.prefix.release") || -z $(git config --get "gitflow.prefix.hotfix") ]]; then die "release ブランチまたは hotfix ブランチが設定されていません。" fi } checkIfGitFlowInitialized # 初期設定チェック
git flow init
が実行済みかどうかを確認する手順については Stack Overflow の関連 Q&A を参考にしています。
以下に引用した回答の内容をスクリプトとして落とし込んでいます。Answered here. Basically:
1. Check config for gitflow.branch.master and if the branch does exist in the repo
2. Check config for gitflow.branch.develop and if the branch does exist in the repo
3. Master branch can not be the same as develop branch.
4. Make sure all the prefixes are configured.1 と 2 では
.git/config
の以下の設定およびそのブランチが存在することを確認し、加えて 3 で2つのブランチが別々のものであることを確認しています。[gitflow "branch"] master = master develop = develop4 は以下の prefix 設定があるかどうかの確認です。
[gitflow "prefix"] feature = feature/ release = release/ hotfix = hotfix/ support = support/ versiontag =上記のスクリプトでは release と hotfix しか見ていませんが、必要に応じて feature ブランチなども確認するようにスクリプトを修正してください。
ちなみに
git-flow をデフォルト設定で運用することをチーム内で合意できるのであれば、
git flow init -df
で強制的に初期設定を行ってしまった方が早いかもしれません。
- 投稿日:2020-07-27T11:41:53+09:00
Git でマージ済みのブランチ名のリストを引数にブランチを削除する
方法
git branch --merged
によって、マージ済みのブランチを一覧表示します。
git branch -d ${branch_name}
によって、指定した名前のブランチを削除します。これを合体させた
git branch -d $(git branch --merged)
これなら、簡単に全てのマージ済みブランチをローカルから削除することができます。
参考
※develop と master は消さないようにしています。
とあるように、こちらでは、今紹介したコマンドでは考慮していないことを考慮されています。
なので、今紹介したコマンドは、 develop で実施しないと悲しいことになる可能性があります。
(リモートには残ってるからどうとにもなる)
- 投稿日:2020-07-27T11:09:40+09:00
とにかく強制でPullしたい
サーバ内で作業していて、時々発生する「とにかくプルさせてくれ」という場合の対応。
毎回わからなくなるので、ほぼ自分用のメモになります。# git fetch origin # git reset --hard origin/master