Git 18at TECH
Git 18 - 暇つぶし2ch824:デフォルトの名無しさん
22/11/03 20:33:17.75 e1pojM/n0.net
>>788
1系、2系の同時開発とかあるやろ

825:デフォルトの名無しさん
22/11/03 20:41:00.73 vXMSDhes0.net
.gitignoreの書き方で質問
app.log, app.log.1, app.log.2みたいな感じで増えていくログファイルを無視したいのですがどう書けばいいですか?

826:デフォルトの名無しさん
22/11/03 20:41:54.93 5PP47Osh0.net
>>788
なんだやっぱりブランチのことすら分かってなかったのか

827:デフォルトの名無しさん
22/11/03 20:48:29.66 5fumPTTR6.net
>>792
*.log* でなにか被ったりする?

828:792
22/11/03 20:58:19.76 vXMSDhes0.net
logフォルダ作ってそれを無視することにしました
>>794
ごめんなさい!

829:デフォルトの名無しさん
22/11/03 21:00:04.22 AHw2USmo0.net
>>791
あ、なるほど了解。
逆に言えば、同時開発する気がなければ要らないわけだな。

830:デフォルトの名無しさん
22/11/03 21:04:46.26 e1pojM/n0.net
>>796
今自分で「必要だ」って言ったってこと理解してるかい?

831:デフォルトの名無しさん
22/11/03 21:15:11.85 AHw2USmo0.net
>>790
C化しただけで環境依存が無くなるのなら、既にC化されてるbashでいいだろ。
Cコード上で何か小細工が必要なら、それは「互換性を上げる」名分でbashにcontributeすべきで、
Git側で吸収する案件ではない。
GPLから逃れたいってのも意味が分からん。
bashのコードを改変して新機能追加してmac_bachにしたら、そのコードを公開しないといけないが、
普通にbashを使って作業するだけなら関係ないから使えばいいだけ。
何か思惑有るんだろうけど、Gitがソースを汚してまでフォローする案件じゃないだろ。
> また、これ以外にも zsh や bash などのシェルが FreeBSD Ports Collection から利用可能です。
> https://


832:docs.freebsd.org/ja/books/handbook/basics/ 自分でインストールしろよ。



833:デフォルトの名無しさん
22/11/03 21:16:20.05 e1pojM/n0.net
だからなんでgit使うだけで
bash+たくさんコマンド入れなきゃならんのだよ

834:デフォルトの名無しさん
22/11/03 21:22:26.35 AHw2USmo0.net
>>797
必要なのはポインタであってブランチではないんだ。
というか、俺にとってはその時のスナップショットが復元出来れば何だっていいんだよ。
fast-forwardでは履歴が辿れないからrebaseで、みたいな話もあるからもうちょっと確認必要だが、
git flow は手動ではなくインストールして使え、そうすれば全部やってくれる、としてるところばかりで、
どうもmergeの時に色々判断して小細工してるようだが、何やってるのか書いてないから分からないんだ。
まあでも色々他の簡単なのもあるみたいだし、初心者だから出来るだけ単純なのにするよ。

835:デフォルトの名無しさん
22/11/03 21:25:51.42 AHw2USmo0.net
>>799
逆に一体どんな環境でやってるのさ?
普通のunixコマンド一式すら入ってないのか?
そもそもGitなんてPCかそれに近い環境で動けば良くて、それ以外は考慮する必要ない気がするが。

836:デフォルトの名無しさん
22/11/03 21:29:12.32 e1pojM/n0.net
>>800
今話をしているのはお前が言ったこと
> 逆に言えば、同時開発する気がなければ要らないわけだな。
if (同時に開発する気がある) {
  いる
} else {
  いらない
}
自分で同時に開発する気があればいるって言っただろ自分で

837:デフォルトの名無しさん
22/11/03 21:39:01.44 AHw2USmo0.net
>>802
ん?どこを誤解されてるのかは分からんが、
俺は複数バージョンを同時開発する気はない。
ただ、リリース後にバグが発覚するする事はあるので、hotfixはする。

838:デフォルトの名無しさん
22/11/03 23:10:44.38 9oLRzF140.net
>>801
普通にSourceTreeとかでコマンド一杯を前提としているとは思えないが。

839:デフォルトの名無しさん
22/11/03 23:14:43.83 9oLRzF140.net
>>788
少なくともCIで回すときは楽だろ。
Git初心者で視野狭すぎなのに、その視野の狭さを無視して「合理的に考えてこれが不要」ってのがあんたのスタイルのようだけど、
そうやってわざわざ視野の狭さから来る「不要」の主張をして反感を買ったレスで学びたいのか?
勉強したいなら、炎上スタイルは目障りなんでよしてほしいな。二言ぐらい余計なんだよ。

840:デフォルトの名無しさん
22/11/03 23:20:07.30 NhDXzDSd0.net
>>798
以下は簡単に調べただけで、時系列の検証もしてないので、何か間違いあるかもしれない
macOSはbash,gcc,sambaをベースシステムにいれるのをやめた
これらはGPLv2からGPLv3にライセンスが変更されて、GPLv3に追加されたバイナリの取り扱いに関する条項がmacOSのセキュリティポリシーに合わなくなったのがその理由
linusはこのGPLv3の条項に批判的で、gitはGPLv2のままでいく可能性が高い
GPLv3のbashに依存するようgitを作り変えると、インストール方法をちょっと特殊にしないとgitもこのGPLv3の条項の制限をうけることになってしまうので、まあやらないだろうね
他のOSSに依存するとこういうのもあるから気を付けないといけない

841:デフォルトの名無しさん
22/11/04 00:15:00.44 SQ9pznPg0.net
> Cコード上で何か小細工が必要なら、それは「互換性を上げる」名分でbashにcontributeすべきで、
Git側で吸収する案件ではない。
頭おかしい

842:デフォルトの名無しさん
22/11/04 00:54:15.51 NvjwOVKTd.net
まあdevelopはいらないかな
mainブランチで開発すりゃいいよ
リリースブランチが必要なら別途releaseブランチを作ればよいのであって、デフォルトブランチは開発系の先端を指してる方が分かりやすい

843:デフォルトの名無しさん
22/11/04 01:05:42.22 EF7BixRC0.net
>>798
> Cコード上で何か小細工が必要なら、それは「互換性を上げる」名分でbashにcontributeすべきで、
gitの都合でbashに迷惑をかけるな
お前のやりそうなことだな
自分の都合で関係ないやつに迷惑をかける

844:デフォルトの名無しさん
22/11/04 01:06:39.03 EF7BixRC0.net
>>808
初心者のお前の感想なんかどうでもいいよ

845:デフォルトの名無しさん
22/11/04 02:09:07.55 v1xRwBrw0.net
GPLに賛同せずにGNU製


846:品を使ってたってことだろね。 結局Linusもタダ乗り爺ってことでしょ。



847:デフォルトの名無しさん
22/11/04 02:50:33.29 BbpXyzD40.net
ブランチの名前の付け方や使い方なんてほんとどうでも良い。チーム内で話し合え
git のブランチは全部等価
デフォルトで main / master 作られるけど
これも使いたくなけりゃ使わなくて良いし名前変えても良い

848:デフォルトの名無しさん
22/11/04 18:16:16.05 XH5wI1Z90.net
>>805
そんなガキみたいなことはしないが、
どう取るのも自由だし、気に入らないのなら無視してくれて構わんよ。
ただgitがポンコツだと言ったとしても、それ本来お前ら関係ないよね?
自身の分身と思えるほどcontributeしまくってるのなら別だけどさ。

> 少なくともCIで回すときは楽だろ。
必要になったときに作ればいいだけなのと、
多分仕様か実装を間違えてて、今のGitの動作では技術的に実用性がない。
これは次の投稿で詳しく述べる。

849:デフォルトの名無しさん
22/11/04 18:17:59.81 XH5wI1Z90.net
A. 消したbranchの情報が確認出来るのって、reflogsだけ?
B. あと、branchは線だ!ってマニュアルは言ってるけど、点だよなこれ?
(ドキュメントか実装のどちらかが間違ってると思うが)

以下git-flowを真似てるとして、gitkと同様に下から上にcommitして、
impl5@feature5, merged to develop and master, add tag of "Version1".
impl4@feathre4
impl3@feature3
impl2@feature2, merged to develop, add tag of "Version0".
impl1@feathre1
impl0@feature0
initial@master, develop
としたとする。
このとき、featureXを一々作っては消させてるのだから、
何か簡単に一覧に出来るコマンドがあるべきだが、無さそう。(git log --walk-reflogsで探すことは出来るが)
正直あとから参照することはほぼ無いが、何かあってもいいと思うが?---(A)

850:デフォルトの名無しさん
22/11/04 18:19:31.52 XH5wI1Z90.net
そして、どうやらGitはブランチローカルという感覚がないらしく?
どのブランチにいても同じ結果が出るのはどうなのよ?---(B)
具体的には、この場合、
masterブランチでは、HEAD~1はinitialを指し、(master上での一つ前)
developブランチでは、HEAD~1はimpl2を指すべき(develop上での一つ前)
だと思うのだが、どこにいてもHEAD~1はimpl4を指してしまう。
つまり、HEAD~Nの探索先はグローバルであり、それは.git/objects下のツリーそのものらしい。
つかね、masterブランチにいた場合、
git diff HEAD~1 HEAD で前回のリリースと今回のリリースの違い
git diff HEAD~2 HEAD で前々回のリリースと今回のリリースの違い
git log ではmasterブランチ上のリリースした物のcommitログだけに絞られて表示
じゃないと実用的な意味がないと思うんだけどさ。
masterにはmergeしかしない運用なら通常は漏れなくタグが打たれ、「点」のアクセスはタグで出来る。
よって残るは「線」のアクセスだが、ブランチは「線」になってない。
実装はよく知らんが、ブランチを切って増えるのは以下の2つで、
.git/refs/heads は先頭「点」、
.git/logs/refs/heads はlogだから、「線」の為の物が無さそう。
本来ブランチはDBで言うINDEXで、CREATE INDEX develop ON git_tree WHERE branch='develop';
みたいなもので、これが「線」だと思うんだけどさ。
実際は「点」なのでHEADしか見えておらず、HEAD~1をブランチによって切り替えられない。
と思うのだが、理解間違ってる?
ここは多分仕様変更した方がいい。(直感的でないし、意味が分からない)
けど今更出来ないだろうから、Gitの仕様の綻びの一つで、next-gitで修正されるべき案件だろうね。

851:デフォルトの名無しさん
22/11/04 18:20:37.25 XH5wI1Z90.net
>>806
MacOSがFreeBSD系なのとLinusがGPLv3をボロクソ言ってたのは知ってたが、両方とも理由は知らなかった。
> GPLv3に追加されたバイナリの取り扱いに関する条項がmacOSのセキュリティポリシーに合わなくなった
よく分からんが


