Why does my player not move towards the raycast hit in this script?

I cannot figure out why this code does nothing and doesn’t move the player at all
(yes I reference the player object correctly)

void Update() {
    if (Input.GetButtonDown("Fire1")) {
        Shoot();
    }
}

void Shoot() {
    RaycastHit hit;
    if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, range)) {
        player.transform.position = Vector3.MoveTowards(player.transform.position, hit.transform.position, grappleSpeed * Time.fixedDeltaTime);
    }
}

Check out this brand-new script this can help you
using UnityEngine;

public class GrapplingGun : MonoBehaviour {

    private LineRenderer lr;
    private Vector3 grapplePoint;
    public LayerMask whatIsGrappleable;
    public Transform gunTip, camera, player;
    private float maxDistance = 100f;
    private SpringJoint joint;

    void Awake() {
        lr = GetComponent<LineRenderer>();
    }

    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            StartGrapple();
        }
        else if (Input.GetMouseButtonUp(0)) {
            StopGrapple();
        }
    }

    //Called after Update
    void LateUpdate() {
        DrawRope();
    }

    /// <summary>
    /// Call whenever we want to start a grapple
    /// </summary>
    void StartGrapple() {
        RaycastHit hit;
        if (Physics.Raycast(camera.position, camera.forward, out hit, maxDistance, whatIsGrappleable)) {
            grapplePoint = hit.point;
            joint = player.gameObject.AddComponent<SpringJoint>();
            joint.autoConfigureConnectedAnchor = false;
            joint.connectedAnchor = grapplePoint;

            float distanceFromPoint = Vector3.Distance(player.position, grapplePoint);

            //The distance grapple will try to keep from grapple point. 
            joint.maxDistance = distanceFromPoint * 0.8f;
            joint.minDistance = distanceFromPoint * 0.25f;

            //Adjust these values to fit your game.
            joint.spring = 4.5f;
            joint.damper = 7f;
            joint.massScale = 4.5f;

            lr.positionCount = 2;
            currentGrapplePosition = gunTip.position;
        }
    }


    /// <summary>
    /// Call whenever we want to stop a grapple
    /// </summary>
    void StopGrapple() {
        lr.positionCount = 0;
        Destroy(joint);
    }

    private Vector3 currentGrapplePosition;
    
    void DrawRope() {
        //If not grappling, don't draw rope
        if (!joint) return;

        currentGrapplePosition = Vector3.Lerp(currentGrapplePosition, grapplePoint, Time.deltaTime * 8f);
        
        lr.SetPosition(0, gunTip.position);
        lr.SetPosition(1, currentGrapplePosition);
    }

    public bool IsGrappling() {
        return joint != null;
    }

    public Vector3 GetGrapplePoint() {
        return grapplePoint;
  }

}

Components you should add to your grappling gun:
1:- LineRender (set the size to 0.06, set the line to default line.

Tags:
1:- Add the tag any tag to the object which you want to grapple.

Setup:
1:- in unity under your grappling gun script set the layerMask what is grappleable to the tag which you have been set to the objects which you want to grapple.
2:- transform player into your grappling gun script.
3:- transform camera into your grappling gun script.
4:- transform your grappling guntip into your grappling gun script.