why does it go the same direction if i give it different values

it goes the same direction when i give it values for up right and up left.

    if (Input.GetKey(KeyCode.LeftArrow))
    {
        GetComponent<Rigidbody>().velocity = new Vector3(-5, 0, 0);
    }

    if (Input.GetKey(KeyCode.RightArrow))
    {
        GetComponent<Rigidbody>().velocity = new Vector3(5, 0, 0);
    }

    if (Input.GetKey(KeyCode.UpArrow))
    {
        GetComponent<Rigidbody>().velocity = new Vector3(0, 5, 0);
    }

    if (Input.GetKey(KeyCode.UpArrow & KeyCode.RightArrow))
    {
        GetComponent<Rigidbody>().velocity = new Vector3(-5, 5, 0);
    }

    //which ends up doing the same thing as:

    if (Input.GetKey(KeyCode.UpArrow & KeyCode.LeftArrow))
    {
        GetComponent<Rigidbody>().velocity = new Vector3(5, 5, 0);

and i dont know why.
if anyone can help me with this i would be extremely greatful.

The values look correct but I think your if statements are wrong.

To check for two keys try this format:

if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow))

Not with both keys inside one GetKey call.

Why dont you do something like this. Then you can just setup up your user input from the manager.

public Rigidbody rb;
    
     void Update()
    {
    float xAxis = Input.GetAxis("Horizontal")
    float  yAxis = Input.GetAxis("Vertical")

// move player
        rb.MovePosition( transform.position * Time.fixedDeltaTime * currentSpeed);


            SpeedCalculations(new Vector2(xAxis, yAxis);
     }
    
    void SpeedCalculations(Vector2 input) 
     {
            if (input == Vector2.zero) return;
    
            if (input.x > 0 || input.x < 0)
               currentSpeed = strafeRunSpeed; //strafespeed
    
            if (input.y < 0)
              currentSpeed = backwardRunSpeed;//backwardsspeed    
    
            if (input.y > 0)
           currentSpeed = forwardRunSpeed; //forwards Speed
        }

First, let’s look at that last piece of logic you had:

if(Input.GetKey(KeyCode.UpArrow & KeyCode.LeftArrow))

The Ampersand ‘&’ you used signifies a bitwise AND operation. This takes the bits of each value and keeps only ones which match each other. Note that this is distinct from the logical AND ‘&&’ operator, which would have been more relevant to you here.

(int)KeyCode.UpArrow = 273
(int)KeyCode.LeftArrow = 276
273 & 276 = 272

         v    v
273 = 0001 0001 0001 (binary)
276 = 0001 0001 0100 (binary)
272 = 0001 0001 0000 (binary)
         ^    ^
// Where the bits are aligned in the same column on both numbers,
// those bits will remain after that bitwise AND operation.

// The bits that aren't included in both numbers are set to 0 instead.

// A fun side note:
(int)KeyCode.KeypadEquals = 272
// You would also move with this key in this situation

Obviously, that's not important in this situation, but it helps to have at least some idea of what happened here. Following the suggestion @Triqy made, it's much more sensible to either utilize Axis-driven control or to simply add the total values together:
public float movementSpeed = 5f; // Matching your example
private Rigidbody rb;
private Vector2 playerInput;

void Start()
{
	// Drastically improve efficiency by caching this
	rb = GetComponent<Rigidbody>();
}

void Update()
{
	// Register input during Update()...
	playerInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
}

void FixedUpdate()
{
	// Then use it during FixedUpdate() for physics-driven elements
	rb.velocity = new Vector3(playerInput.x, playerInput.y, 0f) * movementSpeed;
}

While there are other elements of this that aren’t optimal under typical circumstances (such as setting velocity directly), that’s not really important in the context of this question.