852:結局は両方ともここかな? > プロプライエタリなドライバソフトをLinuxカーネルに読み込む際にDRMの技術を応用している件についてだと思います。 > http://japan.cnet.com/news/ent/story/0,2000047623,20095317,00.htm > GPLv3ではDRMを実装する場合はそのDRMのアルゴリズムに加えて秘密鍵も公開することを義務付けているので、 > そのようなことをしたらプロプライエタリなドライバを提供してもらえなくなるため、賛成はできない、と。 > https://srad.jp/story/06/01/29/1119224/ ただこれって、 GPLv3のコードを使ったバイナリを配布する際、そのバイナリと同じ物を作れるソースコードも配布しろ、だから、 GPLv3のBashをGit配布zipに同梱してもBashのバイナリだから何ら問題ないはずなんだけどね。 GPLv3だからだめだ、ならGPLv2(~2007)のBashでも十分だろうしさ。 やっぱりかなり政治的だよ。勿論譲れないのだろうけどさ。



853:デフォルトの名無しさん
22/11/04 18:22:05.12 XH5wI1Z90.net
>>807
>>809
お前ら狭量すぎ。OSS全体で盛り上がるんだ!という考えが無さ過ぎ。
diffもそうだが、bashの互換性が本当に問題なら、bashを修正すれば全員助かるだろ。
Gitコマンドをシェルで実装すると、unixコマンドの中にgitコマンドが混ぜ込まれてる形になる。
そのgitコマンドをcpに差し替え、unixコマンドだけの状態で環境依存で使い物にならないのなら、
それは立派なバグだから、bashの連中に投げれば直してもらえるよ。
自分で抱え込みすぎ。それでは回らなくなる。(のが一般的だが、バザールだからなあ…)
ただGNUとは根本的にウマが合わないだろうよ。
仕様はグダグダ、ソースコードはゴミ、でも回り続けてるのだから、GNU(伽藍)から見たら何じゃあこれは!!!ってなる。
Git側にはGNUの開発速度はどうにも認められないだろうしね。

854:デフォルトの名無しさん (ワッチョイ 8b14-Tk+f)
22/11/04 19:16:09.99 EF7BixRC0.net
> お前ら狭量すぎ。OSS全体で盛り上がるんだ!という考えが無さ過ぎ。
だからgitの話はgitの中で盛り上がればいいだろ
勝手に他人の家で盛り上がるな
ば~か

855:デフォルトの名無しさん (ワッチョイ 8b14-Tk+f)
22/11/04 19:18:48.53 EF7BixRC0.net
>>817
あとgitをbashに依存させるな

856:デフォルトの名無しさん (ワッチョイ 8b14-Tk+f)
22/11/04 19:19:54.54 EF7BixRC0.net
bashがなんでも修正を入れるわけがない
それは俺の仕事じゃないと言って断られるが落ち
bashをぶくぶく太らせるな
一つ事だけやらせろ

857:デフォルトの名無しさん
22/11/04 19:54:32.33 fRhzbJ/d0.net
>>816
GPLv3ではバイナリを配布する際にそのバイナリをユーザがソースからコンパイルしなおして入れ替え可能でなければいけないという条項になっているらしい
MacOSやiOSのアプリやストアから配布するAndroidのアプリなんかの今どきのバイナリ配布は、署名済みバイナリしか実行できないから、ここにGPLv3の物を入れるとライセンス違反になる

858:デフォルトの名無しさん
22/11/04 19:57:10.42 fRhzbJ/d0.net
>>817
GNUは別に開発組織ではないから統一的な開発ポリシーなんてものはないが、
GPLv3に移行するようなFSF管理下のGNUプロダクトは、歴史も古いし、比較的少数のおっさん達が気ままに管理してることが多いので、OSSと呼ばれるようになる前からの伝統的なUNIXフリーソフトのべたなソースツリー構成なものばかり
たとえばbashのソースコード構成なんてgitみたいにトップディレクトリ下に組み込みコマンドの実装コードがだらだら並んでてgitと変わらん

859:デフォルトの名無しさん
22/11/04 20:10:08.60 jUM5cpqM0.net
どのOSでメインに作業してるのかわからん感じだな。
LinuxはCでモノリシックだとDISり、GNUコマンド群でないmacOSも�


860:桝RDISり、 Windowsなんか論外って感じだろ。 3OSぐらい使ってたらとてもシェルなんか信用できないけどな。



861:デフォルトの名無しさん
22/11/04 21:06:47.76 XH5wI1Z90.net
>>822
いやそこまでは全然見てない。
今回の仕様とパッチの顛末見て、他もそうだと勝手に推定してる。
読む価値のないコードのはずだから。(物によって全然違うかもしれんが)
ただこれで回ってるのは事実だからな~。ちょっと観戦モードだ。
まず既に言ってるが仕様がグダグダ。
仕様は追加は簡単だが、削除することは基本的に無理なので、厳選しないといけないのに、まるで出来てない。
つまりこの辺の常識的な長期保守戦略をまるで知らない奴がやってて、止める奴もいないということ。
そして今回のメモリリークだが、確保したらそこで寿命も確定する、実装が一番簡単なタイプで、
これをリークさせるようなら話にならない。
ただそれでもミスることはあるが、出てきたパッチがこれまたグダグダで、Cのメモリ管理の基本を完全に無視してる。
レビューがあったら見た瞬間落とされるソースだ。そりゃリークするよな、としか思わない。
(ただし第2弾、第3弾も出てきて、ましになりつつあるが、それでも方向性を根本的に間違ってる。
とはいえ、展開が異常に早いのも確か)
だから、通常の開発をやっているであろうGNUでは、仕様のレビューでも、コードのレビューでも落とされる。
だけどGit側にその理由を理解出来る奴がいないからこうなわけで、当然ブチ切れる。
そして喧嘩別れ、だったら俺らで作るからいいよ、でforkして突っ走ってるだけのように見える。
若すぎる。
ただそれでも実装能力だけはあるので、diffはGNUより装飾周りが断然進歩してる。
これはやっぱりGNUdiffと一緒にやってた方がみんな幸せだったと思うよ。
上手く導ける奴がいれば、
というより普通に長期保守したことがある奴が上層部に一人でもいれば、この辺は簡単に修正出来ると思うのだけど、
それは伽藍タイプの話で、バザールだとどうにもならないのかもしれんし、
突っ走らせないとプロジェクト自体が死ぬのかもしれんし、(サメみたいにね)
よく分からん。

862:デフォルトの名無しさん
22/11/04 21:10:52.33 EF7BixRC0.net
口だけ達者で何もできない無能

863:デフォルトの名無しさん
22/11/04 21:14:59.38 PwG12fTHM.net
>>824
GNUが何なのか全く理解できていない

864:デフォルトの名無しさん
22/11/04 21:27:19.25 PwG12fTHM.net
>>823
自分が理解できないものは全部糞
理解力が致命的に弱い
この2つが合わさると全方面Disることになる

865:デフォルトの名無しさん
22/11/04 21:35:53.62 SQ9pznPg0.net
>>817
何で自分の関心の向かないOSSにわざわざ貢献しないといけないんですか?
金も貰えないのにそんなの苦行でしょう、アホらしい
それとも君はLinusに向かってそれを要求できるほどGNUに対して貢献してるんですか?

866:デフォルトの名無しさん
22/11/04 21:39:58.51 EF7BixRC0.net
bashの方を直せって言うなら
GNU bashのプロジェクトに殴り込みをかければいいじゃん
お前が

867:デフォルトの名無しさん
22/11/04 21:54:21.97 XH5wI1Z90.net
>>828
逆だよ。他人に投げられることは他人に投げろと言ってる。
bashのバグだってことになれば、勝手に直してもらえるだろ。
自分で対応するのは、直してもらえないのが確定してからでいい。

>>829
そもそも俺はbashの互換性で苦労した試しがない。
ただそもそもOS跨いでシェルスクリプトを持っていった試しも無いけどな。てかそんなこと普通せんし。
あーだから、最悪Linux/Windows/Mac用と3種類用意すればよかったんじゃね?C化よりは楽だろうよ。

868:デフォルトの名無しさん
22/11/04 21:55:50.76 EF7BixRC0.net
> 逆だよ。他人に投げられることは他人に投げろと言ってる。
なんのために?

869:デフォルトの名無しさん
22/11/04 21:56:20.74 EF7BixRC0.net
> bashのバグだってことになれば、勝手に直してもらえるだろ。
だからお前がbashに通報しろって
お前という他人に投げたぞw
さっさとやれ

870:デフォルトの名無しさん (ワッチョイ 7997-uk66)
22/11/04 22:08:26.91 jUM5cpqM0.net
>>8


871:30 え、Cでプログラム書いたことないの?OS間の違い、標準Cライブラリの方がよっぽど互換性に苦労することないよ… 考慮しなければならないのはファイルシステムと改行コードぐらいだろう。



872:デフォルトの名無しさん (ブーイモ MM33-ntN1)
22/11/04 22:17:50.42 qsZ+zSWqM.net
まあおまえら落ち着け>>815とか見る限りこいつはひとりではGitを理解できない
炎上させて答えを引き出そうとしてるから餌を与えちゃいかん
ほっとけばすぐいなくなるよ

873:デフォルトの名無しさん
22/11/04 22:48:48.23 XH5wI1Z90.net
>>834
ああ、@1か、これは失礼。
ただお世辞にも分かりやすいとは言えないねこれは。
まあでも、ならbranchを残す意味はあり、>>815は取り下げだな。
>>814については引き続き募集中。

874:デフォルトの名無しさん
22/11/04 22:50:35.62 XH5wI1Z90.net
@{1}ね、まあ分かると思うけど

875:デフォルトの名無しさん
22/11/04 23:04:09.79 7RpVnNq7M.net
>>836
@{1}に気が付くとはさすが軍師殿www

876:デフォルトの名無しさん
22/11/05 00:48:19.73 yugci9j10.net
HEAD~1 で一つ前のリリースとか言ってて爆笑
リリースごとに一回だけコミットするつもりなのか?
永久に git 理解できそうにないな

877:デフォルトの名無しさん
22/11/05 01:35:03.83 CLSrxuim0.net
ネットのクソ記事で独学するより、まともな本買って学習すればいいのにな
つうかあれか、gitの仕様の粗探しがしたいから使い方とかどうでもいいのか

878:デフォルトの名無しさん
22/11/05 01:42:19.97 zPyCNtrD0.net
そもそも一つ前wみたいな考え方するようなものじゃないよなw

879:デフォルトの名無しさん
22/11/05 03:02:36.62 0q4aURph0.net
自分が理解できないから、知ってるシェルスクリプトにすがってるだけだな
POSIX原理主義者と一緒。POSIXの名前を勝手に使って
シェルスクリプトしかできないのをごまかしてる
gitを利用してシェルスクリプトしかできないのをごまかしてる

880:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/05 09:15:20.90 646uiMLL0.net
>>717
ちなみに書く側のコマンドは hash-objectのようだ。
多分初期はPlumbing Commandsをシェルスクリプトでラップして各上位コマンドを提供してたのだろう。
そして俺にはこの程度のシェルスクリプトが環境依存するとはとても思えないんだけどさ。


