program tip

충돌을 미리 알려주는 일종의 'git rebase --dry-run'이 있습니까?

radiobox 2020. 12. 9. 08:02
반응형

충돌을 미리 알려주는 일종의 'git rebase --dry-run'이 있습니까?


리베이스를 스크립트하려고하는데 내 스크립트는 리베이스로 인해 충돌이 발생하는지 여부에 따라 다른 경로를 사용합니다.

리베이스를 실행하기 전에 리베이스로 인해 충돌이 발생하는지 확인할 수있는 방법이 있습니까?


작성 당시 (Git v2.6.1v2.10.0), git rebase명령은 --dry-run옵션을 제공하지 않습니다 . 실제로 리베이스를 시도하기 전에 충돌이 발생할지 여부를 알 수있는 방법이 없습니다.

그러나 실행 git rebase하고 충돌이 발생하면 프로세스가 중지되고 0이 아닌 상태로 종료됩니다. 당신이 할 수있는 일은 rebase 작업의 종료 상태를 확인하고 0이 아닌 경우 실행 git rebase --abort하여 rebase를 취소하는 것입니다.

git rebase ... || git rebase --abort

rebase 성공할 것인지 확인하고 "롤백" 하려면 항상 분기 팁 을 원래 커밋으로 다시 배치 할 수 있습니다 . 원래 SHA에 태그를 지정하거나 메모하기 만하면됩니다.

또는 더 쉬운 방법은 리베이스를 "스테이징"할 새 임시 분기를 만드는 것입니다.

git checkout your-branch
git checkout -b tmp
git rebase other-branch

성공했지만 "롤백"하려는 경우에는 your-branch그대로 둡니다. 그냥 git branch -D tmp당신이에서 시작 어디 수있는 좋은 방법입니다 다시.

충돌이 있었고이를 해결하기 위해 몇 가지 작업을 수행했고 이제 리베이스를 유지하려면 분기 팁 위치를 tmp(다음 git branch -D tmp)으로 변경하십시오 .


git rebase ... --dry-run다음과 같은 이유로 불가능하다고 생각합니다 .

을 수행 할 때 git rebasegit은 시작 지점으로 롤백 한 다음 각 커밋에 대해 점진적으로 패치를 적용하여 분기를 최신 상태로 만듭니다. 충돌이 발생하면 중지하고 계속하기 전에 충돌을 해결할 때까지 기다립니다. 충돌 후 리베이스가 취하는 경로는 충돌을 해결하는 방법에 따라 다릅니다. 특정 방식으로 해결하면 나중에 충돌이 발생하거나 제거 될 수 있습니다.

따라서 첫 번째 충돌 git rebase ... --dry-run만 제공 할 수 있습니다. 이후 충돌에 대한보고는 첫 번째 충돌이 어떻게 해결되었는지에 따라 달라집니다.

제가 생각할 수있는 유일한 방법 git diff은 현재 위치와 리베이스하려는 브랜치의 마지막 커밋 사이 를 통하는 것 입니다. 그러나 그것은 당신이 찾고있는 것을 실제로 제공하지 않을 것입니다-당신은 정말로 두 지점 사이 상충되는 변화 의 목록이 필요합니다 . 수있는 방법 있을git diff있지만 일반적인 패치는 아닙니다.


이전의 모든 변경 사항을 복구하는 것보다 git rebase를 수행하고 원하는대로 재생할 수 있습니다. 으로 일부 분기의 리베이스를 수행 master했으며 마음에 들지 않는다고 가정합니다.

  1. git reflog -20 -약간의 설명과 함께 HEAD의 마지막 20 개 위치를 제공합니다.
  2. git checkout <the_branch_name> -HEAD를 브랜치에 배치
  3. git reset --hard <old_sha1_found_in_reflog> -HEAD 및 분기를 이전 참조에 배치하면 이전 분기를 복구 할 수 있습니다.

여기에서 이해해야 할 몇 가지 메커니즘이 있습니다.

  1. 어쨌든 명령이 아닌 git에서 아무것도 삭제하지 마십시오. 참조되지 않은 분기를 통과하여 삭제하는 가비지 수집기입니다 (기본값 3 개월). 따라서 리베이스 이전의 브랜치는 여전히 존재합니다.
  2. 동일한 분기 리베이스에 대해서도 동일하며 이전 트리 옆에 새 트리가 다시 작성됩니다.
  3. rebaseHEAD 조작에 대한 모든 이력 및 기타는reflog
  4. 다음 @{N}에서 주석을 사용할 수 있습니다.reflog

따라서, 이후에는 아무것도 손실되지 않으며 rebase, 찾는 방법과 복구 방법 만 알면됩니다.

예를 들어 태그를 rebase되돌 리거나 삭제할 수 있습니다. 모든 SHA1 연구 단계를 회피합니다.

참고 URL : https://stackoverflow.com/questions/29517440/is-there-some-kind-of-git-rebase-dry-run-which-would-notify-me-of-conflicts

반응형