Pushforward and pullback are very basic operations in algebraic geometry, as is the adjointness between them. I worked out a very careful of adjointness of sheaves (below) when I was working out of Hartshorne - however, I still find this theorem somewhat mysterious.

$\textbf{Question:}$ While I am comfortable with using this fairly abstract yet basic theorem, I feel like I should understand it a little better. How do you understand adjointness of sheaves? Is it clearly true if we make some (weak?) additional conditions? Is there a way to think about it to make it more transparent, more believable or even obvious? Please feel very free to work in the case of complex algebraic geometry, etc.

I tried to give a shorter, heuristic proof of adjointness using the etale space of a sheaf - but I got lost checking details. I would be very grateful if someone more knowledgeable could tell me if such a proof exists.

$\textbf{Thm}$ Let $(X, \mathcal{O}_X) \xrightarrow{f} (Y, \mathcal{O}_Y)$ be a morphism of ringed spaces and $\mathcal{F}, \mathcal{G}$ be sheaves of $\mathcal{O}_X, \mathcal{O}_Y$ modules respectively. Then, we have a canonical bijection of sets $$ \textrm{Hom}_{\mathcal{O}_X} (f^*\mathcal{G}, F) = \textrm{Hom}_{\mathcal{O}_Y} (\mathcal{G}, f_*\mathcal{F})$$

Your comments and answers will be very appreciated!

firstprove the result for topological spaces without the data of structure sheaves (i.e., treat the case of "ringed" spaces using the constant sheaf $\mathbf{Z}$ on each, which is to say just abelian sheaves). Once you have that, which is where the actual "grunt work" happens, then you can upgrade to insert structure sheaves and use sheaves of modules over those by tracking functoriality with respect to the action of such sheaves of rings on underlying abelian sheaves of some sheaves of modules (with the help of localizing on $X$ and $Y$ at times). $\endgroup$