https://youtu.be/mJ8ZDdA10GY?t=2184 I was following this lecture and at this point in the lecture the professor starts discussing why it is easier to construct pull-backs between covector fields rather than to construct push-forwards between vector fields. He explains that a smooth function $h:M\rightarrow N$ (with $M$ and $N$ smooth manifolds) is enough to construct a pull-back from $\Gamma(T^*N)$ to $\Gamma(T^*M)$ (by $\Gamma(T^*M)$ I mean the set of covector fields on $M$) since, because the domain of $h$ is the entirety of $M$, the image of the pull-back will be the entirety of $\Gamma(T^*M)$.
But then he goes on to explain that one of the reasons for which defining a push-forward is not as simple is because the map by which we define it is not injective. Now, shouldn't injectivity be required to define a pull-back too? Reason being that if 2 ponts in $M$ can get to the same point, say $n$, in $N$ via $h$, when we construct the pull-back we must cover the entire $\Gamma(T^*M)$, but at the same time we can not allow pull-back at $n$ to point to 2 points in $\Gamma(T^*M)$ as it would no longer be a map.
Let's deal with the simple case where we have $h:\mathbb{R^n} \to \mathbb{R^m}$.
A covector field $v$ on $\mathbb{R}^m$ assigns to each point $m \in M$, a map $v_m: \mathbb{R}^m \to \mathbb{R}$. Now, how do I pull $v$ back to a covector field on $\mathbb{R}^n$? $h$ allows us to do two things. We need to assign to each point $n \in \mathbb{R}^n$ a covector as well. How do we do this? Well, for each point $n$, let us look at it's image $h(n)$. This point has a covector from $\mathbb{R}^m$, and by pre-composing with $h$ you get a covector at $m$.
What goes wrong with the pushforward? Given a vector field $v$ on $\mathbb{R}^n$. I need to assign a vector at every point $m \in \mathbb{R}^m$. The issue I run into is that if $h$ isn't injective then I'm not sure which point in $N$ to even push forward for a given point $m \in \mathbb{R}^m$. If I can find a unique point (i.e. if $h$ is injective) then I'm good!