>>821
って、ふと気づいたが、俺が使ってるのはGitBashだったわ。
現在の公式版にもGitBashバイナリは同梱されてるし、ライセンスがどうこうという問題は無いか、解決されてるよ。
Macは政治的だとして、Linusはその辺実務的に見えるから、
GPLv3をボロカス言って自分はGPLv3には参加しないが、(これは正当な権利で全く問題ない)
GPLv3を殺す為にGPLv3のプロダクトの同梱すらしない、みたいなことはしないのだろうよ。

881:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/05 10:38:45.29 646uiMLL0.net
>>814
公式のcontribに置いてあるユーザー製作の勝手ツールにあるのは発見した。
つまり熟知してる公式からみても面倒な作業だと認めているわけだ。
解決というよりは諦めと納得だが、これも質問を閉じる。
> URLリンク(zenn.dev)


ちなみに、branchを『後から追加』は出来るか?
いやそんな使い方はおかしい!禁止だ!かもしれんが、
やはり俺にはbranchはただの(DBにおける)INDEXで、
随時落としたり作ったり復活させられないと使いづらい。(のではないかと予想している)
ただ、要はreflogを偽造すればいいだけのようだが、
再実装は時間の無駄で


882:しかないので、既にあればそれを使いたい。



883:デフォルトの名無しさん
22/11/05 11:40:31.33 zDjINlW+0.net
>>842
index-stageを理解してないおまえにはわからないかもしれないけど、
DBへ登録されるのはwork tree上のファイル丸ごとでない場合もあるし、
逆にDBからwork treeへ展開されるのもファイルの中の一部分の場合があるから、
そんな単純にはいかない

884:デフォルトの名無しさん
22/11/05 11:40:56.02 zDjINlW+0.net
>>842
Windowsはアプリを実行する上でコード署名が必須でないから問題にならないだけ

885:デフォルトの名無しさん
22/11/05 11:41:36.89 zDjINlW+0.net
>>843
gitのマージを全然理解できてないからブランチを復活させたいとか思ってしまうんだな
普段の運用でスクリプトを使ってブランチを復活させたいとか思う羽目になることはあまりない
ブランチがDBにおけるindexみたいなものとか、後から追加できる?みたいな疑問が生じるあたり、ブランチが何なのか全然わかってない
reflogの偽造が必要という発想もかなりズレてるし、>>814 をみるとコミットの履歴がどういうものなのか理解できていないのだろう

886:デフォルトの名無しさん
22/11/05 12:57:19.46 646uiMLL0.net
>>844
さすがにその程度は知ってるぞ。
ただ、一般的には git add -A で問題ないディレクトリ構成で使う方が多いんじゃないか?
まあそれはさておき、
要は、正しくソフトウェアが構成されてれば、cat-file/hash-object を組みで交換すれば、
末端のファイル形式は自由に選べるって事だよ。sshにすればネットワーク先にも余裕だ。
つってももうこの話は通じないのでいいが。

887:デフォルトの名無しさん
22/11/05 13:13:08.87 646uiMLL0.net
>>845
つまり現行2.38.1のMac版にはBashバイナリが入ってないのか?
それでMacに元々入っているbash以外のshを使ってれば、そりゃ問題は発生するだろうさ。
> URLリンク(qiita.com)
Macとしては署名済みじゃないとウイルスかもしれないので認められず、
GPLとしては署名付けるならその署名を作るソースも公開しろと言ってるわけ?
どっちも拗らせすぎだが、
一般論としては、Mac側に「開発者オプション」で「署名がないバイナリの動作を許可する」があれば済む話では?
実際自分でコンパイルしたバイナリを動かせないと困るし。
ただ、Macってスマホと同一化したからこれって脱獄になるんだっけ?
ならまあ、Gitの為に脱獄はないし、こじれるのは分かるが。
まあ、正直つき合いきれないが、俺なら、C化ではなく、
bashの機能を諦めてshの機能だけで書き直す方を選択するけどね。

888:デフォルトの名無しさん
22/11/05 13:19:32.87 zDjINlW+0.net
>>847
実際仕事すればわかるが add -Aで綺麗なコミットを作れるように整備されてるリポジトリはあまり無い
デバッグしながらコミットしていくときは add -p を使うことがとても多い

889:デフォルトの名無しさん
22/11/05 13:20:48.95 zDjINlW+0.net
>>848
URLリンク(www.infoq.com)


890:2019/07/macos-ditches-bash-for-zsh/



891:デフォルトの名無しさん
22/11/05 13:57:20.56 0q4aURph0.net
git add -Aで十分とかさぁ、開発経験なさすぎだろ
それはgitをバックアップとか途中セーブ機能とでも思ってんのか?
1 commit = 一機能の追加とか、一日の最後にやるものとか思ってるんだろ
通常なにかのバグの修正とか
複数の個別の問題の複合なのに
それ全部まとめんな

892:デフォルトの名無しさん
22/11/05 13:58:29.56 646uiMLL0.net
>>846
そもそも俺含めて大半のプログラマはGitを理解したいとは思ってなくて、
単に便利だから使ってるだけだと思うがな。
理解せずに使えるのならそれに越したことはない。
(この価値観が相容れないのは理解したからもういいが)
君はGitを履歴追跡ツールとしてしか見てないようだが、
俺はもっと一般的に、Git形式のDBとして見てる。(INSERT履歴が保持されるDB)
そして、俺は>>808と同意見で、
開発が今現在行われていないブランチは閉じられてた方が見やすいと思ってる。
常時存在するのはgit-flowでいうdevelopだけで、masterやreleaseはタグでよく、
hotfixを作るならまずmasterブランチを復活させ、そこからhotfixを発生させたほうがいい。
(なおreleaseブランチは最後にバージョンを打つ奴にはいいが、
俺は先にバージョンを打ってから更新部分を実装するので、俺のワークフローには合わない)
それ以外にも、featureX付加時の変更漏れ/不適切な変更によるバグ挿入が後で発覚することはあるから、
git-flow的にfeatureを作っては消しで行くなら、ブランチの復活はプログラマには疑問のないことだ。
featureX_patch0と新たな変更扱いしてもgitオブジェクトツリー自体は同じだが、
名前が似てるだけの別物扱いになるので、
featureXの開発『線』をメンテナンスする気なら、branchの復活が必要になる。
実は、とりあえず同じ名前で作り直せば自動的にくっつく馬鹿向け仕様か?と試してみたが、
まあGitの文化でこれはなかった。
が、まあ、俺的にはこれであって欲しかったね。
「同じ名前が昔ありましたが、そこにくっつけますか?(Y/N)」「Y」
「いい加減にしてくださいよ、何回目ですか?」「うるせーよ」みたいな。
ただこれ、branch側は --list オプションで表示を簡単に絞れるから、
Gitの思想としてはbranchは「消さずに全部残しておけ」で、
git-flowがGitの思想と合ってないだけだね。ならツール用意しとけと。

893:デフォルトの名無しさん
22/11/05 14:02:51.18 0q4aURph0.net
>>852
世の中に理解しないで使えるものなんてない

894:デフォルトの名無しさん
22/11/05 14:04:13.47 0q4aURph0.net
大体gitの使い方を理解したいと思ってるやつはアホ
理解するのはバージョン管理の仕方だ
こうやってツールの使い方を学ぶことが理解だと思ってるから
gitがなくなったらどうしよう
また新しいことを学ばなきゃいけないってなるんやろ

895:デフォルトの名無しさん
22/11/05 14:19:41.99 W/77BOuWM.net
>>854
git そのものを理解すること諦めたか
でもお前使い方の方も盛大に勘違いしてるよ

896:デフォルトの名無しさん
22/11/05 14:24:19.56 646uiMLL0.net
>>851
> それはgitをバックアップとか途中セーブ機能とでも思ってんのか?
> 1 commit = 一機能の追加とか、一日の最後にやるものとか思ってるんだろ
そうだぞ。
ブッ込んでおけば後で何とでもなるただのバケツでしかない。
バケツの使い方を学べとか、知るかボケだ。
後でバケツから探し出すハメになった時、取り出し方をググって取り出せれば十分だ。
大方、プログラマの大半はこの程度の認識のはずだぞ。
そしてお前が望む、綺麗な管理記録は、これのサブセットでしかないんだよ。
だから例えば俺が780で言ったように、「コミットメッセージが空」を除外すれば簡単に得られる。
今のGitにこの機能がないだけ。(まあ近い機能はあるが)
DBならWHEREに条件を付加すればいいだけの楽勝案件で、Web系ならみんな出来るよ。
sedのワンライナーで済むことすらCで実装するGit界隈だと誰も出来ないのだろうけどさ。
まあGitにSQLインタフェースを付け加えればWeb系の奴等は文句言わなくなるんじゃないかな?
連中にとっては直感的になるから。

897:デフォルトの名無しさん
22/11/05 14:34:25.48 0q4aURph0.net
> 大方、プログラマの大半はこの程度の認識のはずだぞ。
お前の周りの無能集団だけだろ

898:デフォルトの名無しさん
22/11/05 14:35:58.29 0q4aURph0.net
一体どこのプロジェクトに「2022年11月4日の仕事終了時のセーブ」なんてコミットがあるんですかねぇ

899:デフォルトの名無しさん
22/11/05 14:42:21.04 oTMzuhJSa.net
>>858
それなんて、俺の前の職場

900:デフォルトの名無しさん
22/11/05 14:46:20.49 0q4aURph0.net
データの取り出し方なんか知っていても
過去のコミットのミスを簡単に直せないなら
バージョン管理は苦痛になるし
やっぱりツールの使い方だけ知ってバージョン管理をしたことがないんだろうな
バージョン管理が不便だからgitが作られたんだぞ

901:デフォルトの名無しさん
22/11/05 14:58:06.66 646uiMLL0.net
>>859
俺はそれでいいと思うけど。
記録してない方が問題で、記録さえしてあれば、ゴミとマジを簡単に分離出来れば十分だ。

>>860
今のGitの修正は十分苦痛だよ。
修正させたくないから面倒にする、は間違いで、
簡単に修正出来るが、修正したことも履歴に残るようにする、が正しい。

902:デフォルトの名無しさん
22/11/05 15:03:35.62 0q4aURph0.net
× 俺はそれでいいと思うけど。
○ 無能はそんなことをしている。
まずさぁ、gitというかバージョン管理の基本を理解してないんだからさ
そこから勉強しなよ

903:デフォルトの名無しさん
22/11/05 15:04:40.67 0q4aURph0.net
> 簡単に修正出来るが、修正したことも履歴に残るようにする、が正しい。
お前はテキストエディタで保存するたびに
gitにセーブしろって言ってんのか?w

904:デフォルトの名無しさん
22/11/05 16:06:55.57 646uiMLL0.net
>>863
俺が言ってる「修正」は、Git自体の修正で、
> なのでマージ前のブランチをレビュー対象とする開発では push の際に整理することになる (778)
の場合に、SQL的に、
DELETE FROM my_repo WHERE branch='featureX' AND commit_message='';
あるいは、
CREATE INDEX beautiful_featureX ON my_repo WHERE branch='featureX' AND commit_message='';
で済むのに、何故Gitにつき合ってグダグダやらねばならんのだ?ということ。

