技術的に間違っていることよりも、あなたに影響を与えているいくつかの誤解があるかもしれません。
まず、通常、マスターブランチに直接コミットしないでください。あなたがあなたの状況を説明した方法から、それが起こっているかどうかはわかりませんが、起こっている場合は、そうしないようにしてください。
何かをマスターにきれいにマージできないことがわかった場合は、マスター自体で問題を修正しようとしないでください。代わりに、機能ブランチで問題を修正する必要があります。そこで問題を修正したら、マスターにきれいにマージできます。
リベースに関しては、リモートリポジトリにプッシュするまでリベースを使用することはまったく問題ありません。リモートリポジトリに何かをプッシュした後は、リベースしたくありません。他の誰かの履歴を台無しにしているため、gitはそれを実際に解決できません。したがって、リベースを恐れないでください。いつ使用するか、いつ使用しないかを知ってください。
ここでリベースを使用して(問題のブランチをリモートでプッシュしていないと仮定して)問題を解決する方法の1つは、マスターにクリーンにマージできない機能ブランチを取得して、マスターにリベースすることです。これにより、そのブランチの問題を解決するように強制されます。それが解決されたら、マスターへのマージは簡単であり(マスターがその間に再び変更されていない限り)、マスターにきれいにマージできます。
gitで利用できるチュートリアルはたくさんあり、それらにも役立ついくつかの優れたコード例があります。これは、より「古典的な」ものの1つであり、ここで説明するワークフローはうまく機能すると思います。http://nvie.com/posts/a-successful-git-branching-model/
そこでワークフローを半自動化しようとする「gitflow」という名前のbashスクリプトセットを承認していないことに注意してください(これらのスクリプトは、試したときにうまく機能しませんでした)が、そこで説明されているワークフロー自体はうまく機能します。