Memo

メモ > 技術 > 開発: Git

Gitの基本
マンガでわかるGitの記事一覧 | リクナビNEXTジャーナル https://next.rikunabi.com/journal/tag/webdesign-manga/ 公式ドキュメント https://git-scm.com/book/ja/v1/ 逆引きGit http://www.backlog.jp/git-guide/reference/ Git入門(SourceTree の使い方) - セルティスラボ https://celtislab.net/archives/20140527/git-sourcetree/ SourceTree(3.0.15)をインストールしてみた - Qiita https://qiita.com/tetsu831018/items/bb6ecf15ca5f67e5879a 【永久保存版】Gitのあらゆるトラブルが解決する神ノウハウ集を翻訳した - LABOT 機械学習ブログ https://blog.labot.jp/entry/2019/07/01/183204 入門書を終えた人に捧げる、社会人のためのGit中級編 - Qiita https://qiita.com/yamamoto7/items/fe15a1e7e360b4015fae 第1話 リポジトリを作ってコミットしてみよう【連載】マンガでわかるGit 〜コマンド編〜 - itstaffing エンジニアスタイル https://www.r-staffing.co.jp/engineer/entry/20190621_1 Git はなぜ空のディレクトリを無視するのか? - Qiita https://qiita.com/POPOPON/items/964d0904e32cb38c9303 たぶんもう怖くないGit ~Git内部の仕組み~ - Qiita https://qiita.com/marchin_1989/items/2ec01553e907f3a9e6bb コミット履歴が " きれい " なPRはすごく助かる。ありがたい。好き。 #初心者 - Qiita https://qiita.com/_mi/items/f477e95a864474187e3d 【図解解説】これ1本でGitをマスターできるチュートリアル!【完全版】 #GitHub - Qiita https://qiita.com/Sicut_study/items/0318cc136c189b179b7f
基本メモ
Git初心者への説明用メモ 以下から同じ内容をスライドショーなどで見ることができる Gitの基本 - Qiita https://qiita.com/refirio/items/938ebf399029d9c62b3f ■バージョン管理システムとは ・作業内容を記録していくことができる ・過去の作業内容を簡単に把握できたり、特定の日時の状態に戻したりができる フォルダを丸ごとコピーし、日付を付けて置いておく…というのもバージョン管理の一つ ただしその方法だと、細かな変更内容を把握するのは難しい Gitでバージョン管理することにより、いつでも過去の状態を参照できるようになる ■Gitの特徴 以下の特徴を持つバージョン管理システム ・分散型 ... 一度サーバからソースコードを取得すればオフラインで作業でき、任意のタイミングでサーバに反映できる ・高速 ... SVNなど他のバージョン管理システムよりも、高速に動作する ・賢いマージ ... 他のバージョン管理システムよりも、作業内容を賢くまとめてくれる ■リポジトリ ソースコードは「リポジトリ」と呼ばれる場所で管理する リポジトリは基本的に、ホスティングサービス上で作成するといい ■ホスティングサービス リポジトリを管理してくれる場所 一人で作業する場合は無くてもいいが、バックアップのためにも使用することを推奨。複数人で作業する場合は必須 有名どころだと、以下のようなものがある ・GitHub 一番メジャーだと思われる。オープンソースで公開する場合に最適。非公開リポジトリを作りたい場合は有料 …だったが、2020年4月15日現在、非公開リポジトリもチーム利用も無料になった https://github.com/ https://github.com/pricing https://www.publickey1.jp/blog/20/githubactionscicd.html ・Bitbucket 無料で非公開リポジトリを作れる。1リポジトリに5ユーザ以上参加させたい場合は有料 https://bitbucket.org/ https://bitbucket.org/product/pricing ■Git操作 ・コマンドで操作する ・Sourcetreeなどグラフィカルなソフトウェアで操作する の2つがある。WindowsやMacで使うなら、グラフィカルなソフトウェアを使うといい ■クローン リポジトリの内容をローカルにコピーすること Gitではサーバ上だけでなくローカルにもリポジトリの複製を持ち、定期的に同期させる ■コミットとプッシュとプル ・コミット ... ローカルのリポジトリに作業を記録する ・プッシュ ... コミット内容をサーバのリポジトリに記録する ・プル ... サーバのリポジトリの内容をローカルのリポジトリに反映する(他の人の変更内容を取り込む) ■ファイルの状態 ・作業ディレクトリ ... 作業中のファイル ・ステージングエリア ... 次にコミットされるファイル ・Gitディレクトリ ... コミットされたファイル の3つがある 作業ディレクトリにあるファイルをステージングエリアに移動させ、 それに対してコメントとともにGitディレクトリに移動させる(=コミット) ステージングエリアがあることにより、一部のファイルのみコミット対象にすることができる ここまでできれば、最低限だがGitを使うことができる ■ブランチとマージ ブランチを作れば、いくつもの作業を同時に進めることができる 作業が完了したら、もとの場所にマージ(統合)することができる 複数人で作業するときに、特に力を発揮する ■コンフリクト マージの際、作業内容が競合したことをいう ・マージ元の作業が正しいとみなす('相手の変更'を使って解決) ・マージ先の作業が正しいとみなす('自分の変更'を使って解決) ・手動で調整し、コミットしなおす(解決済みにする) という対応がある Sourcetreeの場合、競合しているファイルを右クリックし、「競合を解決」から解決方法を選択できる なお、競合している箇所は以下のように書き換えられる 手動で調整する場合、「<<<<<<< HEAD」などの情報は不要なので削除する
<<<<<<< HEAD <p>5月6日開催</p> ======= <p>5月5日開催</p> >>>>>>> update-news
■ブランチモデル gitでは自由にブランチを作成できるが、何のルールも無く作成すると混乱のもとになる 有名どころのルールとして以下がある ・GitHub Flow ... 小規模開発向け mainブランチから開発用ブランチを作成し、作業が完了したらmainブランチに戻す ・Git Flow ... 中規模〜大規模開発向け main、develop、feature、release、hotfix という5種類のブランチを使い分ける ・GitLab Flow ... 上記で対応が難しい場合にと考え出されたもの mainブランチから開発用ブランチを作成し、作業が完了したらmainブランチに戻す またproductionやstagingなど、環境に応じたブランチを持つ mainブランチは本番環境とイコールではなく、開発の中心ブランチとなる ・Trunk Based Development ... 開発者はビルドが通る状態を保ちながら、小さな修正をそのままmainブランチにコミットする 大きな機能開発の場合、機能のON/OFFをフラグで管理する これにより、大規模なマージ地獄から抜けられる 自動テストが整備されていることが前提にはなる 【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう:こっそり始めるGit/GitHub超入門(終) - @IT https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html git flowとgithub flowとは?その違いは? - Qiita https://qiita.com/mint__/items/bfc58589b5b1e0a1856a Gitlab-flowの説明 - Qiita https://qiita.com/tlta-bkhn/items/f2950aaf00bfb6a8c30d GitLab flowから学ぶワークフローの実践 | POSTD https://postd.cc/gitlab-flow/ アプリ開発にはGitlab flowが合うと思います - Shoichi Matsuda's diary https://shoma2da.hatenablog.com/entry/2015/11/04/233534 Git の最新アップデートから考える開発手法の潮流 - Speaker Deck https://speakerdeck.com/yuukiyo/trends-in-development-methodology-from-the-latest-git-updates DevOps 技術: トランクベース開発 | DevOps の能力 | Google Cloud https://cloud.google.com/architecture/devops/devops-tech-trunk-based-development?hl=ja もうリリースは怖くない ― 大きな変更を安全に本番適用するTips - Cybozu Inside Out | サイボウズエンジニアのブログ https://blog.cybozu.io/entry/2021/07/28/080000 これらのブランチモデルをベースに、独自のブランチモデルで運用しているところもある ■コミットの粒度とメッセージ あとで見直しやすいように、ということを意識してコミットするといい 「コミットの際に課題番号も書く」など、独自のルールが設けられることも多い ■.gitignore バージョン管理対象外にするファイルを指定できる Thumbs.db や .DS_Store は管理対象外にしておく その他環境依存の設定ファイルや、巨大すぎる動画ファイルやライブラリも省いておくと管理しやすくなる ■課題管理・Wiki 大抵のホスティングサービスには用意されている うまく使うと便利。この部分は、BacklogやRedmineなど他のサービスやツールを使うこともある
補足メモ
■ブランチ操作 理解を深めるために、Gitに慣れてきたら知っておくといい master ... 最初にコミットすると作成される、デフォルトのブランチ名。 「master ブランチは本番環境(成果物)と同一」という運用をされることが多い なお「master」という名前は差別用語になりうるので、「main」という名前にしようという動きがあり、実際GitHubのデフォルトブランチは「main」に変更された origin/xxx ... リモートサーバにある内容をそのまま保持しているブランチ。読み取り専用 origin/HEAD ... リモートサーバのデフォルトブランチ。基本的に origin/master と同一 fetch ... 例えば master に対して操作した場合、origin/master の内容をリモートサーバの最新状態に更新する Sourcetreeの場合、初期設定では定期的に自動で fetch が行われる merge ... ブランチを統合する pull ... 例えば master に対して操作した場合、origin/master の内容をリモートサーバの最新状態に更新する さらに origin/master の内容を master に merge する fetch して内容に問題がなければ pull する…とすれば慎重な運用になる ■コミットルール 細かなルールは各々や会社によって異なるが、一例として以下のようにするといい ・GitHubやBitbacket上に課題を作成して、その課題番号をもとにブランチの作成やコミットを行う ・ブランチ名の先頭には課題番号を付け、それに続いて課題内容を把握できる英数字を付ける ・コミットのコメントの先頭には、「#」に続けて課題番号を付ける 具体的には「PostgreSQLでマイグレーションを実行できない #104」という課題を作ったとして、 ブランチは develop から feature/104-pgsql_migrate_error を作成して作業し、 コミットは「#104 PostgreSQLでマイグレーションを実行できない不具合を修正」のようにコメントする このようにすることで、GitHub上ではコミットのコメントの「#104」から該当の課題に遷移できるようになり、管理しやすくなる 課題の管理にBacklogなど外部ツールを使うこともあるが、その場合は一例として以下のようにするといい ・Backlog上に課題を作成して、その課題キーをもとにブランチの作成やコミットを行う ・ブランチ名の先頭には課題キーを付け、それに続いて課題内容を把握できる英数字を付ける ・コミットのコメントの先頭には、課題キーを付ける 具体的には「DEV-104 PostgreSQLでマイグレーションを実行できない」という課題を作ったとして、 ブランチは develop から feature/DEV-104-pgsql_migrate_error を作成して作業し、 コミットは「[DEV-104] PostgreSQLでマイグレーションを実行できない不具合を修正」のようにコメントする (ブランチ名やコミットに「DEV-」という接頭語を含めるか否かは、検討の余地がある)
Sourcetreeでgitを操作する(基本)
BitbucketとBitbucketを使う場合の実例を記載 ■Bitbucketでリポジトリを作成 ※本格的に使うなら、リポジトリを作る前に「チーム」や「プロジェクト」を作るといい Bitbucketにアクセスしてログイン 左の「+」ボタンを押してから「リポジトリ」を選択 リポジトリ名: 英数字で入力。URLに使われるので、案件を判別できるものを英数字で入力するといい アクセスレベル: リポジトリに誰でもアクセスできるようにするか否か。仕事用なら原則として非公開にする READMEを含めますか?: 「No」のままでいい。「Yes」にすると README.md というテキストファイルがリポジトリ内に自動作成され、リポジトリの説明を書くことができる バージョン管理システム: 「Git」のままでいい 入力したら「リポジトリの作成」をクリック リポジトリが作成され、「バケツに何かを入れましょう」という画面になる のようにURLが表示されているが、SourcetreeにCLONEするときなどはこれを使用する ■SourcetreeでCLONE 上部にある「+」をクリック メニューから「CLONE」をクリック 元のパス/URL: 上記URLを入力 保存先のパス: 保存したい場所を入力。「元のパス/URL」を入力すると自動入力されるが、必要に応じて調整する。内容はカラにしておく 名前: 案件を判別できる名前。Sourcetreeでの表示に使われるだけなので日本語可 「クローン」ボタンを押すとクローンされる 実際にファイルを配置して、コミットやプッシュを試す クローン時に認証できない場合、先に「ツール → オプション → 認証」でアカウントを追加すると解決することがある 以前にGitHubのアカウントを追加した際、 1. ホスティングサービスを「GitHub」にする 2. 認証が「OAuth」になっていることを確認して「OAuthトークンを再読み込み」をクリックする 3. 「認証に成功」となれば「OK」をクリックする という手順で追加できた 追加後、CLONEやPULLができることを確認する ■リポジトリに他の作業者を追加 Bitbucketにアクセスしてログイン 対象のリポジトリにアクセスして「設定 → ユーザーとグループのアクセス権」を選択 Bitbucketのユーザ名を入力して、「読み取り」を「書き込み」に変更して(プッシュを受け付ける場合)、「追加」をクリックする 過去に一度もやりとりしたことの無いユーザは候補に表示されないので、その場合はそのユーザのメールアドレスを入力する 対象のメールアドレスに、リポジトリへの招待メールが送信されるので確認する
Sourcetreeでgitを操作する(応用)
Sourcetreeを例に、特別な操作の実例を記載 ■過去のコミットに戻る 戻りたいコミットをダブルクリックする 「作業コピー切り替えの確認」が表示されるので「OK」をクリックする(過去の状態に戻る) ■過去のコミットから作業を続ける 「過去のコミットに戻る」の操作で過去の状態に戻る その状態でツールバーの「ブランチ」をクリックし、作業ブランチを作成する 作業を行いコミットする ■過去のコミットを無かったことにする(プッシュしていない場合のみ有効) 戻りたいコミットを右クリックし、「現在のブランチをこのコミットまでリセット」をクリックする モードは以下のとおり Soft ... 変更したファイルはIndexにステージされた状態でコミットがリセットされる Mixied ... 変更したファイルはIndexにステージされない状態でコミットがリセットされる Hard ... 作業が完全に無かった状態でコミットがリセットされる ■過去のコミットを打ち消す(プッシュしている場合、過去のコミットと反対の内容のコミットを作成する) 打ち消したいコミットを右クリックし、「このコミットを打ち消し」をクリックする 確認が表示されるので「Yes」をクリックする ■masterにマージしてプッシュした内容を無かったことにする(推奨手順) masterブランチの名前を master_20180721 などに変更する master_20180721 ブランチの戻りたいコミットをダブルクリックする その状態でツールバーの「ブランチ」をクリックし、masterブランチを作成する 以下のコマンドでmasterブランチを強制的にプッシュする
git push -f origin HEAD:master
■masterにマージしてプッシュした内容を無かったことにする(非推奨手順) ※作業が別ブランチにバックアップされず、完全に削除される 特別な理由が無ければ「masterにマージしてプッシュした内容を無かったことにする(推奨手順)」の手順を推奨 「過去のコミットを無かったことにする」の手順で、Hardでリセットする 以下のコマンドで強制的にプッシュする
git push -f origin HEAD:master
■masterにマージしてプッシュした内容を無かったことにした内容を他の環境に取り込む masterブランチの名前を master_20180721 などに変更する 「リモート」にあるmasterブランチにチェックアウトする もしくは以下のコマンドで、サーバ上の状態と強制的に一致させる
git reset --hard origin/master
■直近のコミットメッセージを修正する コミット画面を開く 「オプションのコミット」を「最後のコミットを上書き」を選択する 確認が表示されるので「OK」をクリックする ■未コミットのファイルを作業を一時退避する ツールバーから「スタッシュ」を選択する 任意の名前を付けて「OK」をクリックすると、サイドバーの「スタッシュ」に変更内容が格納される 元に戻したいときは、スタッシュを右クリックして「適用」を行う 新規のファイルはスタッシュの対象外になる 対象に含めたい場合、コマンドラインでは「-u」オプションを付ける Sourcetreeの場合、いったんIndexにステージした状態でスタッシュを実行する git stash で、作業中の変更をいったん横に退けておく | Tips Note by TAM https://www.tam-tam.co.jp/tipsnote/program/post10600.html ■未コミットのファイルを作業を一時退避する(コマンド) 以下のコマンドでスタッシュを実行できる $ git stash 以下のようにすれば、スタッシュの内容を確認できる $ git stash list $ git stash show 0 … 番号を指定して内容を確認 $ git stash show 0 -p … 差分を確認 以下のようにすれば、スタッシュの内容を適用できる $ git stash apply 0 【Git】stashコマンドのまとめと使い方 〜変更差分の一時退避〜 #初心者 - Qiita https://qiita.com/nakaji0210/items/330f6dcb361da074c2c0 ■別のブランチから特定時点のコミットを取り込みたい 作業ブランチでコミットA, B, C と進めた場合、通常はコミットCまで進めたものを大元のブランチにマージする が、コミットAやBの時点のものをマージできるか ブランチを右クリックしてマージ…ではなく、任意のコミットを右クリックしてマージすることで対応できる ■別のブランチから特定のコミットを取り込みたい コミットを積み重ねたいブランチにチェックアウトしておく 取り込みたいコミットを右クリックし、「チェリーピック」をクリックする 確認が表示されるので「Yes」をクリックすると、即座にコミットが実行される ■コミットに目印を付ける タグを設定したいコミットを右クリックし、「タグ」をクリックする 任意の名前を付けて「タグを追加」をクリックすると、サイドバーの「タグ」にタグが表示される タグをクリックすると、その時点のコミットが表示される 「すべてのタグをプッシュ」にチェックを入れた状態でプッシュすると、リモートのリポジトリにもタグが反映される GitHubの場合、各画面でブランチを選択する際にタグが表示される 「release」から、その時点の圧縮ファイルをダウンロードすることもできる Bitbucketの場合、各画面でブランチを選択する際にタグが表示される 「ダウンロード」から、その時点の圧縮ファイルをダウンロードすることもできる ■グローバル無視リスト ※以下の手順で反映できると思われるが、反映されなかった すでにGit管理されているファイルだからか C:\Users\xxx\.gitignore_global を作成して以下のように無視したいファイルを記述
app/Plugin/VeriTrans4G/Resource/tgMdkPHP/tgMdk/3GPSMDK.properties app/Plugin/VeriTrans4G/Resource/tgMdkPHP/tgMdk/log4php.properties
Sourcetreeでツールバーから「オプション → Git → グローバル無視リスト」で上記ファイルを選択 「OK」をクリック ■改行コードの対応 Windows環境のSourcetreeで普通にCLONEすると、改行コードはWindows用のものに変換される ただしDocker環境でComposerを使う場合など、Linuxの改行コードのままでないと正しく処理できないことがある 以下を参考に、Linuxの改行コードでファイルを扱う方法を記載する Git for Windowsでautocrlfの設定を間違えちゃった時の対応 - Qiita https://qiita.com/e_tyubo/items/ac555ab9d278ac366679 WindowsでGitを使うときは改行コードの自動変換を無効にしてほしい | アズシエルブログ https://www.azciel.co.jp/blog/2018/08/24/windows-git-autocrlf/ Homestead環境でPHPUnitを実行しようとすると、`/usr/bin/env: ‘sh\r’: No such file or directory`というエラーが出た - Qiita https://qiita.com/taro-hida/items/057ebc4ecb27ba376162 Gitの設定は、リポジトリ固有の設定があればその内容が、無ければグローバル設定が、それも無ければシステム設定が使用される システム設定 C:/Users/Refirio/AppData/Local/Atlassian/SourceTree/git_local/etc/gitconfig グローバル設定 C:/Users/Refirio/.gitconfig リポジトリ設定(リポジトリが C:\Users\Refirio\Docker\test の場合) C:\Users\Refirio\Docker\test\html\.git\config 以下のようにすると、現状の改行コード設定と、どこのファイルで設定されているかを確認できる (「core.autocrlf」が改行コード変換の設定)
$ git config --show-origin core.autocrlf file:C:/Users/Refirio/AppData/Local/Atlassian/SourceTree/git_local/etc/gitconfig true
上記の gitconfig ファイルを確認すると、以下のようになっている
[core] symlinks = false autocrlf = true fscache = true
確かに true となっている グローバル設定が存在する場合、以下のように表示される
$ git config --show-origin core.autocrlf file:C:/Users/Refirio/.gitconfig true
リポジトリ固有の設定がある場合、以下のように表示される
$ git config --show-origin core.autocrlf file:.git/config false
以下のようにすると、設定を変更できる
$ git config --show-origin core.autocrlf file:C:/Users/Refirio/.gitconfig true $ git config --global core.autocrlf false $ git config --show-origin core.autocrlf file:C:/Users/Refirio/.gitconfig false
false に変わることが確認できる。このとき、 C:\Users\Refirio\.gitconfig のファイルも書き換わっている また、以下などのファイルを直接編集して設定を変更することもできる C:\Users\Refirio\Docker\test\html\.git\config
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true autocrlf = false … 追加
以下で確認
$ git config --show-origin core.autocrlf file:.git/config false
ファイルによる指定となり、false になったことが確認できた ただし、これだと初回CLONEのときに反映されないことになる 一例だが、以下の手順で対応してみる C:\Users\Refirio\.gitconfig で以下のように変更(改行コードを自動変換しない)
[core] excludesfile = autocrlf = false
以下で確認
$ git config --show-origin core.autocrlf file:C:/Users/Refirio/.gitconfig false
この false の状態でCLONEする つまり、Linuxの改行コードでファイルが配置される CLONEが完了したら、いったん設定を確認する
$ cd /c/Users/Refirio/Docker/test/html $ git config --show-origin core.autocrlf
確認できたら、 C:\Users\Refirio\.gitconfig の autocrlf 設定はもとに戻して C:\Users\Refirio\Docker\test\html\.git\config に autocrlf 設定を追加する これで、特定リポジトリでのみ改行コードの自動変換を無効にできる もちろん、すべてのプロジェクトで常に改行コードの自動変換を無効にするなら、大元の設定で自動変換を無効にしておくだけでいい ■複数のアカウントで操作する GitHubとBitbucketのアカウントを同時に使うのは問題ないが、 GitHubのアカウントAとGitHubのアカウントBを使い分けようと思うと一筋縄ではいかないので注意 以下は未検証だが、参考になりそうなメモ sourcetreeで複数のgitアカウント管理 - Qiita https://qiita.com/A-Kira/items/0f5334919e330a95f198 GitHubを複数のアカウントで利用するためのメモ - Qiita https://qiita.com/BlueEventHorizon/items/f9d81e3659ebce9e1ffc GitHub+SourceTreeで複数アカウント設定 - myMemoBlog by 256hax https://blog.tanebox.com/archives/6/ ■その他 SourceTreeの使い方 - 初心者が習得すべき基本操作(diff, stash, tag, revert, cherry-pick) - ICS MEDIA https://ics.media/entry/1365/ 以下について解説されている 1. diff - 差分を見る 2. stash - 一時的に作業状態を保管しておく 3. tag - コミットにタグをつける 4. cherry-pick - 別ブランチのコミットを取得する 5. revert - コミットした内容を打ち消すコミットを作成する
VSCodeでgitを操作する
Git入門(VSCode Git の使い方) - セルティスラボ https://celtislab.net/archives/20180418/git-vscode/
コマンドでgitを操作する
バージョンを確認する
git --version
クローン
git clone git@bitbucket.org:xxx/yyy.git /var/www/html
現在のブランチ名を表示
git branch
もしくは
git branch --contains
もしくは
git branch --contains=HEAD
もしくは以下なら、他のブランチは除外して表示される
git rev-parse --abbrev-ref HEAD
ブランチを切り替え(切り替えられなければ、先にプルを行う)
git checkout develop git checkout feature/zzz
上記で切り替えられなければ、以下のようにする(developブランチに切り替える場合)
git checkout -b develop origin/develop
git - fetchしたremoteブランチのトラッキングブランチがcheckout時に自動で生成されない - スタック・オーバーフロー https://ja.stackoverflow.com/questions/18047/fetch%E3%81%97%E3%81%9Fremote%E3%83%96%E3%83%A9%E3%83%B... プル
git pull
他人の作業ブランチを取り込み
git pull git checkout feature/zzz
プッシュ(初回)
git push --set-upstream origin feature/zzz
プッシュ(2回目以降)
git push
更新したファイルを表示
git status -bs
履歴を表示
git log git log -5 … コミット履歴を最近の5件のみ表示 git log -p -3 … コミットの詳細も表示するには「-p」を指定する git log -- app/views/admin/home.php … 特定ファイルに関するコミット履歴を表示 git log -5 -- app/views/admin/home.php git log -p -3 -- app/views/admin/home.php git log --oneline --graph --decorate -10 … グラフを表示
プログラマはGit、デザイナーはFTPでアップロードする場合の例 http://qiita.com/irxground/items/80dc6432e7d9d2b8b2a9 git 管理をやめる https://qiita.com/b4b4r07/items/cac4abd9ae66537e2833 既存のディレクトリに git clone するには http://neos21.hatenablog.com/entry/2016/02/07/000000 既存ディレクトリにGitリモートリポジトリを適用 https://qiita.com/llhrkll/items/9b252348898d14ff90bf ※コミットがあるのでBitbucketでは無理かも SourceTreeの使い方 | 初心者が習得するべき基本操作(diff, stash, tag, revert, cherry-pick) - ICS MEDIA https://ics.media/entry/1365 シェルスクリプトで現在のブランチ名を取得する(git rev-parse) - ペンギン村 Tech Blog http://blog.penginmura.tech/entry/2018/01/12/093400 「git pull」した時に出る、commitエディタを表示しないようにする : 元うなぎ屋 http://snickerjp.blogspot.com/2015/04/git-pull-no-edit.html バージョン管理ツールのGitでよく使用するコマンドを1ページにまとめた便利なチートシート -GitSheet | コリス https://coliss.com/articles/build-websites/operation/work/frequently-used-commands-in-git.html Gitでやりたいこと、ここで見つかる - Qiita https://qiita.com/shimotaroo/items/b73d896ace10894fd290 現場で使用していたGitコマンド集 - Qiita https://qiita.com/osakanaaaa/items/544343005b7ffe2a3929
コマンドで作業&コミット&プッシュする
■作業ブランチを作成 現在のブランチを確認
$ git branch * develop master
作業ブランチとして feature/test を作成
$ git branch feature/test
ブランチを切り替え
$ git checkout feature/test Switched to branch 'feature/test'
ブランチの切り替えを確認
$ git branch develop * feature/test master
■作業内容をコミット 作業内容の差分を確認
$ git status -bs ## feature/test M index.html
作業内容の差分の詳細を確認
$ git diff -- index.html diff --git a/index.html b/index.html index 795b8df..68ba275 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ </head> <body> <h1>Test</h1> - <p>テストページです。</p> + <p>これはテストページです。</p> <ul> <li><a href="page1.html">テストページ1</a></li> <li><a href="page2.html">テストページ2</a></li> $ git status On branch feature/test Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.html
作業内容をステージに追加
$ git add index.html
ステージに追加した内容を取り消す場合
$ git checkout HEAD -- index.html
もしくは以下
$ git reset index.html $ git status On branch feature/test Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: index.html $ git status -bs ## feature/test M index.html $ git commit -m "文言を修正" [feature/test 6049160] 文言を修正 1 file changed, 1 insertion(+), 1 deletion(-) $ git log --oneline --graph --decorate -5 * 6049160 (HEAD -> feature/test) 文言を修正 * a920e34 (origin/master, origin/develop, origin/HEAD, master, develop) 文言を修正 * 4a16324 (tag: v1.0, tag: title) Merge branch 'develop' |\ | * c27017c Merge branch 'title' into develop | |\ | | * dbd4095 addressを追加
■作業内容をコミット(参考) ステージに追加したファイルが複数の場合、以下のように表示される
$ git status On branch feature/test Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: page1.html modified: page2.html Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: page3.html $ git status -bs ## feature/test M page1.html M page2.html M page3.html
■作業内容をプッシュ
$ git push origin feature/test … ユーザ名とパスワードを求められる Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 12 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 317 bytes | 317.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (2/2), completed with 2 local objects. remote: remote: Create a pull request for 'feature/test' on GitHub by visiting: remote: https://github.com/refirio/test/pull/new/feature/test remote: To https://github.com/refirio/test.git * [new branch] feature/test -> feature/test
■作業内容をマージしてプッシュ
$ git checkout develop Switched to branch 'develop' Your branch is up to date with 'origin/develop'. $ git merge feature/test Updating a920e34..6049160 Fast-forward index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) $ git push origin develop Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/refirio/test.git a920e34..6049160 develop -> develop
コマンドで差分を取得する
■ブランチの差分 ※必要に応じて「git status」も使用する 「git status」については後述している ブランチの差分を比較(詳細に表示される)
$ git diff master..develop
ブランチの差分を比較(ファイルごとの変更量のみ表示される)
$ git diff master..develop --stat
ブランチの差分を比較(ファイルごとの変更有無のみ表示される)
$ git diff master..develop --name-status
ブランチの差分コミットを比較
$ git log master..develop --no-merges
コミットの差分を比較
$ git diff ecd33874941c4d80ae8e292d73823779343ae3d7..e98941613496190c55e5ab56d8bab2f22e49a8c2 --stat $ git diff ecd33874941c4d80ae8e292d73823779343ae3d7..e98941613496190c55e5ab56d8bab2f22e49a8c2 --name-status $ git diff ecd33874941c4d80ae8e292d73823779343ae3d7..e98941613496190c55e5ab56d8bab2f22e49a8c2 --no-merges
Gitで差分ファイルを抽出+zipファイル化する方法 | 株式会社グランフェアズ https://www.granfairs.com/blog/staff/git-archivediff 忘れやすい人のための git diff チートシート - Qiita https://qiita.com/shibukk/items/8c9362a5bd399b9c56be [Git]ブランチ間の差分をコミット単位で知る・見る - Qiita https://qiita.com/ikenji/items/fecd39966bbf463da3f4 ※上記のように「..」とピリオドを2つ続けて指定する ピリオドが無くても表示されるが、結果に影響しているようなので詳細は要確認 以下が参考になりそう git diffコマンドで比較する時のダブルドット(..)とトリプルドット(...)の違いとは? | Yakst https://yakst.com/ja/posts/4116 ■ファイルの差分 「git diff」だと新規に作成されたファイルは差分扱いされない 「git status」でも確認しておくと無難 作業の状態を確認(ブランチ名を表示)
$ git status -bs
作業の状態を確認(ブランチ名を表示しない)
$ git status --short
差分のあるファイルを確認
$ git diff --name-only
差分の詳細を確認
$ git diff -- app/view/list.php
コマンドで操作を取り消す
※取り消しは「Sourcetreeでgitを操作する(応用)」の内容も参照 PULL(デプロイ)時に競合が発生した場合、list.twig の変更のみ取り消す
git diff --name-only … 差分のあるファイルを確認 git diff -- app/view/list.php … 差分の詳細を確認 git checkout HEAD -- app/view/list.php … ファイルを指定して変更を取り消し git diff --name-only … 差分が無くなったことを確認
直前のコミットを取り消し(作業内容は残る)
git reset --soft HEAD^
直前のコミットを取り消し(作業内容も消える)
git reset --hard HEAD^
コミット後の作業をすべて取り消し
git reset --hard HEAD
指定した時点の履歴に戻る
git log git reset --hard xxxxxxx
履歴を元の状態に戻す
git reset --hard ORIG_HEAD
デプロイ済みのファイルを現在のブランチに強制一致
git checkout .
デプロイ済みのファイルをmasterに強制一致
git fetch origin git reset --hard origin/master
デプロイ済みのファイルをdevelopに強制一致
git fetch origin git reset --hard origin/develop
強制的にチェックアウト
git checkout --force <ブランチ名>
プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)
git log --oneline git reset --hard xxxxxxx git log --oneline git push -f ... 強制プッシュ。ユーザ名とパスワードを入力する
取り消した内容を他の環境に反映させる場合、 「Sourcetreeでgitを操作する」の「masterにマージしてプッシュした内容を無かったことにした内容を他の環境に取り込む」を参照 コミットのコメントは、直前の内容のみ編集できる Sourcetreeのコミット画面で「オプションのコミット」を「最後のコミットを上書き(Amend)」にし、コメントを修正してコミットする Gitでやらかした時に使える19個の奥義 - Qiita https://qiita.com/muran001/items/dea2bbbaea1260098051 gitでmasterを過去のある位置に戻すには - uehatsu's tech blog https://uehatsu.info/tech/archives/2015/03/rewind-the-master-on-git.html なおリベースを使用すれば、一応は過去のコミットのコメントを編集できる ただし強制プッシュが必要でリスクがあるので、自分1人の個人プロジェクト以外では使わない方が無難だと思われる また個人プロジェクトであっても、コメントを編集するとコミット日時が編集時点のものになってしまうみたい 後から作業履歴を振り返るときに問題があるので、やはり過去のコミットは原則編集しない方が良さそう Gitコミットメッセージ間違えた時、SourceTreeでの対処法 | 株式会社 エヴォワークス -EVOWORX- https://www.evoworx.co.jp/blog/editing-commit-messages-with-sourcetree/ git pushを取り消す http://tweeeety.hateblo.jp/entry/2015/06/10/215753 git reset --hard で指定した時点の履歴に戻る方法 http://blog.roundrop.jp/show/37 git log --oneline のお供に --no-merges http://qiita.com/hattorix@github/items/f18b172aafe1340d87f6 困った時の逆引きGitメモ http://myenigma.hatenablog.com/entry/2016/07/09/190058 gitでリモートのブランチにローカルを強制一致させたい時 http://qiita.com/ms2sato/items/72b48c1b1923beb1e186 GitでリモートにPushした内容を取り消したい!! http://grandbig.github.io/blog/2016/07/16/git-reset/ Git で コミットを無かったことにする方法 (git revert の使い方) http://akiyoko.hatenablog.jp/entry/2014/08/21/220255 git revertでmerge commitを取り消す http://qiita.com/shizuma/items/313ed581e071f53a4d2e 【派閥別】Gitのコミットを間違えたときの対処法まとめ http://freak-da.hatenablog.com/entry/20111105/p1 gitでいろいろ取り消したい - Qiita https://qiita.com/tani-shi/items/3419600447292abf6c79 Gitで過去のバージョンに戻す(チェックアウト) - JavaScript勉強会 http://jsstudy.hatenablog.com/entry/Checkout-with-Git SourceTreeでコミットを取り消す | cly7796.net http://cly7796.net/wp/other/cancel-the-commit-sourcetree/ 「git checkout .」と「git reset」の違いは以下が参考になる 基本的に「git checkout .」で良いかも Git - リセットコマンド詳説 https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E... Git強制チェックアウト - Qiita https://qiita.com/ryotaro76/items/ca4c504e290d088aaa4c 以下は未検証だが参考になるかも githubに間違って機密データを上げてしまった時の対処 - Qiita https://qiita.com/dynamonda/items/fa99d141c44098890be3 ■マージの取り消しについて考察 「Sourcetreeでgitを操作する(応用)」の「masterにマージしてプッシュした内容を無かったことにする(推奨手順)」を確認する 以下はそれとは別に色々と調べた内容 ■マージの取り消し(プッシュはしていない)について考察 プッシュしていなければ、以下でマージを取り消せる 間違えてマージした直後にhardの方を実行すれば良さそう 直前のコミットを取り消し(作業内容は残る)
git reset --soft HEAD^
直前のコミットを取り消し(作業内容も消える)
git reset --hard HEAD^
GUIで操作するなら、戻りたいコミットを右クリックして「現在のブランチをこのコミットまでリセット」で良さそう Hardにすればマージ内容を取り消せる なお、そのままプッシュすればリモートリポジトリの内容も巻き戻せるかもしれない とはいえ、それは 「プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)」 を実行しているのと同じのはず リモートリポジトリも含めて確認してみたい 引き続き、間違えてマージしてプッシュもしたときの対応を検証 ■マージの取り消し(プッシュもした)について考察 間違えてマージしてプッシュもしたときの対応を検証したときのメモ git merge の取り消し方法。reset と revert コマンドについて。 | WWWクリエイターズ https://www-creators.com/archives/2111 【git】マージしたけどやっぱりやめたい時のやり方4種類 - Qiita https://qiita.com/chihiro/items/5dd671aa6f1c332986a7 revertでマージの取り消しはできるものの、後からの再マージが無視されるなど色々問題がある gitでまだマージしたくない変更を間違ってmasterにマージしてしまった時の対処 - @satomikko94.b https://satomikko94.hatenablog.com/entry/2014/06/30/235603 revertのrevert(取り消しの取り消し)をすれば打ち消した内容を復元できるが、履歴も含めて管理がややこしそう 結論として「間違えてdevelopをmasterにマージしてプッシュもしてその後作業もしてしまった」ような場合は取り消しは難しそう 特定ブランチへのマージを禁止する、などで対応すべきか マンガでわかるGit 10話「masterブランチを守れ!〜危険な強制プッシュ〜」 | リクナビNEXTジャーナル https://next.rikunabi.com/journal/20170516_t12_iq/ 上記のとおり一応できるが、「featureからdevelopへのマージを一定期間だけ禁止したい」のような場合には対応が難しい 以下、色々と検証した内容のメモ 「常にこういう操作で対応できる」というものは無さそう 前提: develop から feature/test を作って作業した まだマージすべきではなかったが、feature/test を develop にマージしてプッシュもしてしまった これを取り消せるか 対処法1: developブランチに切り替えておく マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている 本来マージすべきタイミングになってから feature/test を develop にマージしても何も起きない なぜなら「マージした」という履歴が残っているから つまり完全な取り消しができているわけでは無い 対処法2: developブランチに切り替えておく マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている develop を feature/test にマージする これにより「打ち消し」の作業内容がマージされる 作業ブランチからも作業内容が消えているので、自身のブランチの履歴からチェリーピックで作業内容を復元する ただしチェリーピックでの復元なので、作業コミット数が多い場合は作業が大変だし履歴もゴチャゴチャする 本当の意味でのマージ取り消しにはなっていない 対処法3: developブランチに切り替えておく マージのコミットではなく、打ち消したいコミットを右クリックして「このコミットを打ち消し」としてみる developブランチからは作業内容が消えた。feature/testブランチには作業内容が残っている 本来マージすべきタイミングになってから、打ち消したコミットを右クリックして「このコミットを打ち消し」としてみる これにより、打ち消された内容を復元できる ただし「マージ間違いがあったのでコミットを打ち消したんだ」ということを覚えておかないと、間があくと「なぜかマージできない」と悩むかもしれない また、「打ち消したコミットをさらに打ち消す」前に feature/testブランチでの追加作業を取り込んでしまうとコンフリクトが発生するはず 本当の意味でのマージ取り消しにはなっていない 結局のところ、何が何でもきれいに取り消すのなら 「プッシュを取り消す(完全に無かったことになるが、取り消し履歴も残らないので注意)」 でマージもプッシュも完全に取すくらいか ただし他の人が作業を取り込んだ後だと混乱するので、「絶対に他の人が作業を取り込んでいない」と断言できる状態でのみ使えるものだと思われる また、必要なコミットが本番環境で消えたりすると問題なので、やはり原則使わない方が無難
フォークとプルリクエスト
公開リポジトリで不特定多数に公開するなら、知っておくといい Sourcetreeを例に記載 GitHubを使うなら最低限知っておきたい、プルリクエストの送り方とレビュー、マージの基本 (1/2):こっそり始めるGit/GitHub超入門(10) - @IT http://www.atmarkit.co.jp/ait/articles/1702/27/news022.html 【GitHub】Pull Requestの手順 - Qiita https://qiita.com/Commander-Aipa/items/d61d21988a36a4d0e58b SourceTree で GitHub の Fork レポジトリを追加&同期する方法 - Qiita https://qiita.com/katzueno/items/967c14044982fb6dec65 ■フォークの作成 自身のアカウントでGitHubにログインした状態で https://github.com/refirio/test など対象リポジトリにアクセスし、ページ右上の「Fork」をクリックする 数秒待つと https://github.com/(自身のアカウント)/test にForkされる (複数のリポジトリを持っている場合、フォーク先を確認される) ※Bitbucketの場合、対象リポジトリにアクセスして 「… → Fork this repository」をクリックするとフォークできる フォークの際、「Workspace」「プロジェクト」「名前」を入力する ■プルリクエストの送信 Sourcetreeでローカルにクローンする クローン後、「develop」ブランチにチェックアウト 「develop」ブランチから「feature/test」ブランチを作成して作業&コミット 「feature/test」ブランチを「develop」ブランチにマージしてプッシュ (もしくは直接「develop」ブランチで作業してプッシュ) 自身のGitHub上に「Compare & pull request」ボタンが表示されるのでクリック プルリクエスト入力画面になるので、必要に応じて内容を入力し「Create pull request」ボタンをクリック (マージ先とマージ元の両方が「develop」になっていることを確認する。「master」などになっていたら変更する) プルリクエスト送信完了 ■プルリクエストの受信 https://github.com/refirio/test/pulls にアクセスし、プルリクエストが届いていることを確認する 「Merge pull request」ボタンをクリック 必要に応じてコメントを編集し、「Confirm merge」ボタンをクリック (ここで編集したコメントは、マージのコミットのコメントとして反映される) マージ完了 ■プルリクエストを送信する実例 ※freoを例にして実際に手順を解説 自身のアカウントでGitHubにログインした状態で https://github.com/refirio/freo にアクセスし、ページ右上の「Fork」をクリックする 数秒待つと https://github.com/(自身のアカウント)/freo にForkされた (複数のリポジトリを持っている場合、フォーク先を確認される) Sourcetreeでローカルにクローンする クローン後、「develop」ブランチにチェックアウト 「develop」ブランチから「feature/test」ブランチを作成して作業&コミット(作業に応じた名前のブランチを作成する) 「feature/test」ブランチを「develop」ブランチにマージしてプッシュ (もしくは直接「develop」ブランチで作業してプッシュ) 自身のGitHub上に「Compare & pull request」ボタンが表示されるのでクリック プルリクエスト入力画面になるので、必要に応じて内容を入力し「Create pull request」ボタンをクリック (マージ先とマージ元の両方が「develop」になっていることを確認する。「master」などになっていたら変更する マージ先ユーザが「refirio/freo」になっていることも確認する) プルリクエスト送信完了 ■フォーク元の更新を取り込む実例 ※freoを例にして実際に手順を解説 親リポジトリのURLをメモしておく。今回は以下のURLになる https://github.com/refirio/freo.git Sourcetreeで「設定」をクリックする 「リモート」タブで「追加」をクリックする リモート名: freo(何でもいい) URL/パス: https://github.com/refirio/freo.git と設定して「OK」をクリックする もとの画面に戻るので、さらに「OK」をクリックする これでリポジトリが追加できた Sourcetreeでmasterブランチに切り替える(masterブランチに更新を取り込む場合) ツールバーの「プル」をクリックする 次のリモートからプル: freo(先程登録したリモート名) プルするリモートブランチ: master(何も表示されなければ、いったん「更新」をクリックする) 「OK」をクリックすると、更新を取り込むことができる ツールバーの「プッシュ」をクリックし、取り込んだ更新を自身のリモートリポジトリにプッシュしておく これでフォーク元の更新を取り込むことができた 必要に応じて、developブランチにも更新を取り込んだり、自身のfeatureブランチにマージしたりする ■その他 main(master)ブランチ宛にプルリクエストが来たが、いったんdevelopブランチに取り込みたい …のような場合、プルリクエストの向き先を変更できる 【地味に便利】GitHubでPull Requestの向き先を変更する方法 - Qiita https://qiita.com/ryoichi-u/items/60d38a1054ddc09e4450
他のブランチでマージやプルを行う
develop ブランチを master ブランチにマージする場合など、 master と develop で作業内容に差がありすぎると 1. master に切り替える 2. master をプルする という作業において、1を行なった瞬間にローカルの必要なファイルが消える可能性がある この場合、いったん別の場所に新規にクローンしてからマージしてプッシュする そのうえで、作業している環境では 1. develop のままにしておく 2. master ブランチを右クリックして「masterをフェッチ」を実行する という作業をするといい(Sourcetreeの場合) この後は通常どおり操作できる
ブラウザ上で差分を確認する
■インデントの変更を無視して差分を確認する GitHub・Bitbucketとも、?w=1 を指定するとインデントの変更を無視して差分を確認できる 条件分岐の追加などによりインデントが変更され、差分が大量に発生したが、ロジックの変更はごく一部…という場合の確認が楽になる 例えばURLが以下の場合、 https://bitbucket.org/user/repo/pull-requests/1/changes/diff 以下のようにURLの最後に ?w=1 を追加すると、空白が無視して表示される https://bitbucket.org/user/repo/pull-requests/1/changes/diff?w=1 ■特定コミット間の差分を確認する 以下のようなURLで、コミットの差分を表示できる https://github.com/ユーザ名/リポジトリ名/compare/コミットAのハッシュ…コミットBのハッシュ 具体的には、以下のようなURLになる https://github.com/refirio/freo/compare/3eba2e00f4270b034c5a14c8a164b7cb3ffa0d9e%E2%80%A631073e42523... GitHub 特定のcommit間の差分を表示 - Qiita https://qiita.com/gestalt/items/fb7e0475f11788b0996b GitHub - コミット間・ブランチ間の差分(Diff)の確認方法・見方 | Howpon[ハウポン] https://howpon.com/8540
ブラウザ上でマージする
Bitbucketの場合、以下のようなURLでリポジトリのページがあり、Sourcetreeが無くてもここからマージ作業ができる https://bitbucket.org/xxx/yyy marge_test1 ブランチを develop ブランチにマージする場合のメモ ブランチ → (任意のブランチ名をクリック) から、ブラウザ上でマージなどを行える 「対象を変更」リンクから必要に応じて対象を変更し、「マージ」ボタンを押すとコメントとともにマージができる コメントは「marge_test1 を develop にマージしました。」のような初期値が入力済になっているので、基本的にこのままでいい なお、マージしようとしている内容にコンフリクトがある場合、「マージ」ボタンを押した際に以下の警告が表示される
このマージには衝突があり,コミットできるようにするにはこれを解消しなければなりません。 変更を master に手作業でマージするには、下記のコマンドを実行してください: $ git checkout master $ git merge remotes/origin/marge_test1
プッシュせずに差分を共有する
以下の方法でやり取りできるようだが、癖があってエラーになることがあるみたい?未検証 SourceTreeで差分ファイルを共有する - Qiita https://qiita.com/masao_keda/items/2f30f240bd85dba46b7f
ブランチを保護する
GitHubの場合、特定ブランチへの強制プッシュを無効にしたり、プルリクエストを必須にしたりできる Bitbucketの場合、特定ブランチへプッシュできる人を限定することができる マンガでわかるGit 10話「masterブランチを守れ!〜危険な強制プッシュ〜」 | リクナビNEXTジャーナル https://next.rikunabi.com/journal/20170516_t12_iq/ [GitHub] ブランチの保護設定を活用しよう 【レビューが通るまでマージさせんぞ】 | Developers.IO https://dev.classmethod.jp/tool/github/protect-branch/ プルリクレビュー必須にしてやった - もがき系プログラマの日常 http://kojirooooocks.hatenablog.com/entry/2018/05/11/033152 BitBucketでmasterブランチにpushできるユーザあるいはグループを制限したい | オガリア 技術ブログ http://tech.oga-ria.com/branch-management-in-bitbucket/
Gitフック
※要検証 特定のブランチにプッシュする場合に警告を表示したり…ができそう Git - Git フック https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-G... Git フックの基本的な使い方 - Qiita https://qiita.com/noraworld/items/c562de68a627ae792c6c 【実践式】Gitフックを使ってミスを減らす方法|Career Supli https://careersupli.jp/work/githooks/ 追加の依存パッケージなしでプロジェクトごとのGitコミットフックを設定する方法 | Web Scratch https://efcl.info/2021/08/21/git-precommit-hook/
大容量のバイナリファイルを扱う
Gitはその性質上、大容量のバイナリファイルを扱うことには適していない 巨大すぎるファイルはGit管理外にすることもある 以下のような模索はされているので、今後改良されるかも Git Large File Storage https://git-lfs.github.com/ 大容量ファイルもGitで管理。 Git LFSの使い方 https://www.slideshare.net/hibiki443/git-git-lfs-60951449 Git LFS で大きめのバイナリファイルも Git で管理する - Qiita https://qiita.com/msh5/items/582c086311d3630563bc
リポジトリを複製(引っ越し)する
※履歴を保持したままリポジトリの引っ越しを行う方法 ※複製先はカラの新品のリポジトリである必要がある ※Bitbucketで実際に試した 1. Bitbucket上にカラのリポジトリを作成する 2. 複製したいリポジトリを、ローカルにCLONEする 3. CLONEしたリポジトリをSourcetreeで開き、「設定」からリモートリポジトリのパスを編集する 4. PUSHする(大抵の場合、結構時間がかかる) 5. Bitbucket上に反映されていることを確認する 【Git】コミット履歴込みでリポジトリの移行を行う。(Git to Git) - Qiita https://qiita.com/msht0511/items/467a0cbffb4fed60f885 Gitレポジトリを移行する方法 - Qiita https://qiita.com/tanacasino/items/901723e3463bac38f40e
リポジトリを譲渡する
まずはリポジトリの所有者が作業する リポジトリの「Repository settings」の「リポジトリの詳細」のページ右上にある「Manage Repository」から「Transfer Repository」を選択する 譲渡先のワークスペースを指定する 対象ユーザに承認メールが飛び、許可するとリポジトリが譲渡される。その際に移動先のプロジェクトも選択する Sourcetreeなどを使用している場合、リポジトリの参照先を変更する 例えば taro から hanako に test リポジトリを譲渡した場合、参照すべきリポジトリのURLが https://taro@bitbucket.org/taro/test.githttps://taro@bitbucket.org/hanako/test.git に変化するので、Sourcetreeなどのリポジトリ設定もそのように変更する リポジトリの譲渡などでリポジトリのURLが変更された場合、デプロイ時の参照先も変更する必要がある リポジトリの所有権を譲渡する - アトラシアン製品ドキュメント https://ja.confluence.atlassian.com/bitbucket/transfer-repository-ownership-289964397.html 【git】リポジトリの移行時などでremote urlを変更する - KDE BLOG https://kde.hateblo.jp/entry/2018/02/18/200459 以下は実際にリポジトリの譲渡を試したときのメモ ■前提 以下にリポジトリを作成してあるものとする https://bitbucket.org/taro/test ローカルのSourcetreeで参照できるものとする 権限を与えた他のユーザからも、Sourcetreeで参照できるものとする サーバ上でPULLできるよう設定してものとする 以下は作業例
$ sudo su -s /bin/bash - apache $ cat /var/www/.ssh/id_rsa.pub ... CLONEできるようにするため、この内容をリポジトリに登録。id_rsa.pub は作成済みのものとする $ mkdir /var/www/vhosts/test $ cd /var/www/vhosts/test $ git clone git@bitbucket.org:taro/test.git /var/www/vhosts/test $ git pull
■譲渡 譲渡元でリポジトリの譲渡作業を行う 「Repository settings → Manage repository」から、譲渡先のIDを入力する 譲渡先でメールを受け取ると、以下の内容が書かれているので許可する (「以下のグループは」の下には何も書かれていなかった)
リポジトリの所有権の移転 太郎 山田が、リポジトリtaro/testの所有権をあなたに譲ろうとしています。 あなたが承認すれば、存在する全てのユーザーとグループがリボークされたリポジトリにアクセスできます。 また、以下のグループはリポジトリにアクセスできます: [許可する] [拒否する]
許可すると「リポジトリは譲渡されました。」と表示される この時点で、旧URLにはアクセスできなくなる 譲渡先では以下のURLでアクセスできるが、譲渡元は権限が無いのでアクセスできない 譲渡先で「ユーザーとグループのアクセス権」を与えれば、もちろんアクセスできるようになる https://bitbucket.org/hanako/test ■譲渡後の設定(Sourcetree) SourcetreeでPULLすると、リポジトリが見つからない(移動した)ため以下のエラーになる
remote: Repository taro/test not found
Sourcetreeで「設定 → origin → 編集 → URL/パス」を以下のように変更して「OK」すると、PULLできるようになる https://taro@bitbucket.org/taro/test.githttps://taro@bitbucket.org/hanako/test.git ■譲渡後の設定(サーバ) サーバ上でPULLすると、リポジトリが見つからない(移動した)ため以下のエラーになる
$ git pull repository does not exist. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
以下の手順でリポジトリの参照先を変更すると、PULLできるようになる
$ git remote -v origin git@bitbucket.org:taro/test.git (fetch) origin git@bitbucket.org:taro/test.git (push) $ git remote set-url origin git@bitbucket.org:hanako/test.git $ git remote -v origin git@bitbucket.org:hanako/test.git (fetch) origin git@bitbucket.org:hanako/test.git (push) $ git pull Already up-to-date.
GitLab
GitHub買収騒動によりスポットが当たっているらしい 未検証 GitLabとは?GitHub買収で10倍のインポート数。使い方を解説 | TECH::NOTE|テックノート|テクノロジー学習やエンジニア転職に役立つ情報を発信しています https://tech-camp.in/note/technology/44434/ GitLab自社運用のための注意点とノウハウ(2018/06版) https://techracho.bpsinc.jp/morimorihoge/2018_06_04/57628
独自ブランチモデルの考察
gitflowだと、案件によっては 「本番環境に反映できないものがdevelopにあるので運用しづらい」 が多く発生するため、ブランチモデルについて考察 独自のブランチ名やルールは極力避けたい 通常のgitflowに戻して運用できるのが理想 「日々の更新が頻繁に発生するWebシステムだが、大きな機能追加も並行して進める必要がある」 という案件に導入して、スムーズに運用できたと思うのでメモ ■master 本番環境と同一 このブランチで直接作業は行わない releaseとhotfixからのみマージされる releaseからマージした場合、1.0.0 → 1.1.0 とする(バージョンタグを付ける場合) hotfixからマージした場合、1.0.0 → 1.0.1 とする(バージョンタグを付ける場合) hotfixのreleaseへのマージ忘れ対策に、定期的にmasterからreleaseにマージする ■release ステージング環境と同一(最終確認用のステージング環境がある場合) 原則としてこのブランチで直接作業は行わないが、すぐに(「本日中に」くらいの目安)本番反映してもいい軽微な調整なら直接作業も可 masterから作成し、リリースのタイミングでmasterへマージする 日々の更新を開発版に反映するため、定期的にreleaseからdevelopとtestにマージする ■topic/1-xxx 大きな機能開発とは別に、すぐに(「数日中に」くらいの目安)本番反映してもいい日々の更新を行う releaseから作成し、完了したらreleaseへマージする 先方に確認してもらう場合、testにマージする 他の作業との差異が大きくなりすぎないように、ときどきreleaseから自身のtopicにマージする ■develop 機能開発を行う このブランチで直接作業は行わない releaseから作成し、開発が一段落したらreleaseにマージする ■feature/1-xxx 日々の更新とは別に、大きな機能開発を行う developから作成し、完了したらdevelopへマージする 先方に確認してもらう場合、testにマージする 他の作業との差異が大きくなりすぎないように、ときどきdevelopから自身のfeatureにマージする ■hotfix/1-xxx 即座に本番反映が必要な緊急対応を行う masterから作成し、完了したらmasterにマージする 問題なければreleaseとtestにもマージする ■test(必要に応じて) テスト環境と同一(先方確認用のテスト環境がある場合。社内案件の場合など、先方確認用環境が不要ならtestは無しでreleaseで確認する) このブランチで直接作業は行わない releaseから作成する ■support/1.0.1(必要に応じて) 過去バージョンのサポートを行う 必要になったときに、masterから作る バージョンタグを付けている場合、そのバージョンをブランチ名に使う - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ■デザイナーの簡易対応 topicで作業してreleaseにマージ。testにマージしたものをテスト環境に反映 gitに慣れていなければreleaseで直接作業して、testにマージしたものをテスト環境に反映 ■開発者の対応 featureで作業してdevelopにマージ。testにマージしたものをテスト環境に反映 topicで作業してreleaseにマージ。testにマージしたものをテスト環境に反映 ■その他メモ 独自のブランチ名やルールは極力避けたい 通常のgitflowに戻して運用できるのが理想 プルリクエストを活用するか否か featureからdevelopにマージするときと、topicからreleaseにマージするときに使用するか masterブランチは原則として保護しておくか 開発初期にプルリクエスト必須にしたりすると手間がかかるので、途中から変更すべきか 定期的にmasterブランチのバックアップを取っておくか backup/master_20180911 最悪無くてもGitで戻せるので、2〜3世代程度あれば十分 大きな仕様変更による競合が問題になりそうなら、場合によっては ・マイグレーションや共通関数の調整は、できるだけ早い段階で本番反映する ・その後、隠し機能として実装を進める という手順を検討する ただし早い段階で本番反映することにより、作業の取り消しが難しくなるのは注意 topicの内容を他のtopicに取り込みたいが、本番反映はもう少し先なのでreleaseには取り込みづらい という場合はどうするか testを経由するのは可能だが、本来の目的とは違うしtestが無い場合もある チェリーピックを使ったり、topic同士でマージするくらいか ■以下、考察メモ 主に http://developers.gnavi.co.jp/entry/GitFeatureFlow/koyama これを元にするか Aの作業が完了した上にBとCの機能を追加する…という場合にどうするかは要検討 stagingからmasterにマージしないので、作業の差が残り続ける懸念があるのは要検討 https://postd.cc/gitlab-flow/ GitLabFlowというのもあるらしい - - - - - master work/1-aaa work/2-bbb work/3-ccc staging masterからworkブランチを作成 作業が完了したらworkをstagingにマージし、ステージング環境に反映して動作確認 確認が完了したらworkをmasterにマージし、本番環境に反映 - - - - - 「うっかりmasterにマージした」を防ぐために、作業者はローカルにmasterを持たなくていいようにすべきか。つまりmasterからいったんブランチを作るべきか それならうっかりstagingにマージする可能性もあるので、masterからbackup/20180903 のようなブランチをときどき作る方がいいか masterからいったんdevelopを作成し、そこから作業ブランチを作るほうがいいか。それならworkとか独自の名前を付けないほうがいいか (でもgitflowと違って、気軽にfeatureからdevelopにマージしてはいけないので、独自の名前のほうがいいか。要検討) - - - - - master develop feature/1-aaa feature/2-bbb feature/3-ccc staging masterからdevelopブランチを作成 developからfeatureブランチを作成 作業が完了したらfeatureをstagingにマージし、ステージング環境(先方確認用など)に反映して動作確認 確認が完了したらfeatureをdevelopにマージし、developをmasterにマージして本番環境に反映 作業者の環境に、原則としてmasterブランチは置かない - - - - - とすればいいか そのうえで、 ・マイグレーションや共通関数の調整は、できるだけ早い段階で本番反映する ・その後、隠し機能として実装を進める とすればいいか ただし早い段階で本番反映することにより、作業の取り消しが難しくなるのは注意 masterから作業ブランチを作ると、masterに色々マージして動作確認しているときの緊急対応がやりづらい masterからリリースブランチを作って、そこからworkブランチを作るか 緊急対応はmasterからhotfixを作る 作業のマージはリリースブランチにマージしてからworkブランチへ …なら、普段どおりdevelopという名前でいいか featureからdevelopとreleaseに戻せればいい?それに加えて、デーベース定義の変更などは、早い段階でリリースを目指して隠し機能扱いにする? developからではなくmasterから作業したいfeatureがある場合はどうするか 本来はhotfixが妥当だが、開発系は常にreleaseからfeatureブランチを作るか。その後必要に応じてdevelopからfeatureにマージ。ただし慎重に - - - - - - - - - - master ... 本番環境と同一 releaseとhotfixからのみマージされる releaseからマージした場合、1.0.0 → 1.1.0 とする hotfixからマージした場合、1.0.0 → 1.0.1 とする release ... ステージング環境と同一(環境自体は無くていいかも。test ブランチの確認用環境のみでいいかも) featureはここから作る(?) developからマージされるが、featureから直接マージもあり得る(?) develop ... 開発版 featureからマージされる。開発が一段落したらreleaseにマージする feature/1-xxx ... 作業用 releaseから作り、必要に応じてdevelopからマージする(?) 大きな改修はdevelopから作っても問題はない 完了したらdevelopへマージ。先方連携するものはtestへマージ。すぐにリリースするものはreleaseへマージ(?) 他の作業との差異が大きくなりすぎないように、ときどきreleaseからマージ。developの内容を取り込んでいる場合はdevelopからマージ(?) hotfix/1-xxx ... 緊急対応用 masterから作る 完了したらmasterとreleaseとtestとdevelopにマージする。競合が心配だし面倒か(?) test ... テスト環境(先方確認用など)と同一 featureとhotfixからマージされる support ... 過去バージョンのサポート用(必要になったときのみ) masterから作る 通常のgitflowとしても運用できるのが理想 ときどき develop → release → master のマージを行わないと、コンフリクトが発生したときに差異が残り続けそうなのは懸念 featureブランチに、developの内容が混ざっているものと混ざっていないものがあるのは混乱するかも develop に対する feature のように、release から派生する作業ブランチに特別な名前を設けて区別するか fix/1-xxx とするか。修正ではなく追加もあるので topic/1-xxx とするか。完了したら release と develop と test にマージするか このブランチを設けるなら、feature は通常どおり develop から作ればいい - - - - - - - - - - Git-flowって何? - Qiita https://qiita.com/KosukeSone/items/514dd24828b485c69a05 GitFlowをやめて本番リリースが楽になった話 - Qiita https://qiita.com/koyopro/items/b4569285efc22c6397c6 Gitブランチについての基本まとめ - Qiita https://qiita.com/katsunory/items/252c5fd2f70480af9bbb
トラブル
■トラブル時にとりあえず試すといいこと Sourcetreeを最新版にする、もしくは再インストールすると解消されることがある 「ツール → Git → Gitバージョン」部分から内蔵のGitをアップデートすると解消されることがある ターミナルから「git pull」などコマンドを直接実行すれば操作できることがある ■プッシュしようとしてもブランチが表示されない Git - Sourcetreeのプッシュ時にブランチが表示されない状態を解消したい|teratail https://teratail.com/questions/217580 Sourcetreeの不具合?3.3.9 でも発生した 「ツール → オプション → Git → Gitバージョン」で「Embedded」をクリックすると、下の「System」ボタンがアクティブになった この状態だとブランチが表示された ■他の人の変更内容を取り込むと、Sourcetreeで扱えないファイルがある SourcetreeでCloneしようとすると以下のエラーになった(Windowsの通常領域とWSL2領域で発生)
git -c filter.lfs.smudge= -c filter.lfs.required=false -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks clone --branch master https://refirio@bitbucket.org/refirio/example.git C:\Users\refirio\Vagrant\example Cloning into 'C:\Users\refirio\Vagrant\example'... error: invalid path 'docker/chrome/keys/keys_dir.' fatal: unable to checkout working tree warning: Clone succeeded, but checkout failed. You can inspect what was checked out with 'git status' and retry with 'git restore --source=HEAD :/' エラー終了しました。エラーの内容は上記をご覧ください。
一応、以下の操作をするとSourcetree上で作業履歴は表示されるようになった
git status git restore --source=HEAD :/
ただし「docker/chrome/keys/keys_dir.」を扱うことができないようで、 このファイルをステージに追加したり削除したりしようとすると、やはり以下のエラーになる
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks reset -q -- docker/chrome/keys/keys_dir. error: invalid path 'docker/chrome/keys/keys_dir.' fatal: make_cache_entry failed for path 'docker/chrome/keys/keys_dir.' エラー終了しました。エラーの内容は上記をご覧ください。
これは警告のとおり「keys_dir.」が原因 Windowsではピリオドで終わるファイルを扱うことができないため 該当するファイルを削除するか、ファイル名を変更することで扱えるようになる ■他の人の変更内容を取り込むと、手元で変更していないのにSourcetreeでは「ファイル内のすべての行を変更した」とみなされる Windowsでは改行コードが自動でCRLFに変換される 1環境だけSourcetreeではなくコマンドでのコミット…のような場合におかしくなることがあるみたい 以前問題が起きた際に開発者に確認すると、 「Sourcetreeはよく解らないので、普段からコマンドでコミットしている。 他の人が作成したファイルに手を加えて、初めてコミットした際に起きているかもしれない」 とのこと 差分の出る環境でそのまま差分ファイルをコミットして解決したが、以下のページなどを参考にして根本解決を試みたい (「コミットする改行コードを常にLFにする」のように、あらかじめ設定を統一しておくことが好ましいかも) gitで差分が出続ける現象の解決法 - Qiita https://qiita.com/katsukii/items/f046eb256111f6a4a804 SourceTreeの比較プレビューがおかしいのは、改行コードのせいだったりした件 - ゼロイチ http://0-1.life/771 Gitで変更していないはずのファイルが変更とみなされる - Qiita https://qiita.com/hishida/items/35d929845c0ac824b1c0 windows環境の git で改行コードの自動変換に注意 - Qiita https://qiita.com/yokoh9/items/1ec8099696ade0c1f36e Git - Source treeで改行コードが自動的にCRLFに変換されてしまう→設定法は?(37775)|teratail https://teratail.com/questions/37775 Windows の SourceTree で プル した際に改行コードを LF にする方法 - 約束の地 https://obel.hatenablog.jp/entry/20161124/1479955273 ■Sourcetreeで何度もGitHub、bitbucketのログインを求められる SourceTreeで何度もGitHub、bitbucketのログインを求められた時に解決した方法 - Qiita https://qiita.com/Raugh/items/e5e349edacf5b01b5e1e GitHubとbitbucketで同じユーザー名は使用できないらしい ターミナルからコマンドで「git pull」「git push」などを実行すれば、明示的に認証できるので試す 以下操作例 Sourcetreeでツールバーの「ターミナル」を選択する ターミナルで「git pull」を実行する 「GitHub Lgoin」ダイアログが表示されるが、こちらは認証できないのでキャンセルする ターミナルでユーザ名の入力待ちになっているので、ユーザ名を入力する 「OpenSSH」ダイアログが表示されるので、パスワードを入力すると認証できる 以降、ブランチの切り替えなどはSourcetree上で行えるが、「git pull」「git push」など通信が発生するものは上記手順で行う Sourcetreeと内蔵のGitを最新版にすれば解決することはある 内蔵のGitはメニューの「ツール → オプション → Git → Gitバージョン」部分からアップデートできる ■SourcetreeでGitHubからコードを取得できない PULLしようとすると「GitHub Lgoin」のダイアログが表示され、情報を入力しても認証できない GitHub - SurceTreeでGitHubと連携できず「ログインエラー」が発生してしまう問題(48719)|teratail https://teratail.com/questions/48719 Sourcetreeを最新版にすると、解決することがあるみたい SourceTreeで突然gitリモートリポジトリに繋がらなくなった時。 - ノウハウブログ - カンタローCGI https://kantaro-cgi.com/blog/git/bitbucket-permission-error.html リポジトリのパスをhttpsにすると、解決することがあるみたい SourceTree + Bitbucketで認証エラーが出る場合の対処方法 on Windows | TeraDas https://www.teradas.net/archives/29134/ Sourcetreeが使うGitを、EmbeddedではなくSystemにすると解決することがあった 上にあるように、GitHubとbitbucketで同じユーザー名は使用できないらしい 他の要因の可能性もあるが、ターミナルからコマンドで操作すると取得できることが多い ■「pathspec 'develop' did not match any file(s) known to git」と表示されてブランチを切り替えられない ブランチを切り替えようとすると以下のエラーになった
$ git checkout develop error: pathspec 'develop' did not match any file(s) known to git
リモートにブランチは存在している
$ git branch * main $ git branch -a * main remotes/origin/HEAD -> origin/main remotes/origin/develop remotes/origin/main
以下のコマンドでなら、ブランチを切り替えられた バージョン依存ではなく、指定した名前のブランチが複数のリモートに存在するとエラーになるらしい 詳細は要勉強
$ git checkout -b develop origin/develop
git - fetchしたremoteブランチのトラッキングブランチがcheckout時に自動で生成されない - スタック・オーバーフロー https://ja.stackoverflow.com/questions/18047/fetch%E3%81%97%E3%81%9Fremote%E3%83%96%E3%83%A9%E3%83%B... ■「Your local changes to the following files would be overwritten by merge」と表示されてPULLできない pullを行おうとすると以下のエラーになった
$ git pull Updating eb9423a..4e02523 error: Your local changes to the following files would be overwritten by merge: html/sitemap.xml Please commit your changes or stash them before you merge. Aborting
リモート側でファイルが編集された場合などに、競合が発生している
$ git checkout HEAD -- html/sitemap.xml
として、該当ファイルの編集をリセットしておくと大丈夫だった もしくは若干強引だが、
$ git reset --hard origin/develop
として、強制的にブランチの内容をリポジトリと一致させると大丈夫だった この場合は develop ブランチに強制一致させるので、他のブランチの場合は適宜コマンドを調整する ■「The following untracked working tree files would be overwritten by merge」と表示されてPULLできない pullを行おうとすると以下のエラーになった
$ git pull remote: Enumerating objects: 11, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (4/4), done. remote: Total 11 (delta 7), reused 11 (delta 7), pack-reused 0 Unpacking objects: 100% (11/11), done. From github.com:refirio/levis ab88a21f..13fcaa56 develop -> origin/develop Updating ab88a21f..13fcaa56 error: The following untracked working tree files would be overwritten by merge: app/template/default/Help/about.twig app/template/default/Help/privacy.twig Please move or remove them before you merge. Aborting
リモート側でファイルが作成された場合などに、競合が発生している
$ rm app/template/default/Help/about.twig $ rm app/template/default/Help/privacy.twig
として、該当ファイルを削除しておくと大丈夫だった もしくは若干強引だが、
$ git reset --hard origin/develop
として、強制的にブランチの内容をリポジトリと一致させると大丈夫だった この場合は develop ブランチに強制一致させるので、他のブランチの場合は適宜コマンドを調整する ■「error: cannot lock ref」と表示されてPULLできない pullやfetchを行おうとすると以下のエラーになった
$ git pull remote: Counting objects: 12, done. remote: Compressing objects: 100% (5/5), done. remote: Total 12 (delta 6), reused 10 (delta 6) Unpacking objects: 100% (12/12), done. From bitbucket.org:xxx/yyy b60cc33..e036554 master -> origin/master 1d5cc1a..f2070a0 develop -> origin/develop error: cannot lock ref 'refs/remotes/origin/hotfix/sdk': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix/sdk' ! [new branch] hotfix/sdk -> origin/hotfix/sdk (unable to update local ref) $ git fetch origin error: cannot lock ref 'refs/remotes/origin/hotfix/sdk': 'refs/remotes/origin/hotfix' exists; cannot create 'refs/remotes/origin/hotfix/sdk' From bitbucket.org:xxx/yyy ! [new branch] hotfix/sdk -> origin/hotfix/sdk (unable to update local ref)
リモート側でブランチが削除された場合などに発生するみたい
$ git remote prune origin $ git fetch origin
としてから再度PULLすると大丈夫だった git fetchで、unable to update local refとエラーが出た場合の対処法 - tech::hexagram https://manji602.hatenablog.com/entry/2017/08/14/123137 ■「github.com:xxx/xxx.git did not send all necessary objects」と表示されてPULLできない rsyncで双方向同期を行っているECCube環境で発生 何度PULLしても
$ git pull 〜略〜 error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects error: packfile .git/objects/pack/pack-2c4de2814e00bb352de0bb80a1a1f7e82da7990c.pack claims to have 3583 objects while index indicates 3710 objects fatal: bad object 55584a0c340f1428bc54f0fdd61a9d6150bcd88e error: github.com:refirio/levis.git did not send all necessary objects
で止まってしまったが、しばらく時間を置いて「git pull」を実行すると、最後に「Already up-to-date.」が表示されるようになった 念のため再度
$ git pull $ git fetch origin $ git reset --hard origin/master
と実行することで、以降は正常にPULLできるようになったことはあった ただし「git reset」によって、サーバ上で直接変更したファイルがあれば、変更内容が消えてしまうので注意 最初にPULLを実行したときの内容が、時間をかけてrsync同期されて解決した…などはあるかもしれないが不明 もし次回発生したら、PULLのあとに時間を置いてみるのと、rsyncを停止してから実行するのは有効かもしれない 上記の手順で解決せず、別の方法で解決したときのメモを「2」として別途以下に記載する ■「github.com:xxx/xxx.git did not send all necessary objects」と表示されてPULLできない 2 検収環境と本番環境でほぼ同時期に発生し、本番環境では上にある手順でも解消できなかった .git の内容が一部壊れて修復できなくなっている可能性がありそうなので、 1. 別のフォルダにCloneする 2. 本番環境の .git を退避させる 3. 別のフォルダにCloneした .git を、本番環境の領域に移動させる とすることで復旧できた 具体的には
$ git clone git@bitbucket.org:refirio/test.git /var/www/html/temp $ git pull
として別のフォルダにCloneしたあと、問題が発生しているリポジトリの領域にて
$ mv .git /path/to/backup/git $ mv /var/www/html/temp/.git /path/to/project
のようにすることで解決できた 以下は、上記を行う前に色々と検証したときのメモ 検証のためにCloneする
$ sudo su -s /bin/bash - apache $ cd /var/www/html/temp $ git clone git@bitbucket.org:refirio/test.git /var/www/html/temp $ git pull $ ll .git/objects/pack/ 合計 28 -r--r--r-- 1 apache apache 3312 5月 28 13:43 pack-93f65e1e0459bd961922cd3029dc3996fd446911.idx -r--r--r-- 1 apache apache 21494 5月 28 13:43 pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack
リポジトリをバックアップしておく
$ cp -rp .git git_backup
ルート権限で以下のファイルを「test」に書き換えてみる(意図的にファイルを壊してみる)
/var/www/html/temp/.git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack
PULLしようとすると以下のとおりエラーになる
$ git pull error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: refs/heads/master does not point to a valid object! error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: refs/remotes/origin/HEAD does not point to a valid object! error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: refs/remotes/origin/develop does not point to a valid object! error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile 〜略〜 error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is far too short to be a packfile Already up-to-date.
もっと大量に(5000byteほど)書き込んでみる PULLしようとすると以下のとおりエラーになる
$ git pull error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile 〜略〜 error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile error: file .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack is not a GIT packfile Already up-to-date.
以下を実行しても結果は同じだった
$ git pull --prune
ファイルを直接編集して正しい内容に戻すと、エラーは表示されなくなる 以下でも戻すことができる
$ cp git_backup/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack .git/objects/pack/pack-93f65e1e0459bd961922cd3029dc3996fd446911.pack
以下でも戻すことができる
$ mv .git git $ mv git_backup .git
.git/objects 自体を削除するとどうか…と思ったが、削除後にPULLしようとすると 「fatal: Not a git repository (or any of the parent directories): .git」 のエラーになった 手順中に「git pull --prune」を試しているのは以下の記事があったためだが、 少なくとも今回は改善に繋がるものでは無かった git pullのとき常にpruneするための設定 - Qiita https://qiita.com/suin/items/27a559ab678bc054747e ■「Repository not found.」と表示されてPULLできない remote: Repository not found.となった時の対応方法 - Qiita https://qiita.com/ponsuke0531/items/4fe191b7bed03342cff2 最後にある「対応 : configファイルのurlに認証情報を追記する」で解決できたことがあった ■「Please enter a commit message to explain why this merge is necessary,」と表示されてPULLできない サーバ内でpullを行おうとすると、以下のメッセージが表示になった
Merge branch 'main' of github.com:uqo/unicolle into main # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
git merge実行時に「Please enter a commit message to explain why this merge is necessary」が表示される | mebee https://mebee.info/2021/03/02/post-30147/ 「コミットメッセージを入力して」という内容のようなので、「:q!」として終了するとPULLは完了している ■「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」と表示されてGitHubからPULLできない We updated our RSA SSH host key | The GitHub Blog https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/ `git push`しようとしたら`WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`が出た時の対処ログ https://zenn.dev/fujishiro/scraps/9dcbd03aa608ae 突然以下のようなエラーが表示されるようになった
$ git pull @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s. Please contact your system administrator. Add correct host key in /usr/share/httpd/.ssh/known_hosts to get rid of this message. Offending RSA key in /usr/share/httpd/.ssh/known_hosts:1 RSA host key for github.com has changed and you have requested strict checking. Host key verification failed. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
GitHubが秘密鍵を不用意に公開してしまったらしい 対策として鍵を交換したので、PULLするサーバ側でも鍵の変更が必要らしい 解説を元に対応したが、known_hosts にはドメインに加えてIPアドレスも追加する必要があった
$ ssh-keygen -R github.com … 古いキーを削除 $ vi ~/.ssh/known_hosts … ファイルの最後に追記
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ〜中略〜Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
$ git pull … PULLできるようになったが、IPアドレスのキーとは異なると言われる(毎回警告が表示される) Warning: the RSA host key for 'github.com' differs from the key for the IP address '20.27.177.113' Offending key for IP in /usr/share/httpd/.ssh/known_hosts:3 Matching host key in /usr/share/httpd/.ssh/known_hosts:4 Are you sure you want to continue connecting (yes/no)? yes Already up-to-date. $ vi ~/.ssh/known_hosts … GitHubのドメインに続いて、上に表示されたIPアドレスを指定
github.com,20.27.177.113 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ〜中略〜Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
$ git pull … 警告なくPULLできるようになった Already up-to-date.
■「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」と表示されてBitbucketからPULLできない 基本的にはGitHubと同じ現象で、同じ対応が必要 ACTION REQUIRED: Update your Bitbucket Cloud SSH Host Keys - Bitbucket https://bitbucket.org/blog/ssh-host-key-changes 公式の解説ページのうち、主に「WHAT YOU NEED TO DO」部分を参考に作業する
$ ssh-keygen -R bitbucket.org && curl https://bitbucket.org/site/ssh >> ~/.ssh/known_hosts
ただしこれだけだと、PULLのたびに毎回確認が表示される known_hostsでBitbucketのドメインに続いて、上に表示されたIPアドレスを指定する。(3行ある。)
$ vi ~/.ssh/known_hosts
bitbucket.org,104.192.141.1 ssh-rsa AAAAB3NzaC1yc2EA以下略 bitbucket.org,104.192.141.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNo以下略 bitbucket.org,104.192.141.1 ssh-ed25519 AAAAC3NzaC1lZDI1以下略
これで対応は完了 サーバは上記で対応できたが、SourcetreeでPULLやPUSHが実行できないようになった
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origin fatal: TaskCanceledException encountered. remote: Invalid credentials fatal: Authentication failed for 'https://bitbucket.org/refirio/example.git/' Logon failed, use ctrl+c to cancel basic credential prompt. エラー終了しました。エラーの内容は上記をご覧ください。
Sourcetreeで「ツール → オプション → 認証」を選択 Bitbucketのアカウントを選択 しばらく待つと「ログイン失敗」と表示される 「パスワードを再読み込み」ボタンをクリックしてみる 「認証に成功」と表示された 「OK」ボタンでダイアログを閉じる 再度PULLしてみる…が、状況は変わらず Sourcetreeを再起動しても変わらず 以下からアプリパスワードを再発行してみるが、状況は変わらず https://bitbucket.org/account/settings/app-passwords/ ターミナルからgit pullを実行。パスワードは、再発行したアプリパスワードを入力 とても重いが、PULLできることがある
$ git pull hint: Pulling without specifying how to reconcile divergent branches is hint: discouraged. You can squelch this message by running one of the following hint: commands sometime before your next pull: hint: hint: git config pull.rebase false # merge (the default strategy) hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only hint: hint: You can replace "git config" with "git config --global" to set a default hint: preference for all repositories. You can also pass --rebase, --no-rebase, hint: or --ff-only on the command line to override the configured default per hint: invocation. fatal: TaskCanceledException encountered. タスクが取り消されました。 remote: Invalid credentials fatal: Authentication failed for 'https://bitbucket.org/refirio/example.git/'
ob-websys.さんはTwitterを使っています: 「朝からbitbucketから「認証キー変えといたのねん」と届いて確認…やっぱり接続できん 検索してレジストリ消してコマンド打ってキャッシュ作って接続確認できた」 / Twitter https://twitter.com/tobtks/status/1671307211136720897 上記を参考に、コマンドプロンプトから以下を実行しても変わらず
>%LOCALAPPDATA%\SourceTree\app-3.4.13\tools\putty\plink.exe bitbucket.org The host key is not cached for this server: bitbucket.org (port 22) You have no guarantee that the server is the computer you think it is. The server's ssh-ed25519 key fingerprint is: ssh-ed25519 255 SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM If you trust this host, enter "y" to add the key to PuTTY's cache and carry on connecting. If you want to carry on connecting just once, without adding the key to the cache, enter "n". If you do not trust this host, press Return to abandon the connection. Store key in cache? (y/n, Return cancels connection, i for more info) y login as: refirio FATAL ERROR: Remote side unexpectedly closed network connection >%LOCALAPPDATA%\SourceTree\app-3.4.13\tools\putty\plink.exe bitbucket.org login as: refirio@example.com FATAL ERROR: No supported authentication methods available (server sent: publickey)
Sourcetreeで「設定 → origin → 編集 → URL/パス」を以下のように変更すると問題が解消した https://refirio@bitbucket.org/refirio/example.githttps://bitbucket.org/refirio/example.git PULLしようとすると、ユーザ名とパスワードを聞いてくる 何度か認証を試みると、成功することがあった URLを元に戻しても、PULLできるようになっていた 他のリポジトリもPULLできるようになっていた 認証情報を変更したことにより、古い情報のキャッシュが削除されたのか ただしGibHubのリポジトリに比べると、通信時間が結構長い
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origin fatal: TaskCanceledException encountered. git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks pull origin master hint: Pulling without specifying how to reconcile divergent branches is hint: discouraged. You can squelch this message by running one of the following hint: commands sometime before your next pull: hint: hint: git config pull.rebase false # merge (the default strategy) hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only hint: hint: You can replace "git config" with "git config --global" to set a default hint: preference for all repositories. You can also pass --rebase, --no-rebase, hint: or --ff-only on the command line to override the configured default per hint: invocation. fatal: TaskCanceledException encountered. From https://bitbucket.org/refirio/example * branch master -> FETCH_HEAD Already up to date. 完了しました。
なお、ECSからBitbucketのソースコード参照は問題無かった ■「You have divergent branches and need to specify how to reconcile them.」と表示されてBitbucketからPULLできない サーバ内でPULLを実行してエラー内容を確認
$ git pull hint: You have divergent branches and need to specify how to reconcile them. hint: You can do so by running one of the following commands sometime before hint: your next pull: hint: hint: git config pull.rebase false # merge hint: git config pull.rebase true # rebase hint: git config pull.ff only # fast-forward only hint: hint: You can replace "git config" with "git config --global" to set a default hint: preference for all repositories. You can also pass --rebase, --no-rebase, hint: or --ff-only on the command line to override the configured default per hint: invocation. fatal: Need to specify how to reconcile divergent branches.
Gitの警告"You have divergent branches and need to specify how to reconcile them."は、pull時分岐したブランチに対する設定を明確にすることで解決する。 - appbirdNotebook https://scrapbox.io/appbirdNotebook-public/Git%E3%81%AE%E8%AD%A6%E5%91%8A%22You_have_divergent_branc... サーバにインストールされているGitのバージョンは以下のとおり
$ git -v git version 2.38.4
Git ver 2.27.0 から、 「分岐しっ放しの複数の[ブランチ]があるため、それらに対してどう操作(調節)を行うか、挙動を明確にしなければなりません。」 となったらしい 以下の対応を行った。以降は問題なくPULLできるはず。
$ git config pull.rebase false $ git pull
■「cannot lock ref 'xxx': 'yyy' exists; cannot create 'xxx'」と表示されてBitbucketからPULLできない ローカルで hotfix/2024 を作成してプッシュ サーバ上で以下のとおり取得 $ git pull $ git checkout hotfix/2024 $ git pull ブランチ名を間違えたので ローカルで hotfix/2024 を削除し、代わりに hotfix/2024/ABC-12345 を作成してプッシュ サーバ上で以下のとおり取得…としようとしたときにエラーになった $ git pull error: cannot lock ref 'refs/remotes/origin/hotfix/2024/ABC-12345': 'refs/remotes/origin/hotfix/2024' exists; cannot create 'refs/remotes/origin/hotfix/2024/ABC-12345' From bitbucket.org:refirio/test ! [new branch] hotfix/2024/ABC-12345 -> origin/hotfix/2024/ABC-12345 (unable to update local ref) error: some local refs could not be updated; try running 'git remote prune origin' to remove any old, conflicting branches Gitが hotfix/2024 ブランチの参照をロックできず、新しいブランチ hotfix/2024/ABC-12345 を作成できないとのこと これは、既存のブランチが階層的に新しいブランチの親のような構造を持っていることが原因だと思われる 以下を実行し、古い参照を削除する git remote prune origin 改めて以下を実行し、サーバ上で以下のとおり取得しなおす これなら成功した git pull git checkout hotfix/2024/ABC-12345 git pull ■GitHubやBitbucketに接続できない GitHubの障害情報が以下にある GitHub Status https://www.githubstatus.com/ Bitbucketの障害情報が以下にある Atlassian Bitbucket Status https://bitbucket.status.atlassian.com/ ■GitHubで認証できない GitHubがパスワード認証を廃止するらしいので - Qiita https://qiita.com/shiro01/items/e886aa1e4beb404f9038 突然GitHubにpushできなくなった解決方法 - Qiita https://qiita.com/anaqe3/items/018c6fc24c9658ea2250 個人アクセストークンを使用する - GitHub Docs https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/crea... Githubから届いたDeprecation Noticeメールに対応する - Qiita https://qiita.com/hiro5963/items/da0b9bcfa512bf0cb833 Homebrew使用後、GitHubから「Deprecation Notice」メールが来た話 - Qiita https://qiita.com/nafuka/items/cfcf9b35163e3146dc84 GitHubでhttpsのパスワード認証が廃止された。Please use a personal access token instead. - Qiita https://qiita.com/shunsa10/items/e43564cf48f84b95455b GitHubは2021年8月13日以降はパスワードではなくアクセストークンでの認証が必要になる 具体的には、以下のようにPULLはできるがPUSHができなくなる(対象が非公開リポジトリの場合、PULLもできなくなる)
$ git pull Already up to date. $ git push Logon failed, use ctrl+c to cancel basic credential prompt. Username for 'https://github.com': refirio remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information. fatal: unable to access 'https://github.com/refirio/levis.git/': The requested URL returned error: 403
この場合、GitHubにログインしてトークンを発行する必要がある Setting → Developer settings → Personal access tokens → Generate new token 一例だが以下のように入力 Note: Sourcetree for Personal Expiration: No expiration Select scopes: repo (Full control of private repositories) 「Generate token」ボタンをクリック 以下のようにトークンが表示されるので、これをSourcetreeなどでパスワードの代わりに使用する トークンは作成直後しか確認できないので注意
Make sure to copy your personal access token now. You won’t be able to see it again! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
上記で対応できたが、環境によっては ・Sourcetreeからは相変わらず「Support for password authentication was removed on August 13, 2021.」のエラーになる ・ターミナルからならPULLなどを実行できる。ただし毎回ユーザ名とパスワードを求められる という状態になることがあった この場合、以下の記事を参考にして GitHubのパスワード認証廃止でSourcetreeで403エラーが発生して解決策がわからなかったのでまとめておく - Qiita https://qiita.com/mamoru6344/items/ea4a34c8eec26bb60e69 Sourcetreeで「設定 → origin → 編集 → URL/パス」を以下のように変更すると問題が解消した https://github.com/[ユーザ名]/[リポジトリ名].git ↓ https://[アクセストークン]@github.com/[ユーザ名]/[リポジトリ名].git 具体的には以下のように変更した 恐らく、新規にPULLするときは同じ対応が必要になると思われる (ただし逆に、アクセストークンなしのURLにしないと繋がらないこともあった。よく解らず) https://github.com/refirio/levis.githttps://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@github.com/refirio/levis.git なお作業環境によっては以下のエラーが表示されたこともあったが、 鍵を切り替えるのではなくアクセストークンに切り替えることで対応できた
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origin ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type. Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
【解決方法(画像付き)】急に。git pushしたら「Please make sure you have the correct access rights and the repository exists.」 | 武骨日記 https://kenjimorita.jp/please-make-sure-you-have-the-correct-access-rights-and-the-repository-exists... Macで発生した SSHキーを発行して登録し直すことで解消できた ■Bitbucketで認証できない SourcetreeからBitbucketへアクセスする際、通常のパスワードではなくアプリパスワードを求められることがある この場合、Bitbucketでアプリパスワードを作成し、SourcetreeではBitbucketのパスワードではなくアプリパスワードで認証するといい 二段階認証設定したBitbucketをSourceTreeで使う | 電脳ノート https://dennou-note.blogspot.com/2019/11/bitbucketsourcetree.html GitHub - sourcetreeを導入後、プッシュしようとしたらcredentialHelperSelectorと出たんですがこれはなんですか?|teratail https://teratail.com/questions/253792 基本的には「manager」を選択すれば良さそう ■Bitbucketで認証できない2 2022/03/10にBitbucketからPULLしようとしたら、以下のエラーが表示された アカウントパスワードでの認証は廃止され、アプリパスワードで認証するように変更されたらしい
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origin remote: Bitbucket Cloud recently stopped supporting account passwords for Git authentication. remote: See our community post for more details: https://atlassian.community/t5/x/x/ba-p/1948231 remote: App passwords are recommended for most use cases and can be created in your Personal settings: remote: https://bitbucket.org/account/settings/app-passwords/ fatal: Authentication failed for 'https://bitbucket.org/refirio/test.git/'
以下で解説されている App passwords | Bitbucket Cloud | Atlassian Documentation https://ja.confluence.atlassian.com/bitbucket/app-passwords-828781300.html 二段階認証設定したBitbucketをSourceTreeで使う | 電脳ノート https://dennou-note.blogspot.com/2019/11/bitbucketsourcetree.html 以下は実際に作業した時のメモ まずは、Bitbucketでアプリパスワードを作成する 設定の「アプリ パスワード」ページを開く https://bitbucket.org/account/settings/app-passwords/ 「アプリパスワードの作成」ボタンをクリック 「詳細」Labelに「Sourcetree」と入力 「権限」はすべての項目にチェックを入れておけばいい(もしくは必要に応じて取捨選択する) 「作成」ボタンをクリック 「新しいアプリパスワード」が表示されるので控えておく (このパスワードは再表示できないので注意) 次に、Sourcetreeにアプリパスワードを設定する メニューから「ツール → オプション」を選択 「認証」タブ内に表示されるアカウントを選択し、Bitbucketのアカウントの「編集」をクリック Credentialの「認証」を「Basic」にし、「パスワードを再読み込み」をクリック 先の手順で控えていたパスワードを入力する 解説によるとこれで完了のようだが、相変わらず同じエラーが表示された 以下は引き続き作業した内容 SourceTree + Bitbucketで認証エラーが出る場合の対処方法 on Windows | TeraDas https://www.teradas.net/archives/29134/ 上記ページにある「GCMW導入と認証情報のリフレッシュ」を試すとパスワードを聞いてきた (この作業により、「Gitバージョン」が「Embeded」から「System」に変更されることになる) プルはできるようになったが、プッシュの際にブランチが表示されなくなった Sourcetreeのプッシュ時にブランチが表示されない状態を解消したい https://teratail.com/questions/217580 Sourcetreeをバージョンアップして再起動しても変化なし メニューから「ツール → オプション → Git」を選択 先の手順で「Gitバージョン」を「System」にしていたが、再度「Embeded」に変更してみた これでPULLすると「credentialHelperSelector」のウインドウが表示されたが、「manager」を選択して進めた sourcetreeを導入後、プッシュしようとしたらcredentialHelperSelectorと出たんですがこれはなんですか? https://teratail.com/questions/253792 これで、再度プルとプッシュができるようになった ■Bitbucketで認証できない3 上にある「「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」と表示されてBitbucketからPULLできない」の 「サーバは上記で対応できたが、SourcetreeでPULLやPUSHが実行できないようになった」以降も参照 ■Bitbucketで認証できない4 Mac+Sourcetreeで発生 一度CloneやPullに成功したが、数日後に試すと「Permission denied (publickey)」というエラーが表示された macOS で再起動しても ssh agent に秘密鍵を保持させ続ける二つの方法 - Qiita https://qiita.com/sonots/items/a6dec06f95fca4757d4a Macでは鍵を作成しても、再起動すると消えてしまうらしい .ssh/config に特別な記述(後述)を行うことで、内容を保持できるようになるらしい また、作成した鍵はBitbucketに登録しておく Mac版のSourceTreeでプル/プッシュするときに「Permission denied」と言われる場合の対処方法 / icoro https://www.icoro.com/2019060710275 上記を参考にターミナルで作業 .ssh/config に以下を記述した
Host * UseKeychain yes AddKeysToAgent yes
続いてSourcetreeのアカウント設定画面で「SSHキー」欄からキーを作成 以下のように作成されたことを確認できた
% ls -l total 32 -rw-r--r--@ 1 refirio staff 322 7 31 18:24 config -rw-r--r--@ 1 refirio staff 95 7 27 19:22 known_hosts -rw-------@ 1 refirio staff 3478 7 31 18:24 refirio-Bitbucket -rw-r--r--@ 1 refirio staff 813 7 31 18:24 refirio-Bitbucket.pub 18:39
Personal settingsにアクセス https://bitbucket.org/account/settings/ 「SSH鍵」にアクセスし、公開鍵「refirio-Bitbucket.pub」の内容を登録した これでPULLできるようになった …が、再起動するとまたエラーが表示されるようになった Cloneの際に「SSH」のURLを使用していたが、「HTTPS」のURLを使用するように変更した (アカウント設定の「プロトコル」も「HTTPS」に変更し、すでにClone済みのプロジェクトもURLを変更した) アプリパスワードなどを求められるかと思ったが、これでCloneできるようになった (キーチェーンのパスワードを求められたが、Macのログインパスワードを入力すると完了した) Macを再起動しても問題は無かった ■ときどき「Askpass.exe - アプリケーション エラー」と表示される ※未解決 SourcetreeやGitを操作中か否かに関わらず、ときどき以下のエラーが表示されるので調べたメモ - - - - - - - - - - Askpass.exe - アプリケーション エラー アプリケーションを正しく起動できませんでした (0xc0000142)。[OK] をクリックしてアプリケーションを閉じてください。 [ OK ] - - - - - - - - - - Askpass.exe の「アプリケーションを正しく起動できませんでした」というエラーへの対処 (仮) - Ewig Leere(Lab2) https://labor.ewigleere.net/2021/03/05/askpass_error_from_sourcetree_1/ Askpass.exe の「アプリケーションを正しく起動できませんでした」というエラーへの対処 (アカウント追加編) - Ewig Leere(Lab2) https://labor.ewigleere.net/2021/03/06/askpass_error_from_sourcetree_2/ askpassのことを書いておく - なんかかきたい https://t-cyrill.hatenablog.jp/entry/2018/02/09/205930
バージョンアップ
IntelliJ IDEA起動時にGitが古いと警告が表示されるのでアップデートしたときのメモ Gitのバージョンは以下のコマンドで確認できる
>git --version
Git Bashを手動でアップデートする方法【Git for Windows】 | 己で解決!泣かぬなら己で鳴こうホトトギス https://onoredekaiketsu.com/manually-update-git-bash/ Git Bashで以下を実行した
>git update-git-for-windows
完了し、Git Bashでのバージョン表記は最新になったが、コマンドプロンプトからのバージョンは変わらなかった コマンドプロンプトから同コマンドを実行しようとするとエラーになった 【Git】インストール済みのGitをアップデートする【Windows環境】 | かずさプログラマーの雑記帳 https://kazusa-pg.com/installed-git-update/ 2.13以前だと使えないらしいので、公式サイトからダウンロードしてインストール (インストール時、古いGitを削除する旨の文言が表示されていた) これでコマンドプロンプトでのGitバージョンも最新になった また、IntelliJ IDEA起動時に警告は表示されなくなった
Gist
※未検証 GitHubの提供している断片コードの共有サービス 初めてでも分かる「GitHub Gist」の使い方【サイトへの埋め込み手順なども解説】 - 副業ベース(旧 bryog)- 副業でお金を稼ぎたい人のよりどころ https://bryog.com/how-to-use-github-gist/ Github Gistの良いところ、悪いところ - Qiita https://qiita.com/YumaInaura/items/d8ba7ce702d844f11ae0

Advertisement