それとは別に、ちょこまかcommitしても、俺は構わんと思うけど。
上記のように、それを1コマンドで除去出来れば、実務上何ら問題ない。
粒度が細かすぎてDBが膨れあがるなら、その部分を定期的にバックアップに切り出していけばいいだけ。
bitcoinはこの方式だ。

>>862
多分根本的に違うのは、
俺: 俺のワークフローに合うようにツールをカスタマイズする
863: Gitのワークフローに合わせてgitを使え、それ以外認めない!
なんだよ。
Linusが個人的に開発したんだからGit自体はそれでいいんだが、
全世界でLinuxと同じワークフローが適切なわけではない。

905:デフォルトの名無しさん
22/11/05 16:10:37.55 5Oe/8sYX0.net
>>864
アホなの?コミットメッセージは毎回入れるものだ

906:デフォルトの名無しさん
22/11/05 16:11:36.07 5Oe/8sYX0.net
>>864
> 全世界でLinuxと同じワークフローが適切なわけではない。
だからgitはいろんなワークフローに対応してるんだろうが
お前のはバージョン管理のワークフローではない
ただのバックアップのワークフローだ

907:デフォルトの名無しさん
22/11/05 16:45:19.71 CLSrxuim0.net
まあ1人プロジェクトみたいだし好き勝手やらせればいいさ

908:デフォルトの名無しさん
22/11/05 16:54:40.83 5Oe/8sYX0.net
コミットメッセージが空だったら~とかわけわからんなw

909:デフォルトの名無しさん
22/11/05 16:56:10.72 5Oe/8sYX0.net
行単位で独立してるデータベースのデータじゃないんだからさぁ
ソースコードは前後の歴史とつながってる
DELETEなんちゃらみたいに一つだけ取り除くことが出来るのは稀

910:デフォルトの名無しさん
22/11/05 17:21:12.99 646uiMLL0.net
>>869
それは当然UIの話で、当たり前だが�


911:熾狽フリンクは接続し直すんだよ。 そしてそれをユーザーには見せない。 多分ここら辺の階層の話がGitには存在しないんだよ。 だからユーザーがviでリンク書き換えろとかの勢いだろ。 超密結合だし滅茶苦茶だよそれは。



912:デフォルトの名無しさん
22/11/05 17:22:28.46 5Oe/8sYX0.net
>>870
都合が悪いからって無視するな
前後のソースコード関連してるから
途中のコミットを取り除くことはできないと言ってる

913:デフォルトの名無しさん
22/11/05 17:28:35.59 B2i8Nuif0.net
つまり、両親がイブに中出ししてお前が生まれたという歴史において、
イブの中出しだけを無かったことにはできないと言うことだね
その後の歴史でお前が存在するのはおかしいし

914:デフォルトの名無しさん
22/11/05 17:30:55.67 646uiMLL0.net
>>871
何言ってんだ?
中身はただの単方向リンクリストだぞ。
リンク先が複数のこともあるが、それでも問題なく抜ける。
ただそれ以前に、俺は既に言ったとおり「記録されてないほうが問題」とするので、
CREATE INDEXを使うが。これなら理解出来るか?
だったら、このINDEX対象をちょうど全部含むようにリンクリストを新しく作り直せばいいだけ。
それがDELETEしたものと同じ物になる。これで理解出来るか?

915:デフォルトの名無しさん
22/11/05 17:40:00.52 5Oe/8sYX0.net
>>873
じゃあ抜き取ってみ
・commit 1「aaa を追加」
aaa
・commit 2「bbb を追加」
aaa
bbb
・commit 3「bbb を ccc に置き換えた」
aaa
ccc

ここからcommit2を抜き取ったときの
commit3の修正内容をよく読んでみろ

916:デフォルトの名無しさん
22/11/05 17:44:37.25 W/77BOuWM.net
>>873
残念だけどそこから間違ってる
Gitのコミットのリストは単方向リンクリストではない
なのでリストの途中のコミットを削除したり途中に追加できない

917:デフォルトの名無しさん
22/11/05 17:58:44.17 646uiMLL0.net
>>874
ああコミットメッセージについては考えてなかったが、
俺ならそのままぐちゃっと貼り付けるけど。
つまり、
・commit 1「aaa を追加」
aaa
・commit 3「bbb を追加」「bbb を ccc に置き換えた」
aaa
ccc
になる。

918:デフォルトの名無しさん
22/11/05 18:03:19.55 646uiMLL0.net
>>875
親が複数あるだけの単方向リストだよ。
まあこれを単方向リストと呼ぶかは微妙だから、ツリーと言った方が通じたか?
ツリーが複数重なり合った状態になってるだけだよ。
単線の A<-B<-C なら A<-C になる。これは自明だよな。
マージの場合、(BがADのマージ結果ね)
A<-B<-C
D<-|

A<-C
D<-|
にする。

919:デフォルトの名無しさん
22/11/05 18:18:30.70 5Oe/8sYX0.net
>>876
ようやく理解したか。
だからお前がやってるのはただのバックアップを取ってるだけだっていってんだよ
バージョン管理というのは何をどう変えたかという変化を記録するものだ
スナップショットじゃねーんだよ、あーほ

920:デフォルトの名無しさん
22/11/05 18:19:21.47 5Oe/8sYX0.net
>>876
bbbの話がないのだから、
書き間違えなのか全く区別がつかない
バグコミットメッセージだな

921:デフォルトの名無しさん
22/11/05 18:21:44.83 5Oe/8sYX0.net
>>873
> ただそれ以前に、俺は既に言ったとおり「記録されてないほうが問題」とするので、
だからお前のテキストエディタでの変更内容を全部記録するって言ってるんだろ?
ファイルを保存するたびにコミットするんだろお前は?

バージョン管理で記録するのはソースコードの修正履歴であって
お前個人の作業履歴じゃねーんだよ
使い物にならないゴミコミットを作るな

922:デフォルトの名無しさん
22/11/05 18:26:48.37 646uiMLL0.net
>>878
ああ履歴についての認識が違うんだな。了解した。
履歴は、
俺: スナップショット=「点」の並び
君: 変更した線の並びで、それはcommitメッセージに現れる。
それだと、commitメッセージが間違ってる場合はどうしようもなくなるだろ。
あくまでソースコードが重要で、どこをどう変えたかはdiff取れば済むだけの話、
commitメッセージなんて目安に過ぎないんだよ。
Gitもこちらの立場に近く、VCSとしては珍しく(と聞いているが俺はそこまで詳しくないが)
差分ではなく本体を記録するだろ。

923:デフォルトの名無しさん
22/11/05 18:31:31.07 5Oe/8sYX0.net
>>881
> 履歴は、
> 俺: スナップショット=「点」の並び
だから、それはバックアップで言うって最初から言ってるだろ
お前が完全に間違ってるんだよ
> それだと、commitメッセージが間違ってる場合はどうしようもなくなるだろ。
修正しろよ。それが出来るように作られているだろ
> commitメッセージなんて目安に過ぎないんだよ。
はっw バージョン管理の素人が。
コミットメッセージの重要性を知らない時点で終わってるよ

924:デフォルトの名無しさん
22/11/05 18:32:44.57 646uiMLL0.net
>>880
> ファイルを保存するたびにコミットするんだろお前は?
そこまではしないが、1日10回とか平気ですることもあるし、それが問題だとも思わない。
この辺はポリシーだし、好きなようにすればいいと思うがね。

間違いなく言えるのは、俺は美しいソースコードを目指しているのであって、
美しいコミット履歴を目指しているわけではないんだよ。
そしてコミット履歴が過剰なら、落とせばいいだけだろ、という話。
無い履歴からは生成することは不可能なのだから、大きすぎる粒度より、小さすぎる粒度の方がいいに決まってる。
所詮commitメッセージなんて当てにならないし、diffが取れれば全く問題ない。

925:デフォルトの名無しさん
22/11/05 18:32:45.04 5Oe/8sYX0.net
> Gitもこちらの立場に近く、VCSとしては珍しく(と聞いているが俺はそこまで詳しくないが)
> 差分ではなく本体を記録するだろ。
だから最初からバージョン管理は差分を記録するものであり
gitの優れた点が、発想の転換で
本体を記録することで差分を表現することにした点なんだろ
実装の話とごっちゃにするな
そういうところが技術的に未熟なんだよ

926:デフォルトの名無しさん
22/11/05 18:33:34.01 5Oe/8sYX0.net
>>883
> そこまではしないが、1日10回とか平気ですることもあるし、それが問題だとも思わない。
そりゃお前が素人だから問題であることに気づいてないだけ
誰もやってないからね
> この辺はポリシーだし、好きなようにすればいいと思うがね。
お前が未熟だから反論できずにポリシーってことにしようとしてる

927:デフォルトの名無しさん
22/11/05 18:33:50.55 zDjINlW+0.net
>>877
分散バージョン管理ではですね、リポジトリのコピーがばらばらに複数存在することが前提なので、
あるひとつのリポジトリのコミット履歴が A<-B<-C で、他のリポジトリではこれが A<-C になっているという状況は不味いんですよ
なのでGitではそれができないようにデータ構造が設計されています

928:デフォルトの名無しさん
22/11/05 18:34:49.14 5Oe/8sYX0.net
> 間違いなく言えるのは、俺は美しいソースコードを目指しているのであって、
> 美しいコミット履歴を目指しているわけではないんだよ。
コミット履歴は「使うもの」だって分かってないようだな
一部のコミットだけ抜き取って
他のブランチに組み込む
使うものだ
お前はただ見れればいいと思ってる
バージョン管理を理解してない

929:デフォルトの名無しさん
22/11/05 18:35:50.16 5Oe/8sYX0.net
>>883
> 所詮commitメッセージなんて当てにならないし、diffが取れれば全く問題ない。
お前が作るコミットがクソだから、使いものにならなくなっているだけだなw

930:デフォルトの名無しさん
22/11/05 18:39:58.47 646uiMLL0.net
>>882
まあ君と仕事することは無さそうだから別に問題ないけど、
> 修正しろよ。それが出来るように作られているだろ
コミットメッセージをいくら修正したところでそもそも意味無いんだよ。
管理してるのはメッセージじゃなくてソースコードなんだから。
それで、重要なコメントはソースコード上に書いてるから、diff取れれば十分なんだよ。
コミットメッセージは、あくまでGit上から探し出すラベルでしかなくて、何をやったかはdiffで見るし、それ以外にないよ。
> はっw バージョン管理の素人が。
> コミットメッセージの重要性を知らない時点で終わってるよ
まあ俺はGitの達人になりたいわけでもないんで、これで問題ないよ。

931:デフォルトの名無しさん
22/11/05 18:40:40.33 5Oe/8sYX0.net
> コミットメッセージをいくら修正したところでそもそも意味無いんだよ。
それはお前だけの感想ですねw

