20190710のGitに関する記事は5件です。

Gitについて

【Gitについて】

ファイルのバージョン管理を行うツールの1つ

  • Gitで管理することで、自動で「編集者」「編集日時」が保存される為、ファイルが「いつ」 「誰によって」 「どこに修正があったのか」 がすぐに把握できる事が出来る

  • このGitを使用することによって、変更履歴をさかのぼってコードを元の状態に戻す事もでき、複数人での共同開発が可能となる

【Gitの基本的な用語】

・リポジトリ
→Gitで管理する対象になるディレクトリやファイルの事をさす

・ローカルリポジトリ
→自身のPC内にあるリポジトリ

・リモートリポジトリ
→リモートのサーバー内にて、管理や共有する為のリポジトリ(GitHubなど)

・ワークツリー
→リポジトリ配下のファイルを編集して自動的に保存される場所(コミット対象ではない、できない)

・インデックス
→編集したファイルをコミットする前の仮確定して置いておく場所(コミット対象)

・コミット
→リポジトリに編集内容を記録する事

【Git基本コマンド】

git init
→ローカルリポジトリを作成するコマンド

git add
→ワークツリーにあるファイルをインデックスに移動させるコマンド
git add . ファイル全て
git add ファイル名 指定ファイルのみ

git reset
→インデックスに追加したファイルをワークツリーに戻すコマンド

git commit(git commit -m”メッセージ”)
→ローカルリポジトリの変更内容を保存。コミットメッセージを入力

git log
→コミットログを確認するコマンド

git status
→ワークツリーとインデックスにあるファイルの状態を確認するコマンド

git branch
→ローカルリポジトリにあるブランチの一覧と現在選択中のブランチを確認

・ブランチのリスト表示 git branch
・ブランチの新規作成 git branch ブランチ名
・ブランチの削除 git branch -d ブランチ名

git checkout ブランチ名
→ブランチの切り替えコマンド
→ワークツリーのファイルの状態を元に戻す
git addした状態(インデックスに移動した状態)では戻せない

git checkout -b ブランチ名
→ブランチの作成とチェックアウトを同時に行うコマンド

git clone URL
→リモートリポジトリをローカルリポジトリにクローンする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git Ignoreを作成して、要らないファイルを管理させない

Git管理で、必要なファイルを纏めて管理外にするには、~/.gitignoreを作成して置くのは良いでしょう。

~/.gitignore
puts 'code with syntax'
# Folder view configuration files
.DS_Store
Desktop.ini

# Thumbnail cache files
._*
Thumbs.db

# Files that might appear on external disks
.Spotlight-V100
.Trashes

# Compiled Python files
*.pyc

# Compiled C++ files
*.out

# Application specific files
venv
node_modules
.sass-cache

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今までMacのGitで経験した環境トラブル集

今までMacのGitで経験した環境トラブル集

職場に新メンバーが加わった時とかに、Gitで色々なトラブルが起きました。
今回は、私が遭遇したトラブルをまとめてみました。
随時更新していこうと思います。

リモートリポジトリのパスワード関係

リモートリポジトリのパスワード入力を間違えていた。

基本的なことなのですが、入力を間違ているというパターンが意外とあります。

間違って入力したパスワードを、MacのKeyChainが記憶してしまっていた。

上記の件と関係するのですが、間違って入力したリモートリポジトリのパスワードを、KeyChainがキャッシュしてしまい、パスワード入力ができなくなってしまうというパターンがありました。

これは、KeyChainのキャッシュを削除すれば、パスワード入力ができるようになります。

プロキシ関係

Proxy配下のGitを作業していると、何かとトラブルが起きます。

Bashの環境変数に, http_proxy , https_proxy , no_proxy の設定ができていなかった。

コンソールで export コマンドを実行して満足して、 .bashrc にちゃんと追加できていなかったというパターンです。
基本的なことですが、意外とこれをやる人が多いです。

.bashrc.bash_profile に環境変数 http_proxy , https_proxy , no_proxy を設定しましょう。

.bashrc に設定すれば、自動で .bash_profile にも読み込まれますので、 .bashrc に書けば十分です。

https_proxy のスキームを勘違いして https:// にしていた。

http_proxyhttps_proxy は基本的には同じ値を入れることになるのですが、それを勘違いして、 https_proxy の方だけURLの先頭を https:// に変更している人がいました。

プロキシのURLにユーザー名・パスワードを追加するのを忘れていた。

認証プロキシの場合、プロキシに対するユーザー名とパスワードを設定する必要があります。そのため、環境変数の値はこんな風になります。

http://(ユーザー名):(パスワード)@(ホスト):(ポート)

git config --globalhttp.proxy , https.proxy の設定ができていなかった。

どうやら環境変数だけでは不足で、 git config --global にも設定が必要のようです。

git config --localhttp.proxy , https.proxy の設定を上書きしていた。

