rksoftware

Visual Studio とか C# とかが好きです

コミット履歴が恥ずかしい。でも GitHub で PR 出したい! メモ

自分のコミット履歴が恥ずかしい、でも C# Tokyo のお題にチャレンジして PR したい! そう考えていますね。

大丈夫です、コミット履歴などきれいにする必要はありません。何なら既存を破壊するような PR を出しても大丈夫です!
最後に整っていればそれでよいのですし、マージ後に最後に整えますので。

■ それでもやっぱり恥ずかしい

わかります。私も恥ずかしいです。なので簡単にコミットをきれいにしつつ PR する手順で必要なコマンド等をメモしておきます。
私自身が覚えられないので、スニペットとしておいておきたいので。

■ まずは fork

GitHub のサイト上でポチポチすれば完了です。簡単ですね。
github.com

■ clone

fork した自分のアカウントのリポジトリを PC にクローンします。

サイトで clone コマンドで使う URL を取得します。

次のコマンド (例。URL は各自読み替えてください) でクローン。

git clone {URL}
cd .\{リポジトリ名}\

git clone https://github.com/m-ishizaki/CSTokyoCSharpOdai.git
cd .\CSharpOdai\

■ upstream の設定

本家リポジトリを fork した後に本家にアップデートが入った場合の追従のために本家のリポジトリを remote に追加します。

 git remote add upstream https://github.com/csharp-tokyo/CSharpOdai.git

設定ができたか確認をしてみます。

git remote -v
origin  https://github.com/m-ishizaki/CSTokyoCSharpOdai.git (fetch)
origin  https://github.com/m-ishizaki/CSTokyoCSharpOdai.git (push)
upstream        https://github.com/csharp-tokyo/CSharpOdai.git (fetch)
upstream        https://github.com/csharp-tokyo/CSharpOdai.git (push)

■ 本家の main を自身のブランチに割り当てる

割り当てるというのが正しい表現かわかりませんが、本家の状況の複製となるブランチを作っておきます。

git branch {新規に作るブランチ名} {リモートの名前}/{リモートのブランチ名}

git fetch upstream
git branch upstream_main upstream/main

今作ったブランチに移動してみます。

git checkout upstream_main
git branch
  main
* upstream_main

■ ブランチの更新の仕方

本家から pull して自陣のリポジトリに push します。(リポジトリに push はしなくてもいいと思いますが、複数端末でコードを書いている場合はそうした方が混乱しない気がします)

git pull
git push origin {新しく自身のリポジトリに作るブランチ名(ローカルで先ほど作ったブランチ名と同じが良いでしょう)}

git pull
git push origin upstream_main

■ 自身の開発ブランチを作る

本家を複製するブランチをもとに手元に開発ブランチを新規に作ります。

git branch {新しく作るブランチ名} {本家の複製をしているブランチ名}

git branch feature001 upstream_main

ブランチが作られたことを確認してみます。

git branch
  feature001
  main
* upstream_main

ブランチを移動します。

 git checkout feature001
git branch
* feature001
  main
  upstream_main

push します。

 git push origin feature001

コマンドを書いてきましたが開発ブランチ作成は正直、IDE や GitHub のサイト上でやってしまった方がわかりやすい気もします。

■ 本家の変更を開発ブランチに取り込み

本家のブランチに移動して、pull して開発ブランチに移動して merge して push します。何言っているかちょっとよくわからないと思うので、実例コマンドで。

merge のコマンド例

現在のブランチにコマンドで指定したブランチを取り込む。

git merge {本家の複製のブランチ名}

git checkout upstream_main
git pull
git push origin upstream_main
git checkout feature001
git merge upstream_main
git push origin feature001

■ こうやって本家に追従しつつ開発を行います

こうやって本家に追従しつつ開発を行います。

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

ここから本題、コミット履歴をきれいにしましょう。
コミットの履歴は樹形図で見ているでしょうから、そこから VSCode の GUI でやっていきましょう。

この例では、add fileadd file 2 を一つのコミット見してみます。
まとめたいコミットのひとつ前のコミットを右クリックして Rebase current branch on this commit...
ポップアップで Launch Intaractive Rebase in new Terminal をチェックして Yes, rebase
このチェックをつけないとどうなるのか、ちょっと検索したけど見つかりませんでした。ちゃんと書いておきたいですがそれも時間がかかるのでまた今度、とりあえず以降のこの手順通りにならず、別の手作業が必要になるのでチェックをつけて進めるのがわかりやすいことは確かです。

立ち上がってきたビューで、まとめたいコミットをテキストを編集して指示しまう。pick となっているところを必要な場所を s (squash)と書き換えます。しかしここで全部を書き換えてはいけません!
間違えたときは .git/rebase-merge ディレクトリを削除すると復旧できるみたいです。

きちんと指示できなかった例


きちんと指示できた例


タブを閉じて Save

■ GitHub の自身のリモートリポジトリに push する

GitHub に push しますが、そのままではエラーになります。

 git push origin feature001
 ! [rejected]        feature001 -> feature001 (non-fast-forward)

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

-f オプションをつけてツヨイ push で強制 push。

git push -f origin feature001

■ サイトから PR

あとはサイト上から Pull request を作れば完了です。

PR でコンフリクトが出る場合

rksoftware.hatenablog.com

■ 難しいですね

難しいですね。