932:デフォルトの名無しさん
22/11/05 18:41:08.69 5Oe/8sYX0.net
> まあ俺はGitの達人になりたいわけでもないんで、これで問題ないよ。
バージョン管理の素人だって言ってる
お前、他の人と一緒に仕事ができないよw

933:デフォルトの名無しさん
22/11/05 18:41:43.46 5Oe/8sYX0.net
> コミットメッセージは、あくまでGit上から探し出すラベルでしかなくて、何をやったかはdiffで見るし、それ以外にないよ。
途中を抜いといて、何をやったかなんてわかるわけ無いだろwww

934:デフォルトの名無しさん
22/11/05 18:43:50.28 5Oe/8sYX0.net
>>889
こうやってコミット履歴をちゃんと見れて
なんの変更をしたのかわかるようになるまで頑張れよ
URLリンク(github.com)
お前のコミットは汚すぎて
使い物にならんのだわ

935:デフォルトの名無しさん
22/11/05 18:44:39.97 646uiMLL0.net
>>884
> gitの優れた点が、発想の転換で
> 本体を記録することで差分を表現することにした点なんだろ
これは違う。
というかね、どっちを記録したところで、正常に動いていればどのみち任意の履歴を取り出せるから関係ないんだ。
ただ、ファイルシステム等がぶっ壊れて、断片的にしか取り出せなくなったときに、Gitみたいに本体を記録してる方が断然強い。
だから基本は「一番大事なもの」で記録するようにしなければいけない、という観点だったのだけど、
まあこれはフォールトトレラントにしろという話で、ちょっと蛇足ではあったね。
あまり関係ないからこの話は終わりで。

936:デフォルトの名無しさん
22/11/05 18:45:34.09 5Oe/8sYX0.net
> これは違う。
だーかーら、素人のお前の意見なんか聞いてない

937:デフォルトの名無しさん
22/11/05 18:50:58.69 5Oe/8sYX0.net
> ただ、ファイルシステム等がぶっ壊れて、断片的にしか取り出せなくなったときに、
gitは速度のためにスナップショットにしてると書いています
URLリンク(git-scm.com)

938:デフォルトの名無しさん
22/11/05 18:53:08.44 5Oe/8sYX0.net
URLリンク(www.techpit.jp)
なぜスナップショットとして記録するのか
スナップショットとして記録することで、複数人で開発する時のスピードを上げることができます。
詳しくは後ほど解説しますが、複数人での開発の際、並行して開発できるよう、
Gitではブランチというものを切って、バージョンを枝分かれさせて開発していきます。
このブランチでバージョンを枝分かれさせる際や、ブランチを統合(マージ)する際にスナップショットだと非常に作業が速くできます。
Gitがデータを差分というかたちで持っていると、ブランチを切ってマージする時に差分をいちいち計算しなければなりません。
しかしスナップショットで保存しておけば、差分の計算をしなくて済む分、とても速くブランチを切ったりマージできるようになります。
ちなみに、Git以前のバージョン管理ツールの多くは差分としてデータを保存していて、ブランチを切るのに大変時間がかかっていました。
大規模なプロジェクトになると数十秒かかったりすることもありました。
Gitだとこの作業が一瞬でできます。こういった事情があって、Linuxの作者のリーナス・トーバルズは
当時、大規模開発であったLinuxカーネル開発のバージョン管理システムを自作しました。これがGitのスタートです。

939:デフォルトの名無しさん
22/11/05 18:56:37.48 646uiMLL0.net
>>886
ああなるほど、ブロックチェーンよろしく親のhashデータも自分のhashに入ってるのか。
しかしそれは、改竄がばれるだけで、リンクを繋ぎ直すことが出来ないわけではないね。
というかね、それは本体ツリーの話で、
余分なcommitはrepoから消せ!とする君らにとっては問題だが、
俺みたいに、スカスカのINDEXでbranchを再構成するのはその場合にも全く問題ないはず。

ところで、
実は今もbranchの実体がどこにあるのか見えてない。
見る限り .git/logs/refs/heads/各branchにしかなさそうなのだけど、ここかね?
これだと毎回reflogを動的に解釈することになるが。
実装としておかしくはないが、普通はこうはしないので、ちょっと不可解だ。
なおオブジェクトツリーにはbranchのデータは無く、branchは各オブジェクトへのリンクの入った配列だと見てる。
だからシャローコピーでしかなく、後からでもいくらでも作れるだろ、という話。

940:デフォルトの名無しさん
22/11/05 19:03:07.94 5Oe/8sYX0.net
> 後からでもいくらでも作れるだろ、という話。
だから速度重視だって言ってる

941:デフォルトの名無しさん
22/11/05 19:03:54.30 5Oe/8sYX0.net
>>898
君、ほんと知らないなら黙ってたほうがいいよ
恥ずかしいだけだから

942:デフォルトの名無しさん
22/11/05 19:05:11.02 5Oe/8sYX0.net
>>898
> 余分なcommitはrepoから消せ!とする君らにとっては問題だが、
余分なコミットじゃなくて、
コミットとして使えないものにする
バグコミットを消せと言ってるだけ

943:デフォルトの名無しさん
22/11/05 19:21:59.71 zDjINlW+0.net
>>898
まあもう面倒臭くなってきたので全部説明しちゃうが
結果的に親のhashが自分のhashに含まれることになるのだけど、実際には親のhashは自分のコミットオブジェクトに含まれている
その自分のコミットオブジェクトから計算して求めるのが自分のhash
親の祖先に変更があれば自分のコミットオブジェクトの作り直しになってhashも計算し直すことになりそれはもう自分ではない
ブランチの実体はコミットオブジェクトのハッシュひとつだけ
それで事足りる
ず~~~と思っているんだがどう考えてもお前のブランチへの理解はオカシイ
内部的な構造の話ではなくてユーザとして使う上でも問題があるような酷い理解に見える
だから >>815 みたいな謎発言がでてくる
DBのINDEXみたいなもの?とかの謎解釈で突き進まれてもついていけない

944:デフォルトの名無しさん
22/11/05 20:06:


945:13.91 ID:646uiMLL0.net



946:デフォルトの名無しさん
22/11/05 20:19:07.74 646uiMLL0.net
すまん、分かると思うが、 HEAD~1 != @{1}

947:デフォルトの名無しさん
22/11/05 20:45:45.41 zDjINlW+0.net
>>903
reflogのhashは、HEADが変わるような操作をしたときに、その操作の結果のHEADのhashを追記していくだけのログだよ
このログがその後のgitの動作に影響を与えることはない
HEAD@{0}が常に最新の操作に対応したhashに更新される
だからたとえばmasterとfirstという二つのブランチを交互にcheckoutすればこんな感じになる
$ git reflog
0956cde (HEAD -> first) HEAD@{0}: checkout: moving from master to first
be7e7d7 (master) HEAD@{1}: checkout: moving from first to master
0956cde (HEAD -> first) HEAD@{2}: checkout: moving from master to first
be7e7d7 (master) HEAD@{3}: checkout: moving from first to master
0956cde (HEAD -> first) HEAD@{4}: checkout: moving from master to first
be7e7d7 (master) HEAD@{5}: checkout: moving from first to master
最後にcheckout firstしたので HEAD -> first になってる

948:デフォルトの名無しさん
22/11/05 20:59:53.75 646uiMLL0.net
>>905
reflogがその形式なのは知ってる。
ただ、頭のポイントだけだと、903で言ったとおり、経路情報にならないだろ。
例えば、815の場合、再記するが、
impl5@feature5, merged to develop and master, add tag of "Version1".
impl4@feathre4
impl3@feature3
impl2@feature2, merged to develop, add tag of "Version0".
impl1@feathre1
impl0@feature0
initial@master, develop
これで、master上で
git diff @{1} では、initial commit との差分
git diff HEAD~1 では、 impl4との差分が出るんだよ。
これが、master->impl5のエントリポイント情報だけだと出来ないから、
maseterはinitial->impl5に移動しましたよ、という経路情報が何処かに必要なんだ。
それで、git reflog では、
どこにswitchして、commit して、mergeした、という履歴が全部出るから、
(多分だが各HEADのreflogを全てcatして時系列にソートしてる)
解釈すれば可能ではあるけど、そんな面倒なことするか?普通はstaticにシャローコピーだろ、というのと、
reflog は gc されるので、reflogを頼りにする実装は不適切だし、
俺的にbranchを消したり復活させたりする使い方はヤバそうなんだよ。
だからその辺を確認してる。
それで、後で任意のオブジェクト群でbranchを作れるのなら、この辺心配ないのだけど、そうではなさそうだし。

949:デフォルトの名無しさん
22/11/05 21:04:51.93 646uiMLL0.net
ちなみに、843の記事では、Git内のcontrib内のスクリプトが、
branchをreflogを参考に復活させるらしいので、reflog内の情報で足りてはいるらしい


950:。 確かに目で見た限りそうだが、 でもそれだとreflogをgcするのは割と狂気の沙汰だから、おかしいよなーと思ってて。



951:デフォルトの名無しさん
22/11/05 21:06:47.08 646uiMLL0.net
ごめん、書き方が悪かった。
907は、gc対象となるreflogを本番情報として持つのは狂気の沙汰だなーということ。
復活させるときにそこにしか手がかりがないのは仕方ないとして、
生きてるbranchは普通はツリー情報をstaticに持ってるはずだが、見あたらないんだよ。

952:デフォルトの名無しさん
22/11/05 21:15:14.62 zDjINlW+0.net
>>906
そのリポジトリがどういう構造になっているかわけわからん
git show-branch してみろ

953:デフォルトの名無しさん
22/11/05 21:26:43.61 646uiMLL0.net
>>909
すまぬ、確かに今見てればちょっとおかしい。
もう一度作るから30分ほどお待ちを。

954:デフォルトの名無しさん
22/11/05 21:51:56.84 646uiMLL0.net
>>909
結果
$ git show-branch
! [develop] impl5
* [master] impl5
--
+* [develop] impl5
$ git branch
develop
* master

955:デフォルトの名無しさん
22/11/05 21:52:24.93 646uiMLL0.net
>>909
$ git diff HEAD~1
diff --git a/test.txt b/test.txt
index 3585d98..bbddc42 100644
--- a/test.txt
+++ b/test.txt
@@ -4,3 +4,4 @@ impl1
impl2
impl3
impl4
+impl5
$ git diff @{1}
diff --git a/test.txt b/test.txt
index e79c5e8..bbddc42 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,7 @@
initial
+impl0
+impl1
+impl2
+impl3
+impl4
+impl5

956:デフォルトの名無しさん
22/11/05 21:53:21.88 646uiMLL0.net
>>909
再現コード
#!/bin/bash -x
#
git init
echo 'initial' > test.txt
git add test.txt
git commit -m 'initial'
git branch develop
for (( i=0 ; i<6 ; i++ ));
do
git branch feature$i
git switch feature$i
echo "impl"$i >> test.txt
git add test.txt
git commit -m "impl"$i
git switch develop
git merge feature$i
git branch -d feature$i
done
git switch master
git merge develop

