In Hatcher's book,the lifting criterion is stated as following:
Suppose given a covering space $p: (\tilde{X},\tilde{x}_0) \rightarrow (X,x_0)$ and a map $f: (Y,y_0) \rightarrow (X,x_0)$ with $Y$ path-connected and locally path-connected. Then a lift $\tilde{f}: (Y,y_0) \rightarrow (\tilde{X},\tilde{x}_0)$ of $f$ exists iff $f_*(\pi_1 (Y,y_0)) \subset p_*(\pi_1(\tilde{X},\tilde{x}_0))$.
The proof of "only if" part is obvious. I met with some problems when reading the proof the "if" part.
For any $y\in Y$,let $\gamma$ be a path in $Y$ from $y_0$ to $y$, then we can define $\tilde{f}(y)=\widetilde{f\gamma}(1)$.We need to show that the definition is well defined.Let $\gamma^{'}$ be another path in $Y$ from $y_0$ to $y$.Then $(f\gamma')\cdot(\overline{f\gamma})$ is a loop $h_0$ at $x_0$ with $[h_0]\in f_*(\pi_1 (Y,y_0)) \subset p_*(\pi_1(\tilde{X},\tilde{x_0}))$.*This means that there is a homotopy $h_t$ of $h_0$ to a loop $h_1$ that lifts to a loop $\tilde{h}_1$ in $\tilde{X}$ based at $x_0$.*How to deduce the above conclusion?
Applying the covering homotopy property to $h_t$ to get a lifting $\tilde{h}_t$.Since $\tilde{h}_1$ is a loop at $\tilde{x}_0$,so is $\tilde{h}_0$ .(Why?)
Since $[h_0 ]\in p_{\ast }\pi_1 (\tilde{X} ,\tilde{x}_0 )$, it follows that there is a loop $\gamma_1\colon\mathbb{S}^1\to\tilde{X} $ such that $\gamma_1 (1)=\tilde{x}_0 $ and $p_{\ast} [\gamma_1 ]=[h_0 ]$. Consider the loop $h_1 =p\gamma_1 $, it represents the same homotopy class as $h_0 $, hence there is a homotopy $h_t $ between them.
For the second one, note that we have $h_t (1)$ and $h_t (0)$ constant loops, hence $\tilde{h}_t (1)$ and $\tilde{h}_t (0)$ satisfies $p\tilde{h}_t (i)\equiv h_t (i)$, $i=0,1$. Therefore $\tilde{h}_t (i)\in p^{-1} (h_t (i))$, which is discrete and therefore constant.