個人的Gitトラブルシューティング

最終更新：2020/03/02
# 趣旨

Gitを使い始めてからまだ一ヶ月ほど。
本も読まず自己流でやってきたので、今一つ使い方が分からなったり、トラブル連発だったりするので、レファレンスとして作成しておきます。
随時追加。

<font color = "#AAAAAA">余談ですが、大学の別キャンパスから本を取り寄せ予約したら、二日後に図書館から「予約リスト見てなくて、他の人に貸しちゃったﾃﾍｯ　二週間後に取りに来てね！」と、~~一言も謝罪の言葉の無い~~メールが届いたので、到着日を空けておいたのに、挙句予定より早く到着したみたいで、「3日以内に取りに来ないと返しちゃうからねっ」と、~~ヤンデレ~~図書館に振り回されている僕です。</font>

## 環境

- Windows x64 (LAPTOP/DESKTOP)
- Git 2.25.0 (64bit)
- RStudio 1.2.5033
- Git・GitHubは個人利用目的。

# 基本操作編

## ブランチの変更を他のブランチに反映させる。

ブランチの作業をmasterに反映させたり、逆にmasterの変更をブランチに反映させるとき。

<br><br>
**処方箋**

これがまさにmergeのやりたいこと。

（変更元）hoge⇒fuga（反映先）の場合、fugaに移動してからhogeをmergeする。

```
$ git checkout fuga
$ git merge hoge
```
https://www.p-nt.com/technicblog/archives/185

## なんかもうIndexがハチャメチャ...

特に特定のエラー文があるというより、権限を弄りすぎたり、手動でIndexからファイルを消したり、とにかくもう自分で何やったか分からなくなったとき。

<br><br>
**処方箋**

落ち着いてリセットしよう。

```
$ rm .git/index
$ git reset
```

http://www.nowhere.co.jp/blog/archives/20130822-205501.html
http://www-creators.com/archives/1282









## merge と rebaseの違いがよくわからない
`rebase`は、masterをブランチに、ブランチをmasterに入れ替えるようなイメージ。
`merge`は変更を取り込むだけで、master・ブランチの関係性に変化はない。
通常は`merge`でよい。
http://www-creators.com/archives/1943



# リモート編

## Gitくん「コンフリクトがあるぞー。」

こういうやつ。

```:sample.txt
<<<<<<< HEAD
hoge
=======
fuga
>>>>>>> 5b90aa6697367e6aaf68edbffbf6771167a94bc2
piyo
```

<br><br>
**処方箋**

まずはhogeかfugaのいずれか要らない差分を消す。今回はfugaを消し、hogeを残す。
各種エディタで編集して上書き保存しましょう。

```:sample.txt
hoge
piyo
```

その上で、次のコマンドを叩く。

```
$ git add sample.txt
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)
```

`All conflicts fixed but you are still merging.`とあればOK。最後に`git commit`すれば完了です。

```
$ git commit
Merge branch 'master' of github.com:hoge/fuga

# Conflicts:
#	sample.txt
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#	.git/MERGE_HEAD
# and try again.


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 1 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)
#
# All conflicts fixed but you are still merging.
#
```




## Gitくん「他人のプッシュがあるぞー。」

~~僕しか使ってないリポジトリなのにPushすると何故か頻繁に出てくるエラー。~~
原因が判明。
一旦Pushした後にローカルでAmendし、再度Pushするとこの症状が出る。

```
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'c:\hoge'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

<br><br>
**処方箋**

まず大原則として・・・
> <B>基本的に一回PushしたCommitをAmendしないこと!!!!</B>


その上で、Amend後の場合はコレ参照。
https://gotohayato.com/content/445/

それ以外の場合、今のところ、どっちかやれば解決してる。
理由は分からない。

```
$ git fetch
$ git rebase origin/master
```

```
$ git pull --rebase origin master
```

https://www.softel.co.jp/blogs/tech/archives/3569


























# RStudio × Git 編

## RStudioから起動したShellからSSH通信できない。
**これマジ深刻。ググっても何にも引っかからないし、色々試しまくりました。**

`Git > More > Shell`でGit Bashを起動すると、こんな感じになります。

```bash:一回目
username@PC_NAME MSYS ~/Documents/hoge/fuga (master)
```
そしてシェルを一旦閉じてもう一度開くと・・・。

```bash:二回目以降
username@PC_NAME MSYS c/Users/username/Documents/hoge/fuga (master)
```

つまり、一旦シェルを閉じてしまうと、その後何故か絶対パスでの表示になり、さらに`.ssh`が見つからないなどと宣われます。その結果PushもFetchもできない・・・。

で色々調べると、ホームディレクトリがおかしくなっていることが判明しました。さらに余計な記号`=`までついてくるので非常に厄介です。

```bash
# 一回目
$ echo $HOME
/c/Users/username

# 二回目以降
$ echo $HOME
/c/Users/username/Documents/hoge/fuga/=
```

<br><br>
**処方箋**
ようやく見つけました。
https://github.com/rstudio/rstudio/issues/3663

結論から言うと、単なるRStudioのバグでした。修正された模様です。
ですが **安定版（1.2.5033)には反映されていない** ようなので、開発版をダウンロードします。
https://dailies.rstudio.com/
私の場合、Ver.1.3.881にアップデートすることで解決しました。

# その他

## 参考になる書籍やサイトは？

- [いちばんやさしいGit&GitHubの教本 人気講師が教えるバージョン管理＆共有入門](https://book.impress.co.jp/books/1118101036)<BR>大学の図書館で借りて読みました。<BR>全編オールカラーで、説明も初心者向けで分かり易く、Gitの操作からGitHubの連携まで、痒いところに手が届く感じが良かったです。<BR>僕のように、Gitがとっつきにくいと感じる人にはおすすめ。<BR><BR>
- [Pro Git Book](https://git-scm.com/book/ja/v2)<BR>Git本家のヘルプ書。<BR>ヘルプの内容はウェブページで見れるほか、なんとPDFで無料配布という太っ腹。書籍版も販売中。<BR>一発目がコレだと少し難しいので、ある程度Gitに慣れた人向けかもしれない。<BR>本家だけあって、流石の情報量。