957:デフォルトの名無しさん
22/11/05 22:01:15.70 646uiMLL0.net
>>909
ちなreflog
$ git reflog
1a804d9 (HEAD -> master, develop) HEAD@{0}: merge develop: Fast-forward
b0325fc HEAD@{1}: checkout: moving from develop to master
1a804d9 (HEAD -> master, develop) HEAD@{2}: merge feature5: Fast-forward
ba4e962 HEAD@{3}: checkout: moving from feature5 to develop
1a804d9 (HEAD -> master, develop) HEAD@{4}: commit: impl5
ba4e962 HEAD@{5}: checkout: moving from develop to feature5
ba4e962 HEAD@{6}: merge feature4: Fast-forward
a32e11d HEAD@{7}: checkout: moving from feature4 to develop
ba4e962 HEAD@{8}: commit: impl4
a32e11d HEAD@{9}: checkout: moving from develop to feature4
a32e11d HEAD@{10}: merge feature3: Fast-forward
8d9924f HEAD@{11}: checkout: moving from feature3 to develop
a32e11d HEAD@{12}: commit: impl3
8d9924f HEAD@{13}: checkout: moving from develop to feature3
8d9924f HEAD@{14}: merge feature2: Fast-forward
0f78740 HEAD@{15}: checkout: moving from feature2 to develop
8d9924f HEAD@{16}: commit: impl2
0f78740 HEAD@{17}: checkout: moving from develop to feature2
0f78740 HEAD@{18}: merge feature1: Fast-forward
47792a3 HEAD@{19}: checkout: moving from feature1 to develop
0f78740 HEAD@{20}: commit: impl1
47792a3 HEAD@{21}: checkout: moving from develop to feature1
47792a3 HEAD@{22}: merge feature0: Fast-forward
b0325fc HEAD@{23}: checkout: moving from feature0 to develop
47792a3 HEAD@{24}: commit: impl0
b0325fc HEAD@{25}: checkout: moving from master to feature0
b0325fc HEAD@{26}: commit (initial): initial

958:デフォルトの名無しさん
22/11/05 22:02:09.13 646uiMLL0.net
>>909
ついでに一応、終了時のtest.txt
$ cat test.txt
initial
impl0
impl1
impl2
impl3
impl4
impl5

959:デフォルトの名無しさん
22/11/05 22:05:21.84 zDjINlW+0.net
>>911-915
これ全部FFマージやってるから結果的にdevelopブランチとmasterブランチが同じものになるぞ

960:デフォルトの名無しさん
22/11/05 22:09:56.21 zDjINlW+0.net
mergeを全部merge --no-ffにするとマージした構造がわかるようになるし、最後にdevelopとmasterが別のものになる
どっちのマージにするかは現場の運用しだい

961:デフォルトの名無しさん
22/11/05 22:10:47.10 zDjINlW+0.net
git log --graph --branches --oneline とかするとわかりやすい

962:デフォルトの名無しさん
22/11/05 22:11:46.51 646uiMLL0.net
>>916
ああ、それがrebaseしないと履歴が無くなるとかいう話か?
実はそれはまだ確認中だが、とりあえず本件についてはこれでいいし、
俺的には多分こうなる。(基本的にmasterはdevelopの後を追うだけ)
けしか�


963:轤ゥ? それはさておき、本件、HEAD~1 と @{1} が違うものだという経路情報は、 どこにあるのか分かれば教えてくれ。



964:デフォルトの名無しさん
22/11/05 22:22:33.37 zDjINlW+0.net
HEAD~1と@{1}は全然関係無いよ?
HEAD~1は今のHEADの一番目の親のhash
親が複数いるときにはHEAD^1とかHEAD^2とかで指定する
@{1}はひとつ前の操作によってHEADになったhashだから、どういう操作したかで変わり、リポジトリの構造とは関係無い

965:デフォルトの名無しさん
22/11/05 22:30:34.81 zDjINlW+0.net
>>914 で説明すると、
@{0}は最後のコミットで、FFマージした結果masterとdevelopがこのhash=1a804d9になった
@{1}はgit commit -m 'initial'の結果できた最初のコミット(最後のマージ操作の前のmaster)で、最後にこれにdevelopをマージするためcheckoutしたらこれになってる

966:デフォルトの名無しさん
22/11/05 22:35:17.82 646uiMLL0.net
>>920
> @{1}はひとつ前の操作によってHEADになったhashだから、どういう操作したかで変わり、リポジトリの構造とは関係無い
だから、それは「そのbranchの」一つ前の操作なんだよ。
結果、diffは、masterブランチでは>>912で、HEAD~1 != @{1} だが、
developブランチでは、以下になって、 HEAD~1 == @{1} なんだよ。
$ git diff HEAD~1
diff --git a/test.txt b/test.txt
index 3585d98..bbddc42 100644
--- a/test.txt
+++ b/test.txt
@@ -4,3 +4,4 @@ impl1
impl2
impl3
impl4
+impl5
$ git diff @{1}
diff --git a/test.txt b/test.txt
index 3585d98..bbddc42 100644
--- a/test.txt
+++ b/test.txt
@@ -4,3 +4,4 @@ impl1
impl2
impl3
impl4
+impl5
だからmasterブランチをdevelopにmergeしかしない運用をした場合、
masterブランチは @{n} でn回前のリリースが検索出来、存在価値が出てくる、という見立てだが、間違ってるか?
(@はcommit履歴だと思ってるが、まさか操作履歴か?なら確かに意味無いし、先頭情報しか要らないし、reflogしかなくても納得だが)

967:デフォルトの名無しさん
22/11/05 22:40:04.85 zDjINlW+0.net
最終的にお前のリポジトリは git merge develop でこうなっているはずだ
$ git log --graph --branches --oneline
* 1a804d9 impl5 (HEAD -> master, develop)
* xxxxxxx impl4
* xxxxxxx impl3
* xxxxxxx impl2
* xxxxxxx impl1
* xxxxxxx impl0
* b0325fc initial
最後のひとつ前の git switch master をやったときにはこうなっていたはず
* 1a804d9 impl5 (develop)
* xxxxxxx impl4
* xxxxxxx impl3
* xxxxxxx impl2
* xxxxxxx impl1
* xxxxxxx impl0
* b0325fc initial (HEAD -> master)
だから HEAD@{0} = 1a804d9 で、HEAD@{1} = b0325fc

968:デフォルトの名無しさん
22/11/05 22:46:20.49 646uiMLL0.net
>>921
@はやっぱcommit履歴だよな?
エントリポインタだけだと、commit履歴に出来ないんだよ。
今回はfast-forwardマージしてるから、
init<-0<-1<-2<-3<-4<-5 = master, develop
で、単にエントリポイントだけなら master も develop も同じ 5 で区別がない。
当たり前だが両方とも HEAD~1 は4を指してる。
ただ、@{1}は、commit履歴だから、masterでは init を指し、developでは4を指す。
この、commit履歴情報はどこに記録されてるの?というのが俺の質問。

>>923
そこは理解出来てるはず。上記の通り。
問題はcommit履歴がどこにあるか。

969:デフォルトの名無しさん
22/11/05 22:50:12.27 zDjINlW+0.net
>>922
masterブランチをdevelopブランチにマージする方法が
git switch masterとgit merge developの連続実行だけではないし、
HEAD@{n}は適当なタイミングでGCされるから、
HEAD@{n}をそんな用途に使う奴はいない

970:デフォルトの名無しさん
22/11/05 22:52:10.49 zDjINlW+0.net
>>924
commit履歴がどこにあるか説明するのに使いたいから、git log --graph --branches --oneline してくれ

971:デフォルトの名無しさん
22/11/05 22:54:11.54 zDjINlW+0.net
@はcommit履歴じゃなくて、reflogの履歴

972:デフォルトの名無しさん
22/11/05 22:57:39.34 646uiMLL0.net
>>926
$ git log --graph --branches --oneline
* 1a804d9 (HEAD -> master, develop) impl5
* ba4e962 impl4
* a32e11d impl3
* 8d9924f impl2
* 0f78740 impl1
* 47792a3 impl0
* b0325fc initial

973:デフォルトの名無しさん
22/11/05 23:01:41.48 zDjINlW+0.net
@{n}はカレントブランチのreflog履歴になるはず
reflog履歴はブランチ毎に存在するので
master@{n}とdevelop@{n}は違うハッシュになってるはず
git reflog masterとgit reflog developで比べてみればわかる

974:デフォルトの名無しさん
22/11/05 23:04:26.02 646uiMLL0.net
>>917,926
ちな --no-ff 版、
今出すと余計に混乱するかもだが。
$ git log --graph --branches --oneline
* a5aaf72 (HEAD -> master, develop) Merge branch 'feature5' into develop
|\
| * e03bcd0 impl5
|/
* 324df68 Merge branch 'feature4' into develop
|\
| * c2634c4 impl4
|/
* 68ed20a Merge branch 'feature3' into develop
|\
| * 5e12b99 impl3
|/
* 608e5d7 Merge branch 'feature2' into develop
|\
| * 4660e46 impl2
|/
* 3924eae Merge branch 'feature1' into develop
|\
| * 138d83f impl1
|/
* 7db4424 Merge branch 'feature0' into develop
|\
| * 8877414 impl0
|/
* ec041f9 initial

975:デフォルトの名無しさん
22/11/05 23:08:22.79 646uiMLL0.net
>>929
$ git reflog master
1a804d9 (HEAD -> master, develop) master@{0}: merge develop: Fast-forward
b0325fc master@{1


976:}: commit (initial): initial $ git reflog develop 1a804d9 (HEAD -> master, develop) develop@{0}: merge feature5: Fast-forward ba4e962 develop@{1}: merge feature4: Fast-forward a32e11d develop@{2}: merge feature3: Fast-forward 8d9924f develop@{3}: merge feature2: Fast-forward 0f78740 develop@{4}: merge feature1: Fast-forward 47792a3 develop@{5}: merge feature0: Fast-forward b0325fc develop@{6}: branch: Created from master ってことは、commit履歴はreflogにしか無いって事か? ならbrahchを消すとreflogも消されてcommit履歴が消えるが、マジ? これだとbranchの復活は本質的に無理なことになってしまう。 (他branchに断片的には残ってるんだけどさ)



