Given these two examples.
You need to set an initial rotate(0), so there can be animation between the two states. Set the div's initial transform to:
transform: translateX(-50%) rotate(0);
Transition:
div {
  position: absolute;
  width: 150px;
  height: 40px;
  background: orange;
  left: 50%;
  top: var(--top);
  transition: transform 2s;
  transform: translateX(-50%) rotate(0);
  text-align: center;
  line-height: 40px;
  font-size: 1.2em;
}
div:hover {
  transform: translateX(-50%) rotate(var(--deg));
}
div:nth-child(1) {
  --deg: 180deg;
  --top: 20%;
}
div:nth-child(2) {
  --deg: -180deg;
  --top: 40%;
}
div:nth-child(3) {
  --deg: 360deg;
  --top: 60%;
}
body {
  overflow: hidden;
}180deg
-180deg
360degAnimation:
div {
  position: absolute;
  width: 150px;
  height: 40px;
  background: orange;
  left: 50%;
  top: var(--top);
  transform: translateX(-50%) rotate(0);
  text-align: center;
  line-height: 40px;
  font-size: 1.2em;
  animation: rotate 2s linear 2s forwards;
}
@keyframes rotate {
  to {
    transform: translateX(-50%) rotate(var(--deg));
  }
}
div:nth-child(1) {
  --deg: 180deg;
  --top: 20%;
}
div:nth-child(2) {
  --deg: -180deg;
  --top: 40%;
}
div:nth-child(3) {
  --deg: 360deg;
  --top: 60%;
}
body {
  overflow: hidden;
}180deg
-180deg
360deg