git config --local を使えば、リポジトリ毎にGitの設定ができますが、この設定は git config --global よりも優先されるため、ここに http.proxy , https.proxy を間違った値で設定すると、うまく接続できなくなります。

Gitのバージョンが古くて no_proxy に対応していなかった。

同一LAN内のリモートリポジトリに接続する場合、プロキシの設定が邪魔をします。
そのため、 no_proxy で、プロキシ設定から除外したいドメインを指定する必要があります。

Gitのバージョンが古くて、この no_proxy に対応していなかったということがありました。

no_proxy の値にスペースが混入していた。

export no_proxy=localhost, 127.0.0.1

のようにスペースが入ってしまっていたパターンがありました。

export no_proxy=localhost,127.0.0.1

のようにスペースをなくす必要があります。

メインシェルをZshに変えた際に、Zshの環境変数に, http_proxy, https_proxy, no_proxy を設定することを忘れていた。

環境変数というのはどうやらシェル毎に持っているものらしく、シェルがBashではないなら、 .bashrc の設定は継承されないようです。

Zshの場合は .zshrc に設定します。私は .zshrc から .bashrc を呼ぶようにしました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コンフリクトの発生原因について(merge)

rubyでコードを書く時みなさん基本的には作業用ブランチを作成して、主にそこでコード書く。完了したらcommitして、masterブランチにmergeする。
しかし初学者にありがちなmergeをしたら、(master|MERGEING)になってそこからgitコマンドが使えなくなった経験はございませんか??
そんな初学者向けに陥りやすい原因と解決策について一つのやり方(正しいかは別)として参考程度に考えていただけたらなともいます。

コンフリクトとは

相反する意見、態度、要求などが存在し、互いに譲らずに緊張状態が生じること。 対立、軋轢。プログラミング(ruby)に関しては主に現場ではgit cloneした時なんかに生じるエラーになるかと思われます。しかし、今回はbranch作成してmasterブランチでのmergeに起きるエラーについてかいていきます。

発生原因

基本的にはコンフリクトは「衝突」のような意味合いもあるので、mergeする際の衝突をイメージできるかと思います。
では、mergeの衝突を具体例を持って説明したいと思います。

1、1つのmergeしてないブランチを作成する
git checkout -b Test1

2、ここではREADME.mdファイルでのコンフリクトをさせるための文を書きます
ruby:README.md
'コンフリクト1を作成しました。'

3、保存が終わったらcommitまでしていきます。
git add -A
git commit -m Test1
git checkout master

4、mergeをせずに手順1にもどり同じことをする(TestとREADMEの数だけ変えています)

5、手順3まで終わったら今masterブランチにいる状態だと思います。ここでまず最初にコミットしたTest1をmergeします。
git merge Test1
ruby:README.md
'コンフリクト1を作成しました。'

空白だったとこに無事反映されています。

6、では次に2つ目に作ったTest2をmergeします。
git merge Test2
スクリーンショット 2019-07-10 7.55.32.png
すると次はエラーがでてしまいました。

7、ここの文だけでもREADMEファイルに問題があるのは明白なのですが、一応ステータスの方でも確認をしておきましょう。
git status
スクリーンショット 2019-07-10 7.58.13.png

赤文字でmodifiedとかかれファイル名もREADME.mdと書かれてますね。

8、次は問題のREADMEファイルをみてみましょう。
スクリーンショット 2019-07-10 8.03.22.png
先ほど文が2個表示されていますが、なにやらいらないものがついてきちゃってますね。
HEAD ... 最後にmergeしたもの
Test2 ... 2個めにmergeしたもの

まとめ

このように1つ目のブランチをmergeせずに2つ目のブランチ作成して作業するとこのように食い違いが起きるわけです。Test2mergeしようとしてもブランチにはコンフリクト1を作成しました。という文は含まれていないのですから、ここでコンフリクトという現象が発生します。特に初心者のかたはmergeをうっかり忘れて次のブランチを作成していまい、コンフリクトが発生する(私も何回かやっていました。笑)ので落ち着いてgit log等も確認しながら作業進めていきましょう!

すこしでも初学者のかたの役にたてたらなと思います
また、何か間違っているところ、こうした方がいい等のご意見いただましたらよろしくお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitでPushしたらfatal: The current branch ブランチ名 has no upstream branch.となった時の対応方法

  • 環境
    • macOS Mojave バージョン10.14.5
    • git version 2.21.0

事象 : 新規ブランチを作ってプッシュしたら怒られた

# masterブランチの状態で
$ git branch --contains=HEAD
* master

# branch-aブランチを新規作成して
$ git checkout -b branch-a
M fileName.md
Switched to a new branch 'branch-a'

# プッシュしたら怒られた
$ git push
fatal: The current branch branch-a has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin branch-a

原因 : 上流ブランチがないから

