source

날짜별로 Git에서 체크아웃하는 방법은 무엇입니까?

manysource 2023. 5. 25. 22:09

날짜별로 Git에서 체크아웃하는 방법은 무엇입니까?

나는 소스 코드의 회귀 분석 작업을 하고 있습니다.저는 Git에게 "파라미터화된 날짜/시간을 기준으로 소스를 확인하십시오."라고 말하고 싶습니다.이것이 가능합니까?

저는 또한 제가 잃고 싶지 않은 현재의 관점에서 변화를 준비했습니다.이전 날짜를 기준으로 현재 소스와 관심 있는 버전을 왔다 갔다 하는 것이 이상적입니다.

현재 변경사항 유지하기

작업을 커밋하지 않고 보관할 수 있습니다.git stash은 는것좋다니습이하사를 사용하는 것이 좋습니다.git stash pop되찾기 위해서요아니면 (칼레토가 말한 것처럼) 할 수 있습니다.git commit다른 지점으로 이동합니다.

rev-parse를 사용한 날짜별 체크아웃

를 사용하여 특정 날짜까지 할 수 .rev-parse다음과 같이:

git checkout 'master@{1979-02-26 18:30:00}'

사용 가능한 옵션에 대한 자세한 내용은 에서 확인할 수 있습니다.

주석에 명시된 대로 이 방법은 reflog를 사용하여 기록에서 커밋을 찾습니다.기본적으로 이러한 항목은 90일 후에 만료됩니다.reflog를 사용하기 위한 구문이 덜 장황하지만 90일만 거슬러 올라갈 수 있습니다.

rev-list를 사용하여 날짜별로 체크아웃

