なんで主要言語がかわってしまうのか?

ほとんど正しく設定されますが、デモファイルやテストファイルの数が多いにつれて主要言語の表示が変わってしまうことがあります。

Linguist takes the list of languages it knows from languages.yml and uses a number of methods to try and determine the language used by each file, and the overall repository breakdown.

Linguistは、languages.ymlから認識している言語のリストを取得し、さまざまな方法を使用して、各ファイルで使用されている言語と、リポジトリ全体の内訳を判別しようとします。

https://github.com/github/linguist/blob/master/docs/how-linguist-works.md

解決方法

つまり、主要言語よりその他ファイルが多いからこうなりました。
主要言語ではない言語を対象外することで対応できそうです。
どこに書いておけば良いか?
.gitattributesです。
githubリポジトリのルートに作成してコミットすれば自動的に反映されます。
次はどん内容を書けば良いかを説明します。

ディレクトリの一部を無視します。(言語検出の対象とは見なさない)

static/* linguist-vendored

上記はstaticと子階層を含む全てのディレクトリを言語検出の対象外にするという意味です。

ディレクトリの一部をドキュメントと見なします。

docs/* linguist-documentation

上記はlinguist-vendoredと基本的は同じ動作ですが、ドキュメントで認識されます。

特定の拡張子(たとえば* .rb)を持つファイルを特定の言語と見なします。

*.rb linguist-language=Java

上記はrbファイルそ全てjava言語として言語検出の対象にするという意味です。