Open4

Git

harukaharuka

他のPCで作成したGit Branchがみえなかった時の対処

家の PC にてブランチを立ち上げ作業し、数日後に会社でそのブランチが見えずにドキドキしたときの対応について記録しておきます。

新ブランチがない。やばい
別の PC からブランチを確認するときは下記のコマンドをつかってまずは確認する

git remote -a

practice-Netlify-react$ git branch -a
* master
  remotes/origin/master

ありません。家で頑張って作ったはずのブランチがありません!!!なんたること

新ブランチを見つけてやる
色々調べると。リモートの情報がローカルの git に反映されてないなからおこるとのことです。なのでここでリモートの情報を取得します

fetch --all

そして再度 remote -a を行うと

practice-Netlify-react$ git branch -a
* master
  new-branch
  switch
  remotes/origin/master

ありました
ありました!!やったね!!ありました. new-branch ありました。 ブランチを移動

git switch new-branch
確認してみます

practice-Netlify-react$ git branch -a
  master
* new-branch
  switch
  remotes/origin/master

めでたしめでたし。 ところで最近は git switch がいいみたいですね。ついでに勉強になりました。

harukaharuka

.gitignoreが効かない場合の対処

.gitignore に指定してるはずのフォルダーが毎回トラック対象となり GitHub にアップロードされてしまうことがあります。再度、.gitignore を書き換えても効果がありません。こういうときの原因は、一度トラック対象としてしまったので対象外にできないということが発生しています。

Git CLI での対応方法
対象から外してあげましょう

git rm --cached -r .vs

git rm は —cached をつけないとファイル自体を消してしまうのでしっかり注意して使いましょう。このコマンドを使うと .vs を対象から外したことになります。

harukaharuka

泣きながらGitで過去に戻した手順

先ほど、なにやらサーバーにあるコミットをPullしたとろこ Unityの設定がメタメタになりました。UnityのファイルをGit管理していて Sceneのファイルがマージ。そのコンフリクトを手で直す羽目に…

いやになってPullするまえに戻すことにした思い出です。

Gitで過去に戻る手順

$ git reflog

$ git reflog
5369388 (HEAD -> master, origin/master) HEAD@{0}: commit: try to change layer
2af83f3 HEAD@{1}: commit: change to web layout
4965255 HEAD@{2}: commit: add information
5b9d9f0 HEAD@{3}: commit: score, title
55c9ee2 HEAD@{4}: commit: add reset button
808768c HEAD@{5}: commit: add score function
06877a5 HEAD@{6}: commit: .gitignore update
ef7af0a HEAD@{7}: commit (initial): first commit

下記コマンドで戻りたいところに移動できます。

$ git reset --hard HEAD@{?}

この2つのコマンドで過去に戻れました。もう二度と Unityの Sceneのマージはしません。神に誓います。

どうすれば??
とはいえバージョン管理は必要です。c#のスクリプトなら問題ないのですが Sceneのマージとなると手動マージが入った時点で死にます。このあたりは今後どうするか考えていこうとおもいます。とはいえ上記の手段があれば最悪少し過去には戻れるのでそんなに深刻ではなかったりしたりしますが。

harukaharuka

Git Remote Branchとの接続が壊れた

何もしていないのに壊れた。そう。よく聞く話です。僕も何もしていないのに今朝不幸に出会いました。

ここ数カ月仕事をしているBranchがPush 99を示しています。移動してみると、追跡ブランチがリモートに存在していません。

解決策

壊れてしまった参照を解決するために下記のファイルを削除しもう一度リモートブランチとローカルブランチを繋ぎなおす作業をして無事復旧しました。同様な問題に直面し、他のサイトをみても解決しない場合は、必ずソースコードを手動でバックアップしてから試してみてください。

$ rm .git/refs/remotes/origin/troubleBranch

$git branch -u origin/troubleBranch
Branch 'troubleBranch' set up to track remote branch 'troubleBranch' from 'origin'.

それまでの模索と便利なコマンド群の解説

私はVisual Studioで作業をしているのですが、突然朝作業を始めるとPushの項目に99のマークがいた。Pushする内容をみると、Branchを作成した直後からほぼすべてのCommitの内容がリストされています。

Visual Studioのエラーメッセージは「現在のブランチは、リモートブランチを追跡しません 」Pushしてあらたなリモートブランチをおこしましょうという旨のメッセージがでている。そんなわけあるのか?とおもい、ブラウザーでGitHubを確認したところ該当のブランチは存在しています。昨日のコミットもみれます。他のPCからPullもできました。

どうやらこの作業PCに問題があることがわかりました。こういうときは絶対このPCから無理やりPUSHするのはやばいとGit経験から理解していましたので慎重にことをすすめることにしました。

Visual StudioのGitの機能は限定的なのでCommand Promptを起動します。

まずは状況を把握。。。

git status
On branch troubleBranch
Your branch is based on 'origin/troubleBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)```
  

確実におかしい様子がみてとれます。とりあえずGitの提案するコマンドを打ってみようとおもいます。この万度は、リモートブランチとローカルブランチの関係をいったん削除するというコマンド

その後、改めて関係性構築のをしてみました。

$ git branch --unset-pustream

$ git branch -u origin/troubleBranch
error: the requested upstream branch 'origin/troubelBranch' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use

全然だめです。おちつこう。ステータスをみてみようか。git branch -vv もなかなか使いでのあるコマンドです。覚えておこう。

$ git branch -vv
* troubleBranch   abcd99gh yesterdayCommit
  master          ewfsffd1[origin/master: behind 1] Merge branch 'master' of http://xxx

トラブル中のブランチはローカルにあってリモートとはつながってない状態とみえます。でもこの状態でリモートブランチを再度つなげることができません。。。

とりあえずまたもやgitのアドバイスを行ってみる。

$ git fetch
error: cannot lock ref 'refs/remotes/origin/troubleBranch': unable to resolve reference 'refs/remotes/origin/troubleBranch': reference broken
From http://xxx
 ! [new branch]      troubleBranch -> origin/troubleBranch  (unable to update local ref)

なんとなくリモートにあることはわかってくれたけどうまくいかないと言っている。困った。困った。ここでさらにネットで何らかの解決策がないか捜査したわけです。

github reference broken #3838

ここに類似の状態のエラーかたのQAがありました。Mr shiftkeyさんが回答してくれています。ふむふむ。.gitのあるファイルを削除して。。。

確かに!参照がこわれていてコマンドで修正できないならいったん亡き者にするのは理にかなっている。でも少し怖かったので、手動でフォルダーごとバックアップをしてから作業に。

どうやらremoteの情報は .git/refs/remotes/origin にファイルとしてブランチごとに存在しているようです。

$ rm .git/refs/remotes/origin/troubleBranch

$git branch -u origin/troubleBranch
Branch 'troubleBranch' set up to track remote branch 'troubleBranch' from 'origin'.

$ git branch -vv
* troubleBranch   abcd99gh [origin/troubelBranch: behind 1] yesterdayCommit
  master          ewfsffd1[origin/master: behind 1] Merge branch 'master' of http://xxx

おめでとう!優勝です!!全回復しました。その後、お試しコミットもPullも問題なくうごきました。2時間ほど冷や汗をかきました。めでたしめでたし

## 参考ページ

https://github.com/desktop/desktop/issues/3838