extern int i;

は、「 i という識別子が外部スコープにあるからそいつをint型として扱ってくれよろしく。」と読め。

static int i = 1;

は、
「iというint型変数をこのスコープに宣言する。staticなんで他のファイルからは見えないからよろしく。
初期化は1で。」

と読め。

どちらも矛盾していない。