977:デフォルトの名無しさん
22/11/05 23:09:25.37 zDjINlW+0.net
>>928
impl5のコミットオブジェクトの hash = 1a804d9
impl5のコミットオブジェクトの中には親のコミットオブジェクトimpl4の hash = ba4e962 が格納されている
impl4のコミットオブジェクトの hash = ba4e962
impl4のコミットオブジェクトの中には親のコミットオブジェクトimpl3の hash = a32e11d が格納されている
impl3のコミットオブジェクトの hash = a32e11d
impl3のコミットオブジェクトの中には親のコミットオブジェクトimpl2の hash = 8d9924f が格納されている
impl2のコミットオブジェクトの hash = 8d9924f
impl2のコミットオブジェクトの中には親のコミットオブジェクトimpl1の hash = 0f78740 が格納されている
impl1のコミットオブジェクトの hash = 0f78740
impl1のコミットオブジェクトの中には親のコミットオブジェクトimpl0の hash = 47792a3 が格納されている
impl0のコミットオブジェクトの hash = 47792a3
impl0のコミットオブジェクトの中には親のコミットオブジェクトinitialの hash = b0325fc が格納されている
initialのコミットオブジェクトの hash = b0325fc
initialのコミットオブジェクトはルートなので親のコミットオブジェクトが存在しない
つまり impl5のコミットオブジェクトの hash = 1a804d9 からたどっていけば、コミット履歴が全部わかる
親が複数存在する場合には複数の親のhashを格納する

978:デフォルトの名無しさん
22/11/05 23:11:25.45 zDjINlW+0.net
>>930
¥で表示されるとちょっと見にくいが、慣れれば見やすい

979:デフォルトの名無しさん
22/11/05 23:14:09.84 zDjINlW+0.net
>>931
逆だ。コミットのつながりはコミットオブジェクトの中にしかない >>932 みたいにね
それを説明してるのが >>902

980:デフォルトの名無しさん
22/11/05 23:16:52.31 zDjINlW+0.net
>>930は最後のdevelopのマージが --no-ff になってないな
最後のも --no-ff にするともっと面白いぞ

981:デフォルトの名無しさん
22/11/05 23:18:09.46 646uiMLL0.net
>>932
ごめん、それは分かってる。
それはグローバル履歴=gitオブジェクトを辿った履歴、だろ。
問題は、masterのcommitには b0325fc と 1a804d9 しかない、という情報が、
今のところ master の reflogにしか見あたらないんだよ。
だから、各branchを消したら、それ以前の gitオブジェクト は全部辿れるが、commit履歴は消失してしまう。
今のmasterみたいに、fast-forwardマージで中間をすっ飛ばしてきた、
という情報が無くなってしまうんだよ。
だから、branchを消す前の状態に完全には戻せない、という話。
だから、常識的に考えればもうちょっとましな何処かに保持してるはずなんだけど、無いんだ。

982:デフォルトの名無しさん
22/11/05 23:21:56.96 646uiMLL0.net
>>935
ほい
$ git log --graph --branches --oneline
* 2fb59f1 (HEAD -> master) Merge branch 'develop'
|\
| * 25e1b95 (develop) Merge branch 'feature5' into develop
| |\
| | * 4b27393 impl5
| |/
| * 9bfb8cc Merge branch 'feature4' into develop
| |\
| | * c2a5b7d impl4
| |/
| * 02d2308 Merge branch 'feature3' into develop
| |\
| | * f6d1cf7 impl3
| |/
| * 81e18bb Merge branch 'feature2' into develop
| |\
| | * 01c3871 impl2
| |/
| * 5b57f48 Merge branch 'feature1' into develop
| |\
| | * 0fe34d2 impl1
| |/
| * 6272da6 Merge branch 'feature0' into develop
| |\
|/ /
| * fe1b132 impl0
|/
* 832f464 initial

983:デフォルトの名無しさん
22/11/05 23:23:27.84 zDjINlW+0.net
>>936
FFマージしたらその情報は消滅するな
--no-ff で全部マージすれば複数親のハッシュをもってるコミットオブジェクトの1番目だけたどればいける
^1 だけみていくね
git log にはそれをやるオプションがあるはず
>>930をそのオプションで表示すればこんな風に表示されるはず
$ git log --graph --branches --oneline --オプション忘れた探せ
* a5aaf72 (HEAD -> master, develop) Merge branch 'feature5' into develop
* 324df68 Merge branch 'feature4' into develop
* 68ed20a Merge branch 'feature3' into develop
* 608e5d7 Merge branch 'feature2' into develop
* 3924eae Merge branch 'feature1' into develop
* 7db4424 Merge branch 'feature0' into develop
* ec041f9 initial

984:デフォルトの名無しさん
22/11/05 23:26:10.78 zDjINlW+0.net
>>937 だとこう表示されるはず
$ git log --graph --branches --oneline --オプション忘れた探せ
* 2fb59f1 (HEAD -> master) Merge branch 'develop'
* 832f464 initial

985:デフォルトの名無しさん
22/11/05 23:35:28.93 646uiMLL0.net
>>938
$ git log --graph --branches --oneline --first-parent
* a5aaf72 (HEAD -> master, develop) Merge branch 'feature5' into develop
* 324df68 Merge branch 'feature4' into develop
* 68ed20a Merge branch 'feature3' into develop
* 608e5d7 Merge branch 'feature2' into develop
* 3924eae Merge branch 'feature1' into develop
* 7db4424 Merge branch 'feature0' into develop
* ec041f9 initial

>>939
$ git log --graph --branches --oneline --first-parent
* 2fb59f1 (HEAD -> master) Merge branch 'develop'
| * 25e1b95 (develop) Merge branch 'feature5' into develop
| * 9bfb8cc Merge branch 'feature4' into develop
| * 02d2308 Merge branch 'feature3' into develop
| * 81e18bb Merge branch 'feature2' into develop
| * 5b57f48 Merge branch 'feature1' into develop
| * 6272da6 Merge branch 'feature0' into develop
|/
* 832f464 initial

986:デフォルトの名無しさん
22/11/05 23:41:19.40 zDjINlW+0.net
>>939がそう表示されるのは、--no-ff マージの手順が何か普通とちがうからかもしれん
>>939みたいに表示させるマージの手順もあるはずだから工夫してみるんだな

987:デフォルトの名無しさん
22/11/05 23:41:56.11 646uiMLL0.net
>>938
なるほど了解した。
データ側に混ぜ込んでて、保持したければ --no-ff で使えってことか。
そもそも同じハッシュなら同じgitオブジェクトにリンクするようになってるのだし、
(つまり見た目が膨らんでるだけで実際の容量は


988:大して食わない) --no-ff がデフォのほうがよかった気がするが。 まあとにかく了解した。長々とありがとう。



989:デフォルトの名無しさん
22/11/06 00:38:34.83 UPUgwCSv0.net
FFがデフォじゃなと使いにくい気がするのだがw

990:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/06 09:32:37.27 OfQ8ymDc0.net
>>943
ffがデフォのメリットって何だ?特にないと思うが。見た目すっきり、か?
ただまあ、デフォだし、サル先生他も特に何も言ってないので、ffでの運用が多数派なのだろう。

--no-ffはcommitオブジェクトが別に作られるだけで、
スナップショットに比べたらゴミなので全体としては大して増えない。
commit履歴はgitオブジェクトツリー内に混ぜ込まれ、完全に保持される。

ffの場合は、commit履歴情報はreflogにしか無いので、branchを削除したら基本的に失われる。
そしてreflogもgc対象なので、Linusはcommit履歴は基本的に保持する必要がないとの立場なのだろう。
また、branchを削除しろといいつつffなのは、その人達もcommit履歴は要らない、と考えていることになる。

ただこれは奇妙な実装だ。
カーナビを考えれば分かるが、当たり前だが地図情報とルート情報は別なのだ。混ぜ込むのはあり得ない。
commit履歴が要らないってのは、経路(線)は不問で、目的地(点)に着いてるかどうかだけだ、と言っているわけ。
それはバージョン管理の達人()にとっては、違うんだろ。バージョン管理は「線」であると!
ただ、Linusも「点」の立場だね。まあプログラマ的にはこれで正しいんだよ。
コンピューターは今現在のソースコードしか見てなくて、どの経路を辿ったかなんて関係ない。
だからどういう紆余曲折(「線」)があったかではなく、結局は前回の「点」と今回の「点」のdiffだけが価値を持つ。
そしてLinusの個人的ツールであるGitも、この流れなわけだ。

とはいえ俺はルート情報はまた別に重要だと思うから、保持したい。
混ぜ込まれてる場合は後からbranchを追加することが絶対に出来ない。
まあ開発ツールとしては別経路から同じ点に到達しました!なんてのは現実的にあり得ないから、
偽造を防ぐ為にもこれでいいのかもしれんが、一般的に考えればこの実装は奇妙だ。
ちなみに一般文書、例えばEULA(EndUserLicenseAgreement)とかの隙を潰していくタイプの法務文書等は、
別経路だが最終到達時点は同じ、ということが普通にあり得るはず。
だからやっぱりGitはソースコード向けにしか出来てない、ということは認識しておくべきだろう。

991:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/06 09:32:57.06 OfQ8ymDc0.net
あと、Gitのドキュメントは全般的によく出来ているが、branchは「線だ!」と言ってるのは不適切だ。
Gitのドキュメントは密結合状態、つまりGitをよく知ってる人向けに書かれているので、
同様に内部実装を見せる形で書くのが正しく、
つまり、「branchは『線』のように見せてますが、実は『点』です!」と言わないと誤解される。俺がそうだが。
これは解像度が統一されてないから起こった問題だ。
一般のマニュアルは疎結合状態、
つまりそのツールについて内部実装なんて全く知らないし知る由もない人向けに書かれるから、
『見た目』線であれば「線」とずっと言い張り、内部実装を曝露してはいけない。
この場合、あくまでユーザーから見たら常に「線」であり、内部がどうであれ「線」としてしか見えないから誤解を生む余地はない。
Gitの場合は内部も見せた上でドキュメントとして外面仕様も説明することになってて、
それが外面仕様なのか内部実装なのか、
またbranchのように外面仕様と内部実装が�


992:ルなってて隠蔽しきれてない場合とか、(--no-ffの有無で観測可能) それは正しく説明しなければならない。 密結合なら、上記の通り、「『線』として見せてますが実は『点』です!」と書くべきだ。 とはいえ全般的にドキュメントはしっかり書かれている。これ自体は素晴らしい。 ただ、そもそも仕様がグダグダ過ぎるし、 或いはユーザーにどこまで見せ、どこからは見せないのか、仕様を管理する感覚がまるでない。 おそらく上層部の連中に仕様管理の経験者がおらず、グダグダになってしまってる。 とはいえ、再度言うが、ドキュメントはよく書いてる方だよ。



993:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/06 09:33:22.07 OfQ8ymDc0.net
ただこれだと、branchを「線」として扱おうとしたら動作が不安定になるわけで、
おそらくfilter-branchが不安定なのはこの辺に起因してる。
そしてドキュメントの何処か(多分showかlog)に、
「これには実はpitfallがあって、マージに遭遇した場合に分岐するから云々」とかいう
(当時の俺にとって)謎の記述が挿入されてたのも納得がいく。
commit履歴を保持してないから確定的動作が出来ないんだよ。
これははっきり言って仕様の欠陥で、commit履歴も完全に保持する仕様だったら自然と回避出来てた。
現仕様では、filter-branchの実装をいくら頑張ったところでどうにもならない。
代わりのfilter-repoも、動作は同様に糞だろうよ。安定して使えるものではないはず。
ここら辺はちょっと惜しいね。Gitが素晴らしいのは、「伽藍とバザール」での
> 9. 賢いデータ構造と間抜けなコードのほうが、その逆よりずっとまし。
を体現してるからであって、つまり根っこがしっかりしてるから上部は雑草でも問題なかったんだが、
この点は根っこが駄目だから、上部(filter-branch)が機能しない。

