GitHubのログがあまりにも汚くて困っております。このブランチ名を横一列にキレイに並べる方法はどうすればいいのでしょうか?コミットグラフが枝分かれしないようにしたいと考えています。
staging でテストして結果が問題なければmasterに上げるようにしています。今のところソースコード自体にstaging とmasterに違いはありません。
現在の状態はこのようになっております。

$ git graph
*   7e3b98e      (HEAD, origin/master, origin/HEAD, master) Merge branch 'staging'
|\
| * 6151ba5      (origin/staging, staging) Fix purchased job
| *   dcf83c1    Merge branch 'staging' of github.com:KlujePteLtd/kluje into staging
| |\
| | * b1e059a    Hide section testimonials
| | * a1e6763    Fix initializers/carrierwave
* | |   c5a607a  Merge branch 'staging'
|\ \ \
| |/ /
| * | a4bf0ea    Fix initializers/carrierwave

以前まではgit rebaseを使って以下のように横一列にしておりました。履歴は全て一直線(時に分かれても2つまで)でした。

$ git graph
* 8da8fde        (HEAD, origin/HEAD, origin/master, origin/staging, master, staging ) Add find_matches test
* 8b1aa58        Fix inviter Serializer
* 0c6daa1        Add venue invitation
* 7bd9478        Add byebug rails-erd gems
* d03ab72        Add find_matches test into RSpec User Model
* 928032a        Add positive_sort into User Model

どこかのタイミングで混沌とした状況になり、それ以降はgit rebaseを使ってもまったくキレイにならなくなり
手をかければかけるほど汚くなっていきます。

基本的なGit作業はこのようにしておりました。

$git branch
> staging
$git push origin staging
(staging環境にて動作確認)
$git fetch
$git rebase origin/master
$git checkout master
$git merge staging
$git push origin master

どうすればいいのでしょうか?

回答を元に作業を繰り返した結果

* c88832e        (HEAD, origin/master, origin/HEAD, staging, master) The last change
*   7e3b98e      Merge branch 'staging'
|\
* \   c5a607a    Merge branch 'staging'
|\ \
* | | c0c4d7e    Fix initializers/carrierwave
| | | * 48f91d5  (origin/staging) The last change
| | |/

unaristさんの回答とリンク先のスライドなどを何度も読み返すのですが、どうしてこんな結果になってしまうのかどうしてもよく分からないです。何度も申し訳ないのですが、なんとか解決方法を教えていただけないでしょうか?

この状態で

$ git push origin staging

をすると

! [rejected]        staging -> staging (non-fast-forward)

の警告が出ます。