않는 은 reflog를 사용하는 입니다.rev-list다음을 통해 특정 시점에 커밋을 수행할 수 있습니다.

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`

병합을 통해 버전을 가져오지 않고 사용자의 기록만 가져오려면 --first-parent를 기록하십시오.그것이 당신이 평소에 원하는 것입니다.

앤디의 해결책은 저에게 효과가 없습니다.여기서 나는 다른 방법을 찾았습니다.

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git: 날짜별 체크아웃

당신은 이것과 비슷한 것이 필요한 것처럼 보입니다: 날짜를 기준으로 체크아웃합니다.

다말해서, 은신당을 합니다.rev-list커밋을 찾은 다음 체크아웃을 사용하여 실제로 커밋을 얻습니다.

준비된 변경 내용을 손실하지 않으려면 새 분기를 만들어 해당 분기에 커밋하는 것이 가장 쉽습니다.분기 간에는 항상 전환할 수 있습니다.

편집: 링크가 중단되었으므로 다음 명령을 수행합니다.

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

대체 명령보다 파이프를 선호하는 사람들에게

git rev-list -n1 --before=2013-7-4 master | xargs git checkout

나의 경우에는-n 1옵션이 작동하지 않습니다.Windows(윈도우)에서 다음 명령 시퀀스가 제대로 작동합니다.

git rev-list -1 --before="2012-01-15 12:00" master

지정된 날짜에 대한 적절한 커밋의 SHA를 반환하고 다음을 수행합니다.

git checkout SHA

Git 2.23 (2019년 8월) 이후 알림

  • 날짜별로 이전 커밋에서 새 분기로 전환:

    git switch -c newBranch $(git rev-list -n1 --before=yyyy-mm-dd main)
    
  • 현재 작업 트리의 과거 날짜에 파일 복원

    git restore -SW -s $(git rev-list -n1 --before=yyyy-mm-dd main) -- path/to/file
    

2021/2022에서 오래되고 구식이며 혼란스러운 명령어를 사용하지 마십시오. 그리고 그들이 무엇을 하고 있는지 정확하게 설명합니다(다음 기간 동안 분기만 사용).git switch 파이 ▁for▁ 파일만 있는 경우.git restore)

'': 사춘기 백틱 구문보다 더 현대적인 구문을 선호합니다.

git rev-parse@Andy가 제안한 해결책은 당신이 관심 있는 날짜가 커밋 날짜라면 잘 작동합니다.그러나 작성자의 날짜를 기준으로 체크아웃을 원할 경우,rev-parse커밋을 선택하는 데 해당 날짜를 사용할 수 있는 옵션이 제공되지 않기 때문에 작동하지 않습니다.대신 다음을 사용할 수 있습니다.

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

사용도 )$1 >= "2016-04-12" && $2 >= "11:37"어색한 술어로.)

체크아웃에서 새 분기를 만들려면 새 분기 이름과 함께 -b 옵션을 사용합니다.

git checkout -b 19July2021 `git rev-list -n1 --before=2021-7-19 master`

피할 수 있습니다.git switch HEAD'때'는 'depached HEAD' 입니다.

rev-list마스터 분기에서 프로덕션 분기로 가장 최근의 병합 커밋을 찾으려는 경우(순수한 가상 예제):

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

저는 주어진 날짜에 생산 서버에 있는 코드를 찾아야 했습니다.이것이 저를 위해 그것을 찾았습니다.

빌드를 수행할 때 리포지토리의 정확한 버전으로 돌아갈 수 있으려면 빌드의 원본 커밋에 태그를 지정하는 것이 가장 좋습니다.

다른 답변은 특정 시간에 저장소를 분기의 가장 최근 커밋으로 되돌리는 기술을 제공하지만 항상 충분하지는 않을 수 있습니다.예를 들어 분기에서 빌드한 후 나중에 분기를 삭제하거나 나중에 재배치된 분기에서 빌드한 커밋이 현재 분기에서 "연결할 수 없는" 상태가 될 수 있습니다.연결할 수 없는 개체 git는 리포지토리가 압축될 때 결국 제거될 수 있습니다.

커밋에 태그를 다는 것은 나중에 분기로 무엇을 하든(태그를 제거하지 않는 한) 절대 도달할 수 없다는 것을 의미합니다.

reflog(보고서를 복제한 날짜 또는 90일 전의 기록을 다른 노트에서 확인할 수 있음) 한도에 도달한 경우 약간의 변경만 필요합니다.

git checkout `git rev-list -1 --before="Jan 17 2020" HEAD`

또한 사용할 수 있습니다.

git checkout `git rev-list -1 --before="Jan 17 2020 8:06 UTC-8" HEAD`

입력한 날짜 또는 날짜 시간과 관련된 이전 커밋을 확인하고 날짜에 대한 수식어를 사용할 수 있는지 확인합니다. UTC+-N을 사용하지 않으면 UTC 시간만 사용합니다.

마스터를 HEAD로만 변경한 것을 보세요, 확인하고 싶은 날짜로 리필로그가 없어도 작동하는 것 같습니다!!!

상대 시간별로 체크아웃할 때 사용하는 별칭 버전은 다음과 같습니다.

[alias]
    parsedate = "!set -x ;arg1=\"$1\" && shift && which gdate &> /dev/null && gdate -d \"$arg1\" || date -d \"$arg1\""
    codate = "!d=\"$(git parsedate \"$1\")\" && shift && git checkout \"$(git rev-list -n1 --first-parent --before=\"$d\" HEAD)\""

이렇게 하면 2개월 전의 변경 사항을 다음과 같은 이름으로 체크아웃할 수 있습니다.test다음 명령 사용:

git codate '2 months ago' -b test

얕은 복제본에서는 이 작업이 작동하지 않으므로 먼저 다음 작업을 수행합니다.

git fetch --unshallow

얕은 오류가 발생하면 git fatal: error in object: unshow에서 우수한 답변의 도움말을 찾을 수 있습니다.

GNU coreutils가 필요하며 brew를 사용하여 Linux 및 macOS에서 작동합니다.

다음을 사용하여 macro에 설치brew install coreutils.

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

인쇄된 문자열(예: XXXX)을 사용하여 다음을 수행합니다.

git checkout XXXX

특정 날짜에 단일 파일을 체크아웃하려면 두 명령에 파일 경로를 전달할 수 있습니다.

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master FILEPATH` FILEPATH

언급URL : https://stackoverflow.com/questions/6990484/how-to-checkout-in-git-by-date