Git(HubDesktop)の基本編集なんちゃら
GitHubDesktopでプロジェクト編集の基本的な振舞のまとめメモです。
プロジェクトが完成したらレポジトリは削除する
想定されているゴールはこれです。
永遠にgitが関与している状態にしているということはしません。
これに伴い以下は余り推奨されない使い方です。
古いバージョンの保管用に永続して使う
根幹となるシステムを元にbranchで派生したプロジェクトを一括管理する
なので
のような拡張機能のテスト環境の保管のようなものを作るのは想定されていない使い方です。
commitした内容は.gitにどんどん蓄積されていくっぽいっすね。
![](https://assets.st-note.com/img/1674914118369-G3OpZNNY6Q.png?width=800)
リモートリポジトリも、Default branchをDLしやすい様にしているので、Other branchに最新バージョンがあると非常に不便です。
HEADがどこにあろうがTOPはDefault branchですし。
プロジェクトが完成したらレジストリからファイルを脱出させて
レジストリを削除しましょう。
(エクスプローラーで
レジストリフォルダからファイルを切り取って別のフォルダに入れる)
レジストリ削除手順
tip:エクスプローラーで直接削除でもだいたい同じ。
![](https://assets.st-note.com/img/1674914737086-yTbapM5Dgp.png)
![](https://assets.st-note.com/img/1674962263532-y5LBbRWaZF.png)
入れると作成したリポジトリ自体が消える
入れないとGitHubDesktopのリストからだけ削除される。(リポジトリは残る)
![](https://assets.st-note.com/img/1674962334741-SwWRn8v7MF.png)
戻した時、branchなど情報はそのまま。
![](https://assets.st-note.com/img/1674962898414-X9VqEoEs1M.png)
このフォルダを右クリ削除と一緒。
消したリポジトリはゴミ箱に入っているので、エクスプローラーでctrl+zでも戻せます。
基本的な進行方法
以下の図のようにbranchを分岐させて進行します。
![](https://assets.st-note.com/img/1674998936244-TgCm4U2yhc.png?width=800)
なんか正式な名前があったんですが忘れました。GitHub Flowです。(23.04.23追記)
https://gist.github.com/Gab-km/3705015
これの良点はreset --hard を極力使わず、見やすいcommitを保持しながら不要になったbranchを削除して最小限のフォルダサイズに抑えることができる点です。
テキストファイルとバイナリファイル
バイナリファイルはテキストファイル以外全てを指します。
どちらのファイルも記録され、元に戻すことができます。
基本的にテキストファイルはどこを変更したのかまでわかりますが、
バイナリファイルは「変更があった」というシグナルしかわかりません。
(あと変更した人物と時間)
バイナリファイルのうち、画像ファイルは変化前と変化後が表示されます。
![](https://assets.st-note.com/img/1674976893358-9P2SkmFMMz.png)
赤は削除、緑は追加を意味する。
![](https://assets.st-note.com/img/1674976823390-ncJrRwkviv.png)
変化したというシグナルだけ記録。
なお、テキストファイルでもunicode(UTF-16)のファイルはバイナリファイルとして判定されます。
![](https://assets.st-note.com/img/1674976643523-wmT82gDiI8.png?width=800)
変更したとき、同じファイル名だと
削除→追加という判定になる。
.gitignore
Changeタブの判定から外すファイル名を記入します。
一時保存ファイルのtempや、officeだと「 $~【ファイル名】.【拡張子】」のファイルや、リモートリポジトリ(GitHub等)にアップロードしたくないファイルを入れます。
一時保存ファイルが観測対象になっていると、編集中のバイナリファイルを閉じないとcommitやsquash、branchの移動ができません。
![](https://assets.st-note.com/img/1675159742813-UFlrS5bkNa.png)
ignore~のいずれかを選ぶ。
ignore file ~はそのファイル単品(【ファイル名+拡張子】が記入)
ignore all ~ はその拡張子全て(*.【拡張子】が記入)
上記を行うと.gitignoreファイルが生えます。
新規レポジトリ作成時に.gitignoreファイルを作成していれば直接記入も可能です。
注意
ファイル名を変更したとき、そのファイル名、変更後のファイル名がignoreファイルにある場合、margeやcherry-pickで合成ができません。
つまり、そのファイルやフォルダが合成後に消えます。
CONFLICT
![](https://assets.st-note.com/img/1675173426921-YV3d1493uC.png)
CONFLICTは状況Aから状況Bに変更するコマンドをするとき、
両方に同じ名前で中身が違うファイルがある場合に発生します。
直前の動作で変わりますが、大抵の場合
そのファイルをエディタで開くように誘導されるか、
バージョンの最新か古いどちらを採用するかの2択に誘導されます。
中止することもできます。
リモートリポジトリからフォークするとき以外にもファイルを戻したり合成するとき、ローカルリポジトリ内でも発生します。
以下のいずれかで解決しない限りGitの他の動作を受け付けません。
動作を中止する
![](https://assets.st-note.com/img/1674944993491-jFJL5dV7MY.png)
ChangeタブからCONFLICTファイルを右メニューでDiscard change…で処理を中断します。
CLIだと
git 処理内容 --abort
と同義です。
エディタで直す
![](https://assets.st-note.com/img/1675567641081-BXPeRMjXCX.png)
Open in ●● を開くとこんな感じで出ます。これはAtom。
採用する方の「Use me」ボタンを押して保存して閉じればOKです。
バージョンを指定する
![](https://assets.st-note.com/img/1675567794138-cDrVTVu28l.png?width=800)
Use the ~が出ます。
上が母体、下が子体です。変更するなら下。
Marge
branchAにbranchBを合成します。
この時、母体がAだとすると、Bのcommitのhistoryが全てAに合成され、
「 Merge branch 'branchB' 」がAのhistoryに作成されます。branchBは以前のまま残ります。
BranchメニューからMerge into current branch…(Ctrl+Shift+M)で行えます。
注意:
「 Merge branch '' 」のcommit以前のcommitに対して
Squashやcommitの移動ができなくなります。
元に戻す関連
結果的に、現在のファイルAを過去バージョンのファイルAにする方法を
まとめました。
CLIを使えば元に戻したのを元に戻せますが、それぞれの機能を一度別branchで試してから本番データで試すのがいいと思います。
commitの前に直前のcommitまで変更を削除するDiscard changes…
![](https://assets.st-note.com/img/1674915203058-rSSsHM93Qe.png)
commitの後でリモートリポジトリにあげる前までのcommitを削除するUnde commit
![](https://assets.st-note.com/img/1675176024428-vlPUBpVw6t.png)
あとは上記Discard changes…と同じ。
つまり、ローカルレポジトリでは最新commitから順にcommitを削除することができます。(Squashとresetを除く)
同branchの特定のcommitの内容で最新commitを上書きするrevert
主に最新のcommitで追加した機能(commit)を取り外す用途で使います。
取り外すなので、後でまた付ける予定がある場合に最適です。
![](https://assets.st-note.com/img/1674944188848-hDG1p06TGK.png)
Revert changes in commit を選択
正確には、選択したcommitで消した記述と追加した記述を逆転させます。
それら差分の記述が最新部分(HEAD位置)にない場合conflictが発生します。
![](https://assets.st-note.com/img/1675174399552-IPheorkKGo.png)
そのcommitで初めて作成されたファイルとか。
![](https://assets.st-note.com/img/1674945238968-6mvJPuRyNs.png?width=800)
Changeタブに切り替えて該当ファイルのcommitを
![](https://assets.st-note.com/img/1675174911426-MAUAcSL3gu.png)
![](https://assets.st-note.com/img/1675174445160-HjfUXkFg8X.png)
「一番目」が追加され、「2番目」が削除されます。
ただし、最新ファイルは「3番目」という記述で、上記には存在しない。ので。
CONFLICTが発生します。
CONFLICTの時…
![](https://assets.st-note.com/img/1675173426921-YV3d1493uC.png)
![](https://assets.st-note.com/img/1675173577916-76DGchkdAR.png?width=800)
<<<<HEADとかの記述も含めて削除して残したい記述以外を削除します。
![](https://assets.st-note.com/img/1675173694804-ruKzWX3YZU.png)
「3番目」(変更しない)のか
「一番目」(変更する)のか
![](https://assets.st-note.com/img/1675173732016-vl6hiXwzqs.png)
parent of ~ も消えて便利。
![](https://assets.st-note.com/img/1675175340842-POm5f6Z7oW.png)
この状態でcommitします。
![](https://assets.st-note.com/img/1675175551394-fhVFdtYLX2.png)
ちなみに・・・
revertなので
![](https://assets.st-note.com/img/1675208318843-hDZMrqdASw.png)
「2番目に変更」と同じになった「Revert"3番目に変更"」が最新の状態で
「2番目に変更」でrevertすると、
「revertのテスト」と同じになった「Revert"2番目に変更"」になります。(青線)
revert連打で、元に戻るボタンを連打して戻るみたいなこともできます。
ただcommitが消えるわけでなく、元に戻したcommitが積みあがります。
別branchの特定のcommitの内容で最新commitを上書きするcherry-pick
その選択したcommitのみを、現在のbranchのcommitに積みます。Squashなどで圧縮したcommitを拾うなどで使います。
margeだと欲しい機能以外のものも合成してしまうので、
最小1commitから選んで合成できます。
![](https://assets.st-note.com/img/1675212085228-k2AzIUsZ67.png?width=800)
HistoryのcommitをつまんでCurrent branchタブまでオンマウス
入れるbranchの上まで持っていき離す。
複数のcommitをcherry-pickしたい場合は、Shiftとかctrlとかで複数のcommitを選択した状態で上を行います。
![](https://assets.st-note.com/img/1675212254661-dJqHdE8bY6.png)
でも同じことができます。
CLIの場合別branchから現在地へ呼び出すイメージですが、
GitHubDesktopの場合目的地へつまんで持っていくイメージです。
conflictは同じ名前のファイルで違う記述があれば発生するので、cherry-pickでも場合によっては発生します。
Squashと合わせて使う機会が多いと思います。
![](https://assets.st-note.com/img/1675245882328-hY5PyBPKe7.png?width=800)
プルタブから優先させるbranchを選びます。
Useの上が母体で
Useの下が子体です。
子を母に持ち込むので下を選びます。
変更したい場合はつまんできた方のbranchを選ぶわけです。
同branchの特定のcommitの内容の特定のファイルだけを最新commitに上書きするcheckout(restore)
初めに。checkoutは動作は一つで効果は多機能をいう面を持っています。
やってることはHEADの移動だけですが、効果はbranchの変更するとか、特定のファイルだけを変更(復活)するなどあります。
GitHubDesktopではcheckoutで特定のファイルを変更するという機能がないので、CLIを使います。
CLIの起動は
これ見てください。(拡張機能を入れる-クローン)
ショートカットキーはctrl+@(`)です。
$ git restore [ --source SHA値 ] ファイル名.拡張子
または
$ git checkout [ SHA値 ] ファイル名.拡張子
[ ]の中身を省略すると、最新から直前のcommitの状態になります。
実際入力するときは[ ] の記号はいらないです。
tit:TortoisGitが入っていれば以下の手順で行えます。
エクスプローラーからプロパティを選ぶ
![](https://assets.st-note.com/img/1675246683893-vQzel7safT.png)
![](https://assets.st-note.com/img/1675246809181-5khSkdbzdn.png?width=800)
②戻したいファイルを選択、右メニュー表示
③「このリビジョンに戻す」をクリック
同branchの最新のcommitから特定のcommitの間の変更を削除して特定のcommitにするreset --hard
resetは3種ありますが、GitHubDesktopで効果を持つのはhardのみです。
特定のcommitの右メニューから
![](https://assets.st-note.com/img/1674961725689-qH9ouJYUCv.png)
commit識別IDみたいなもんです。
![](https://assets.st-note.com/img/1674961643124-BxbQkM0bV8.png)
git reset --hard 【SHA値】
[ 最新commit~選んだcommitを含まないcommitまで ]を削除して、
[ 選んだcommitの状態 ]にレジストリを上書きします。
選んだcommitの時点で存在しないファイルは削除されます。
![](https://assets.st-note.com/img/1675258302911-t9Ri3XIo4P.png)
青選択から上全てのcommitが削除されて、最新が青選択部分になります。
CONFLICTは発生しません。
resetを取り消したい場合はCLI(ctrl+@)で
git reflog
で自身のアクションのログから【ログのID】を取得して
git reset --hard 【ログID】
でresetし直します。
変更を保存しつつ、より過去(または未來)のcommit位置に移動するSwich branch(git checkout)
分岐したbranchを移動することで、そのbranch当時のレジストリの中身に現在の中身が上書きされます。
その時なかったものは削除されます。その時あったものは復活します。
元のbranchに再移動すれば全て元に戻ります。
なお、自分の現在値をHEADといいこれの移動をCLIでは行います。
![](https://assets.st-note.com/img/1675165324402-uR9NHqvyK0.png)
conflictは発生しません。
![](https://assets.st-note.com/img/1675164983091-RX2dfAlYOP.png)
Leave my changes on ~ は移動前のbranchにcommit以前のchangesを置いて移動します。
Bring my changes to ~ は移動後のbranchにcommit以前のchangesを持っていきます。
このchangesを覚えてられるのは1か所だけです。
2か所目を覚えようとすると1か所目のchangesは記憶領域から消えます。
一時保存ファイルが.gitignoreに登録されていない場合、
バイナリファイルを閉じないと移動できません。
commit整理
適当にcommitしていると、gitの機能の元に戻す関連のものなど
十分に生かすことができません。
新機能追加毎にcommitをまとめるのが一番いいとかないとか。
それでも機能テストのバックアップなど仕方がなく増える部分もあるので、commitした後に整理する方法などまとめます。
複数のcommitを1つに圧縮するSquash(rebase)
![](https://assets.st-note.com/img/1675259562116-5OAGmsphFs.png)
![](https://assets.st-note.com/img/1675259957420-SInLhTDROo.png)
でもOK。
それぞれのcommitの変更がより最新のものが自動で優先されて合成。
このためconflictは発生しません。
commitのコメントであるDescriptionはSquashした全てのコメントが順繰りに入ります。作成時に編集もできます。
Squashの後に、Changeタブに移動すると圧縮内容でcommitの観測対象になってることがあります。起動するだけで発動するマクロを仕込んだExcelとかで発生します。
commitすることで、同じ内容のがもう一度commitされる上、コメントも初期化されます。
Squashは通常操作では元に戻せません。
reset--hardと同じく、CLIでreflog経由のresetで戻せます。
追記:
Marge branchのcommit以前のcommitを対象にSquashを行うことはできません。
commitの順番を入れ替えるMove commit here
commitを掴んで入れ替えたい位置まで動かします。
![](https://assets.st-note.com/img/1675176433371-R8lfZe7Zq0.png)
つまむ時に事前にShiftキーとctrlキーで複数のcommitを選択しておくこともできる。
入れ替わるまでに跨いだ全てのcommitでconflictが発生するので、
そこそこ面倒です。
あまり使う機会がない方が上手な使い方ですね。
追記:
Marge branchのcommitが存在する場合、それ以前のcommitを入れ替えることはできません。
その他必要だった情報↓-------
Bashのコピペ
Bashの場合、ペーストはctrl + shift + v
この時、オプションに
![](https://assets.st-note.com/img/1674962676748-B79ezp30ZZ.png)
Ctrl + Shift + C/Vを~にチェックを入れる必要がある。
Bashをレジストリから起動する
A.GitHubDesktopの設定から呼び出すCLIをBashにする
B.フォルダ内で右クリで
![](https://assets.st-note.com/img/1674962676747-MAlrjaWXuZ.png)
この記事が気に入ったらサポートをしてみませんか?