ここら辺はちゃんと仕様の大切さを理解してる奴が仕切らないと駄目なのだが、
おそらくGitの連中も、仕様を捏ねてる連中は手を動かしてないと見なし、嫌ってるのだろう。
だから仕様を捏ねることすらしてない。
ただ、それは結局は遠回りでしかない。
今のGitだと、filter-branchも、filter-repoも、その次に出てくる何かも、まともに動作するはずがない。
駄目な仕様だと実装をいくら頑張ってもどうにもならない、と知ってる奴が、ちゃんと仕切らないといけないんだけどね。
ただこれは、それを知らない奴にとってはムカつく奴でしかなく、そいつらを排除した結果、Gitは暴走中、というわけだ。
Linusがcommit履歴も大切に考える奴だったら違ってたが、惜しいね。

994:デフォルトの名無しさん
22/11/06 10:57:26.83 FBkt/oHG0.net
長々と無駄な長文と大量投稿でスレを穢すんじゃねー。
単に既存のバージョン管理ツールと、git の考え方の違いが理解できてないだけじゃねーか。
・git はパッチ管理ツール、作業履歴管理ツールじゃない。
・ソフトウェアはパッチとパッチを当てる順番で構成されている。
1000回唱えろ。この思想が気に要らなければそもそも git 使うな。

995:デフォルトの名無しさん
22/11/06 10:59:15.02 OfQ8ymDc0.net
>>943
と思ったが、ffじゃないとhashが違うからウザいな。別物扱いだから、一々確認いるし。
オブジェクトツリーはffの方がいい。
ただこれだとcommit履歴が無く、俺的にはまずいので、別に保存したい。
ソースと混ざるとウザイので、可能なら分離したい。
ドキュメントによるとマルチルートも出来るらしいが、これはどうやってやるんだ?
> Each project must have at least one root. A project can also have multiple roots, though that isn’t common (or necessarily a good idea).

996:デフォルトの名無しさん
22/11/06 1


997:1:04:28.51 ID:OfQ8ymDc0.net



998:デフォルトの名無しさん
22/11/06 11:33:11.11 sj15aRfA0.net
ということにしたいのですね。

999:デフォルトの名無しさん
22/11/06 11:46:16.67 FBkt/oHG0.net
>>949
お前の狭い世間なんて知るか
お前は話題の電動ドリル買ってきて釘打つのに不便ガンガンってやりながら文句言ってるのと同じレベル
そもそもマニュアルもちゃんと読めてないだろ。root と route を間違える英語レベル
背伸びして git 学ぶ前に高校に進学して英語学んだ方が近道だぞ

1000:デフォルトの名無しさん
22/11/06 11:51:22.62 OfQ8ymDc0.net
>>950
いや事実だよ。
Linusは確かにmergeしかしないんだろうけど。

だけどその、mergeするパッチを書く奴は、それを一発で書けたわけがないんだ。
何日もかけて、何回も直して、そこに到達してる。
この過程のサポートがGitにはない。
別branchで作業してもmerge時にhash値が組み込まれるから、
確かに俺がやろうとしてる「日々の進捗」をcommitされると除去出来ずウザイんだろうさ。
しかしパッチのコードは必ずGit-repoをクローンしてから出発するのだから、
Gitにこのサポートが無く、パッチを当てる人はいきなり完成したパッチを書け!勿論でバッグ済みだぞ!みたいな構造なのがおかしい。
すくなくとも、捨てbranch機能があって、そこで日々の作業を終わらせた結果、
mergeするときには本ブランチでその結果がいきなり生えたように見せる機能
(捨てbranchとmergeしても中身の結果だけもらって親にはしない)
みたいな機能が必要なんだよ。
ただまあ、これは今でも手動だと出来た気はするが。
だからまあ、確かにパッチ管理ツールであって、
ソフトウェア開発時のバージョン管理ツールではないんだろうさ。
だけど、今、全世界のGitで、mergeコミットと通常のcommit、どっちが多いか考えれば、自明だろ。
一つのパッチを作るまでにも何回もcommitが必要なのだから。

1001:デフォルトの名無しさん
22/11/06 12:07:06.70 FBkt/oHG0.net
>>952
アホか。共同開発が全く理解できてねーじゃねーか。
お前の試行錯誤の記録を push しようとしてんじゃねーよ。
手元で試行錯誤して実装できたら、それを元に綺麗なパッチに書き直す作業するんだよ。
そして完成した綺麗なパッチ群のみを共有リポジトリに公開するんだよ。

1002:デフォルトの名無しさん
22/11/06 12:19:51.48 OfQ8ymDc0.net
>>948
一応見つけた。 git worktree らしい。
複数のbranchを同時に開く機能で、DBで言うATTACHっぽい。

1003:デフォルトの名無しさん
22/11/06 12:20:57.36 JyiC8cnE0.net
試行錯誤はすべて記録に残すべき
→じゃあテキストエディタで保存するたびに記録するべきっていうのか?
こういう話なので無視すんなよ?w

1004:デフォルトの名無しさん
22/11/06 12:21:44.03 JyiC8cnE0.net
バージョン管理はソースコードの変更履歴を残すのであって
作業履歴を残すものじゃないっていうのが分かってなさすぎ

1005:デフォルトの名無しさん
22/11/06 12:30:26.14 OfQ8ymDc0.net
>>953
それはいいんだけどさ、その肝心のパッチを書く人へのサポートがまるでないだろ。
出発点がgit clone で、その上で作業して、終われば pull request する前提なのにさ。
そしてOSSではなく一般企業等で使ってる奴は、
当たり前だが日々の作業のバックアップや巻き戻し出来るシステムが必要で、そう使ってる。
だから、Gitが難しすぎるというのは、目的外使用だから意味が分かりにくい、というのはあるね。
Indexもマージの時には�


1006:った方が便利なんだろうしさ。(ただのcommitには邪魔でしかない) しかし確かに、Linusに言わせれば、全く問題ないんだろうさ。彼はmergeしかしないしね。 そして他のVCSよりまし、という理由でGitを使う奴は、混乱するんだろうさ。VCSと聞いてきたのだからね。 確かにパッチ管理システムだよGitは。ソースコード生成時のサポートシステムではない。



1007:デフォルトの名無しさん
22/11/06 12:32:16.81 OfQ8ymDc0.net
>>955
> こういう話なので無視すんなよ?w
無視する/しない以前に、何が言いたいのか分からないから反応しようがないんだよ。

1008:デフォルトの名無しさん
22/11/06 12:42:58.45 sj15aRfA0.net
>>957
> それはいいんだけどさ、その肝心のパッチを書く人へのサポートがまるでないだろ。
rebase あるよ。
元のローカルブランチを消さないでおけば記録もぜんぶ残るし。よかったね。

1009:デフォルトの名無しさん
22/11/06 12:43:13.14 FBkt/oHG0.net
>>957
git ほどパッチを書くのに向いてるツールは他にないぞ。
index 無しでどうやってパッチの分割とかするんだよ?

1010:デフォルトの名無しさん
22/11/06 12:53:16.71 OfQ8ymDc0.net
>>960
最初から一つずつ書けば分割の必要ないし、
Index無くてもdiffの出力を絞ってpatchに食わせれば普通に分割出来るだろ。

1011:デフォルトの名無しさん
22/11/06 13:02:38.08 JyiC8cnE0.net
>>958
書いてあるとおりじゃん。
試行錯誤の履歴を全部取れというなら、テキストエディタで保存するごとに
gitでコミットしなければならないはずだ
お前の主張はそういうことなんだから、それをちゃんとやれってこと

1012:デフォルトの名無しさん
22/11/06 13:04:02.78 JyiC8cnE0.net
>>961
コミットがメチャクチャなのに、どうやってdiffとってパッチできると思ってるの?
そのdiffには関係がない修正が大量に入ってるだろ

1013:デフォルトの名無しさん
22/11/06 13:37:22.28 FBkt/oHG0.net
>>961
なんも分かってないことを露呈しているな。
A,B,C,D,Eとコミットした後に Cはc1,c2,c3に分割すべきで、BとEは一つにすべきで、Aは不要だったと気づいたらどうすんの?
こういうのがお手軽にできて綺麗なパッチ群に整理できるのがパッチ管理ツールである git の利点なんだ。
そういうのやったことないだろ?

1014:デフォルトの名無しさん
22/11/06 13:39:49.06 az1H5JFk0.net
>>954
脊髄反射で理解したつもりになって書いてるだろ正解率が著しく低い
git worktreeは一つのリポジトリに追加のワークツリーを用意して、異なるブランチをそれぞれ別のワークツリーにcheckoutできるようにする機能
DBのATTACHとは全然違う
マルチルートは普通に作ったリポジトリをfetchやpushで合成してmerge --allow-unrelated-historiesすればできる
でもこれはかなり特殊な用途に使うもので普段使いするようなものではない

1015:デフォルトの名無しさん (ワッチョイ 617b-8+ss)
22/11/06 13:46:46.96 OfQ8ymDc0.net
>>965
実は今し方ドキュメント読んで、これは違うと書こうとしたところだった。
wor,ktreeはstashの代わりで、同時作業用ではないね。

> マルチルートは普通に作ったリポジトリをfetchやpushで合成して
ああこれは俺の要求とは違うね。

まあ、もう地味に.git/.xxx/に転がそうと思案中。

1016:デフォルトの名無しさん
22/11/06 13:57:15.91 OfQ8ymDc0.net
>>963,964
お前らunixコマンドの使い方知らないだろ。
patch/merge/diff3はgit以前からあるコマンドで、多分初期Gitはそのまま使ってたと思うが。
具体的な使い方は以下。
今、元 fileA に対して、変更後 fileC になってるが、実は中間の fileB が欲しかったとする。このとき、
cp fileA fileB
diff fileA fileC | less -N; // ここで該当行を確認する。例えば10-20行目なら、
diff fileA fileC | sed -n '10,20 p' | patch fileB
これでfileBが得られるんだよ。これ以上色々複雑な時用に diff3 とか merge もある。
だからパッチの分割はすぐ出来るんだよ。

1017:デフォルトの名無しさん
22/11/06 14:05:27.55 az1H5JFk0.net
>>967
そういう作業を必要で


1018:無くすためにgitが生まれた patchの提出をgitの分散リポジトリ上で可能とするためにね 963とか964が行ってるpatchというのは、いわゆるpatchファイルのことではなく、ブランチ上に存在する差分の事 そのpatchを整理するのに index や rebase がある



1019:デフォルトの名無しさん
22/11/06 14:19:49.14 FBkt/oHG0.net
もしかして、もしかすると、git では「パッチ=コミット」っていうことすら理解できてないのだろうか。
まさかそんな人はいないよね。単に言動が変な人なだけだよね。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch