Думаю, у вас может быть несколько неправильных представлений, которые влияют на вас больше, чем что-либо, что технически неправильно.
Во-первых, вы должны, как правило, не передавать непосредственно основной ветке.Из того, как вы описали свою ситуацию, я не уверен, что это происходит или нет, но если это так, постарайтесь не делать этого.
Если вы обнаружите, что что-то не может быть чисто слито с мастером, вы не должны пытаться решить проблему самостоятельно. Вместо этого вы должны устранить проблему в ветви функции. Как только вы устраните проблему там, вы можете с легкостью слиться с мастером.
Что касается rebase, отлично использовать rebase, пока вы не нажмете на удаленный репозиторий. После того как вы что-то нажали на удаленное репо, вы не хотите переустанавливать, так как тогда вы запутываете историю для кого-то другого, и git не может реально разрешить это для вас. Так что не бойтесь rebase, просто знайте, когда использовать его и когда не использовать его.
Один из способов, по которым вы можете использовать переустановку здесь (опять же, предположив, что вы не нажали на ветку, удаленно), чтобы помочь с вашей проблемой - взять ветку функций, которая не может быть чистой, объединена с мастером и переустановлена на мастер. Это заставит вас решить проблему на этой ветке. После того, как он будет разрешен, слияние с мастером должно быть тривиальным (если мастер не был изменен снова в то же время), и вы можете чистое слияние с мастером.
Существует множество учебных пособий для git, и у них также будут хорошие примеры кода. Вот один из наиболее «классических», я считаю, что описанный здесь рабочий процесс работает хорошо. http://nvie.com/posts/a-successful-git-branching-model/
Обратите внимание: я не одобряю набор сценариев bash с именем «git flow», который пытается полуавтоматизировать рабочий процесс там (эти скрипты не очень хорошо работали для нас, когда мы их пытались), но сам рабочий процесс описанный там работает хорошо.