ローカルで作成したbranch-aの上流ブランチ(upstream branch)は origin/branch-a となってほしかったのだが、branch-aにそもそも上流ブランチがないために怒られた。
上流ブランチの意味はGit で「追跡ブランチ」って言うのやめましょうにとてもわかり易く書いてあった。

# branch-aの上流ブランチが・・・ない
$ git branch -vv
* branch-a 85c84de masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

# --set-upstreamって何?
$ git push --help
# 省略
       -u, --set-upstream
           For every branch that is up to date or successfully pushed, add upstream (tracking) reference, used by
           argument-less git-pull(1) and other commands. For more information, see branch.<name>.merge in git-config(1).
# (頑張った訳:日本語が難しいので[]とか{}とかを区切れ目に使っている)
# [最新の状態である]または[正常にプッシュされた]ブランチごとに、{引き数なしのgit-pull(1)や他のコマンドで使われる[上流ブランチ]}を追加します。
# 詳細については、git-config (1)にあるbranch.<name>.mergを参照してください。

怒られた時に対応 : オプションを付けてプッシュと一緒に上流ブランチを追加する

$ git push --set-upstream origin branch-a
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'branch-a' on GitHub by visiting:
remote:      https://github.com/username/repository/pull/new/branch-a
remote:
To https://github.com/username/repository.git
 * [new branch]      branch-a -> branch-a
Branch 'branch-a' set up to track remote branch 'branch-a' from 'origin'.

# branch-aの上流ブランチが・・・できた
$ git branch -vv
* branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

ブランチを作るときに対応

① ブランチを作る時に親ブランチを指定する

git pushとブランチの追跡 - Qiita
この方法は結果が「なんだかよくわからない状態」になってしまった・・・

# この方法は新規ブランチ専用の上流ブランチを作成できるわけではなかった
$ git checkout -b branch-b origin/branch-b
fatal: 'origin/branch-b' is not a commit and a branch 'branch-b' cannot be created from it

# masterの上流ブランチであるorigin/masterを親ブランチに指定すると
$ git checkout -b branch-b origin/master
M fileName.md
Branch 'branch-b' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'branch-b'

# 新規ブランチの上流ブランチは当然origin/masterとなり
$ git branch -vv
  branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント
* branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

# プッシュすると怒られて、選択肢を3つ提示される
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:master

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.

# 「リモート上の同じ名前のブランチにプッシュする」をやると
$ git push origin HEAD
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'branch-b' on GitHub by visiting:
remote:      https://github.com/username/repository/pull/new/branch-b
remote:
To https://github.com/username/repository.git
 * [new branch]      HEAD -> branch-b

# 上流ブランチはorigin/masterのままだけど
$ git branch -vv
  branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント
* branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

# リモートブランチとしてはbranch-bができる
$ git branch -r
  origin/HEAD -> origin/master
  origin/branch-a
  origin/branch-b
  origin/master

# リモートの情報をもっと見るとよくわからない状態になっていた
$ git remote show origin | grep -5 pull
  Remote branches:
    branch-a tracked
    branch-b tracked
    master   tracked
  Local branches configured for 'git pull':
    branch-a merges with remote branch-a
    branch-b merges with remote master
    master   merges with remote master
  Local refs configured for 'git push':
    branch-a pushes to branch-a (up to date)

② .gitconfigにローカルブランチと同じ名前の上流ブランチを使うように設定する

gitのpush.defaultに関するノウハウ - Qiita

# .gitconfigにcurrentを指定すれば
$ git config --global push.default current
$ cat ~/.gitconfig | grep -A 2 push
[push]
    default = current

# 新規にブランチを作成して
$ git checkout -b branch-c
M   fileName.md
Switched to a new branch 'branch-c'

# 上流ブランチはなくても
$ git branch -vv
  branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント
  branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント
* branch-c 85c84de masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

# リモートブランチに同じ名前のブランチがなくても
$ git branch -r
  origin/HEAD -> origin/master
  origin/branch-a
  origin/branch-b
  origin/master

# プッシュできる!
$ git push
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'branch-c' on GitHub by visiting:
remote:      https://github.com/username/repository/pull/new/branch-c
remote:
To https://github.com/username/repository.git
 * [new branch]      branch-c -> branch-c

# プッシュ後も上流ブランチはないけど
$ git branch -vv
  branch-a 85c84de [origin/branch-a] masterブランチ最後のコミットコメント
  branch-b 85c84de [origin/master] masterブランチ最後のコミットコメント
* branch-c 85c84de masterブランチ最後のコミットコメント
  master   85c84de [origin/master] masterブランチ最後のコミットコメント

# リモートブランチはちゃんとできる
$ git branch -r
  origin/HEAD -> origin/master
  origin/branch-a
  origin/branch-b
  origin/branch-c
  origin/master
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む