2021/05/28

GitHub の「master」と「main」

2020年末頃から GitHub のデフォルトブランチが「master」から「main」に変更になりました。GitHub をはじめた人がこの変更を知らない人が手順を間違えて「master」に push して放置していることがあります。

手動で master に push してしまうのが原因?

これは GitHub でリポジトリ作成すると「main」ブランチがデフォルトになったにもかからわず、手動コマンドで「master」に push してしまうことが多いようです。


% git push origin master

「main」と「master」の食い違いは最終的に、ブランチを移動する作業が必要ですが、ここでは割愛します。

master を checkout する

今回はデフォルトが「main」ブランチで、「master」ブランチで管理されたソースを pull/checkout してみます。

Git clone する

まずリポジトリをクローンして、プロジェクトフォルダに移動します。


% git clone https://github.com/アカウント名/リポジトリ名.git
% cd プロジェクト名

リモートブランチ(master)をローカルブランチ(master)に checkout

リモートブランチは「master」になっているので、ローカルブランチも「master」にあわせて checkout します。 -b は新しくブランチを作成してくれるオプションです。


% git checkout -b master origin/master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'master'

これでリモートブランチ「master」からソースもダウンロードされます。

ローカルブランチや origin の確認

ローカルブランチが「master」ブランチに変わったことを確認します。


% git branch
  main
* master

また origin を確認するとメインが main でその他 master ブランチも追跡していることがわかります。


% git remote show origin
* remote origin
  Fetch URL: https://github.com/アカウント名/リポジトリ名.git
  Push  URL: https://github.com/アカウント名/リポジトリ名.git
  HEAD branch: main
  Remote branches:
    main   tracked
    master tracked
  Local branches configured for 'git pull':
    main   merges with remote main
    master merges with remote master
  Local refs configured for 'git push':
    main   pushes to main   (up to date)
    master pushes to master (up to date)

  2020/11/02

あらかじめ Git 管理にあるファイルやディレクトリを .gitignore に追加するには、キャッシュをクリアが必要です。

キャッシュのクリア

ファイル


$ git rm --cached ファイル名

ディレクトリ


$ git rm --cached -r ディレクトリ名

.gitignore に追加してコミット

vi や エディタソフトなどで .gitignore にファイルを追加し、あとはコミットするだけです。

  2020/08/30

現在のブランチと同名で push や pull 

通常 Git でブランチの変更を行うような管理の場合、リモートとブランチ名を指定します。


$ git push -u origin master 

ただ、一人で開発する場合、大規模でない限りブランチを利用することはあまりないと思うので、


$ git push

のようにブランチ指定せずに実行もよいかも知れません。

これは、現在のブランチ名がリモートと同じという条件でなりたちます。

config にデフォルト設定する

現在の状態をデフォルトとする設定をします。


$ git config --global push.default current
$ git config --global pull.default current

config を確認すると、 push.default が current に設定されます。


$ git config -l
...
push.default=current
pull.default=current
... 

これで、ブランチ指定せずに現在の状態で pull、 push できるようになりました。

ただしグループ開発するような時は、省略はしない方がよいでしょう。

  2020/08/30

git pull や git push できなくなったとき、ブランチの間違いやファイルがコンフリクトしている可能性があります。

git pull エラー


$ git pull origin master
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
...

git pull は fetch と merge を両方実行しているので、コンフリクトが発生するとエラーになります。


$ git fetch
$ git merge origin/master

git push エラー


$ git push origin master
...
fatal: refusing to merge unrelated histories
...

マージを実行

マージを実行するとコンフリクトしています


$ git merge --allow-unrelated-histories origin/master
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトファイルを修正して、 commit & push します。


$ git add.
$ git commit -m 'confrict'
$ git push -u origin master

-u は --set-upstream の短縮形です。

  2019/05/28

・git clone が重い
・秘密のファイルを Commit してしまった

など、過去にファイルを Commit & Pull してしまった場合、問題ファイルをなかったことにしたい場合があります。

履歴の削除は「git filter-branch」を利用してできますが、破壊的に履歴変更するため事前バックアップするなど作業は自己責任で行ってください。

PHPサンプルスクリプト

destory_git_history.php

オブジェクト容量の大きいファイルを検出

git_find_big.sh で大きなオブジェクトを抽出


$ du -sh .git/objects 12M .git/objects
$ sh git_find_big.sh

「git_find_big.sh」は、gitコマンドを用いて「.git/objects/pack/pack」内の容量の多いオブジェクト順で抽出します。

履歴を抹消

抽出したファイルやディレクトリを削除 (refs/heads/master と refs/remotes/origin/master を書き換え)
※ディレクトリの場合は「git rm -r」


$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch ファイルパス' --prune-empty -- --all

ガベージコレクションを利用して、不要なオブジェクトやログを削除します。


$ git gc --aggressive --prune=now

git オブジェクトのリパックします。


$ git repack -A -d

強制的にPush


$ git push --force origin master

共同作業している場合は、clone してもらった方が安全かもしれません。

  2019/05/28

Gitignore にファイルを記述しても反映されない場合、キャッシュをクリアして commit & push してみる。

$ git rm -r --cached .bash_profile rm '.bash_profile'

ファイル名に「.」を指定して、全ファイルをターゲットにする事もできるが、ちょっと怖いので1ファイルずつ実行した。

  2011/12/01

会社で、SVN から Git に移行する流れになってきたので、今更ながら Git の基本をメモ。 手当たり次第なので、ところどころ間違いがあるかと思います。

リモート(origin)でリポジトリ作成

$ mkdir プロジェクト名 $ cd プロジェクト名 $ git init --bare --shared=true $ git --bare update-server-info

これで空のリポジトリが作成と、WebDav経由での公開設定

ローカル(master)

Titanium Studio の Team で AptanaGit を利用しようとしたが、どうにもこうにも作業コピーできない(?)ので、手動でコマンドすることに。

$ git clone http://サーバ/git/プロジェクト名

ローカルで Commit

TitaniumStudio に戻り Team > Commit を選択 TitaniumStudio Git

コメントを入れて、Commit したいファイルを、Unstaged Changes から staged Changes に移動して【Commit】 TitaniumStudio Git

リモートに push

リモート(origin) を選択すると push、SVN で言うリポジトリへの Commit となります。 TitaniumStudio Git TitaniumStudio ではコンソール上で赤文字(デフォルト色)で表示されるので、エラーが出たかと勘違いしますが、問題なく push できました。

コマンドだと大体こういう流れになるでしょうか?

$ git add 追加ファイル $ git add . $ git commit -m 'コメント' $ git remote add origin http://リモートサーバ/git/プロジェクト名 $ git push origin master

<< Top < Prev Next > Last >>