source

파일을 특정 버전으로 재설정하거나 되돌리는 방법은 무엇입니까?

ittop 2023. 7. 1. 09:58
반응형

파일을 특정 버전으로 재설정하거나 되돌리는 방법은 무엇입니까?

및 를 통해 확인한 특정 커밋 해시에서 수정된 파일을 이전 버전으로 되돌리는 방법은 무엇입니까?

를 원는커밋해시다를같음가로 가정합니다.c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout man 페이지는 더 많은 정보를 제공합니다.

이전의 커밋으로 c5f567덧셈을 하다~1(여기서 1은 되돌리고 싶은 커밋의 수이며 임의의 커밋일 수 있습니다):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

참고로 이 명령어는 일반적인 것(지점 간 변경)과 비정상적이고 파괴적인 것(작업 디렉토리의 변경 사항 삭제) 모두에 사용되기 때문에 항상 불편했습니다.

로의 --명령에서 In Git, (대시 대시)의 의미는 무엇입니까?


수정된 작업 복사본 파일을 복원하기 위해 특별히 설계된 새 명령도 있습니다.Git가 충분히 새로운 경우 이 명령을 사용할 수 있지만 설명서에는 다음 경고가 함께 제공됩니다.

이 명령은 실험적입니다.행동이 바뀔 수 있습니다.

diff 명령을 사용하여 파일의 변경 내용을 빠르게 검토할 수 있습니다.

git diff <commit hash> <filename>

그런 다음 특정 파일을 해당 커밋으로 되돌리려면 reset 명령을 사용합니다.

git reset <commit hash> <filename>

다음을 사용해야 할 수 있습니다.--hard로컬 수정사항이 있는 경우 옵션을 선택합니다.

경유지 관리를 위한 좋은 워크플로우는 태그를 사용하여 시간 표시 막대에 점을 깨끗하게 표시하는 것입니다.저는 당신의 마지막 문장을 잘 이해할 수 없지만 당신이 원하는 것은 이전 시점에서 분기를 바꾸는 것입니다.이렇게 하려면 handy checkout 명령을 사용합니다.

git checkout <commit hash>
git checkout -b <new branch name>

그런 다음 이러한 변경사항을 병합할 준비가 되면 메인라인을 기준으로 다시 작성할 수 있습니다.

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

가장 편리한 경우 SHA-1을 포함하여 Git 커밋에 대한 모든 참조를 사용할 수 있습니다.요점은 명령이 다음과 같이 보인다는 것입니다.

git checkout [commit-ref] -- [filename]

git checkout -- foo

재정됩다니가 재설정됩니다.foo앞로으 과 같은 도 수행할 수 있습니다다음과 같은 작업도 수행할 수 있습니다.

git checkout HEAD^ foo

한 번의 수정을 위한 등.

그리고 가장 자주 필요한 마지막 커밋된 버전으로 되돌리려면 이 간단한 명령을 사용할 수 있습니다.

git checkout HEAD file/to/restore

git v2.23.0 기준으로 새로운 git 복원 방법이 있으며, 이 방법은 다음의 일부를 가정해야 합니다.git checkout에 대한 책임이 있었습니다 (수용된 답변조차도 언급합니다).git checkout상당히 혼란스럽습니다).github 블로그에서 변경사항의 주요 내용을 확인하십시오.

은 명의이작트상복것태입다니원에서 입니다.source매개 변수(이 경우 커밋 해시가 됩니다.

Greg으로 (가 커서그그휴렉길대의래근여답에하거가해시밋커▁is▁theuming▁(▁so여근그asss하가▁on래해▁based거▁greg시)c5f567명령은 다음과 같습니다.

git restore --source=c5f567 file1/to/restore file2/to/restore

또는 c5f567 이전의 한 커밋 내용으로 복원하려는 경우:

git restore --source=c5f567~1 file1/to/restore file2/to/restore

저는 방금 같은 문제를 겪었고 이 대답이 가장 이해하기 쉽다는 것을 알았습니다.commit-ref되돌리려는 로그의 변경 사항에 대한 SHA 값입니다.):

git checkout [commit-ref] [filename]

이렇게 하면 이전 버전이 작업 디렉토리에 저장되고 원하는 경우 이 디렉토리에서 커밋할 수 있습니다.

되돌려야 할 커밋 수를 알고 있는 경우 다음을 사용할 수 있습니다.

git checkout master~5 image.png

이것은 당신이 그 일을 하고 있다고 가정합니다.master브랜치, 그리고 당신이 원하는 버전은 5 커밋백입니다.

http://www-cs-students.stanford.edu/ ~blynn/gitmagic/ch02.html에서 찾은 것 같습니다.

때때로 여러분은 과거로 돌아가서 특정 시점을 지나온 모든 변화를 잊고 싶어합니다. 왜냐하면 그것들은 모두 틀리기 때문입니다.

시작:

$ git log

최근 커밋 목록과 해당 SHA1 해시가 표시됩니다.

다음을 입력합니다.

$ git reset --hard SHA1_HASH

지정된 커밋으로 상태를 복원하고 레코드에서 모든 최신 커밋을 영구적으로 지웁니다.

이것은 저에게 효과가 있었습니다.

git checkout <commit hash> file

그런 다음 변경 내용을 커밋합니다.

git commit -a

"롤백"이라고 말할 때는 조심해야 합니다.만약 당신이 $A 커밋에 파일의 한 버전을 가지고 있다가 나중에 $B와 $C 두 개의 별도 커밋에 두 번의 변경을 가했다면, 그리고 당신이 "나는 첫 번째 커밋으로 롤백하고 싶다"고 말한다면, 당신은 정말로 그것을 의미합니까?

두 번째와 세 번째 반복 모두에서 변경 사항을 제거하려면 매우 간단합니다.

$ git checkout $A file

그리고 나서 결과를 커밋합니다.명령은 "나는 커밋 $A에 의해 기록된 상태에서 파일을 체크아웃하고 싶다"고 요청합니다.

반면에, 당신이 의미한 것은 두 번째 반복(즉, $B 커밋)이 가져온 변경을 제거하는 동시에 $C가 파일에 수행한 것을 유지하는 것입니다. $B를 되돌리고 싶습니다.

$ git revert $B

commit $B를 만든 사람이 누구든 간에 규율을 잘 지키지 않았을 수 있고 동일한 커밋에서 전혀 관련이 없는 변경을 저질렀을 수 있으며, 이 되돌림은 잘못된 변경 사항이 보이는 파일 이외의 파일을 건드릴 수 있으므로 변경 후 결과를 주의 깊게 확인하는 것이 좋습니다.

  1. 특정 커밋으로 파일 되돌리기
git checkout Last_Stable_commit_Number -- fileName

2.파일을 특정 분기로 되돌립니다.

git checkout branchName_Which_Has_stable_Commit fileName

재있게도미,,git checkout foo이 작업복이지름디정렉있않에습다작라는 .foo 그나러, 둘다 둘 다git checkout HEAD foo그리고.git checkout ./foo 시작:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

배건rebase편집:편집:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

있다고 가정합니다.

---o----o----o----o  master
    \---A----B       <my branch>

처음 두 명령... commitgit checkout gitrebase master

변경사분체합다니웃크아기를항에 하십시오.master분점.rebase는 령에서가다니에서 .<my branch>에서 수 없는 )master)의master 즉의 첫 는 첫번커밋부모는의입니다.<my branch>는 더 더이이약아닙다에서 .master역사, 하지만 현재의 수장.master.

git rebase master <my branch>

"기본" 분기와 "수정" 분기가 모두 명시적이므로 이 명령을 기억하는 것이 더 쉬울 수 있습니다.

최종 기록 결과는 다음과 같습니다.

---o----o----o----o   master
                   \----A'----B'  <my branch>

마지막 두 명령...

git checkout master
git merge <my branch>

하여 모두 합니다.<my branch>▁onto변화▁changes의.master단계가 이 추가되지 .master최종 결과는 다음과 같습니다.

---o----o----o----o----A'----B'  master, <my branch>

master그리고.<my branch> 가지 기준 모두B'또한, 이 시점부터 삭제해도 안전합니다.<my branch>언급.

git branch -d <my branch>

대상 파일의 첫 번째 재설정 헤드

git reset HEAD path_to_file

두 번째 해당 파일 체크아웃

git checkout -- path_to_file

파일을 이전 커밋으로 되돌리려는 경우(및 이미 커밋된 파일로 되돌리려는 경우) 사용할 수 있습니다.

git checkout HEAD^1 path/to/file

또는

git checkout HEAD~1 path/to/file

그런 다음 "새로운" 버전을 준비하고 커밋합니다.

병합의 경우 커밋에 두 개의 부모가 있을 수 있다는 지식을 바탕으로 HEAD^1이 첫 번째 부모이고 HEAD~1이 두 번째 부모임을 알아야 합니다.

트리에 부모가 하나만 있는 경우 둘 중 하나가 작동합니다.

구조를 위해 기가 막히고, 어색하고, 당황스럽습니다!

git prevision <N> <filename>

<N>는 파일 " " " 에 .<filename>.
를 들어, 파일의 하려면 다음과 같이 .x/y/z.c, 친구들아.

git prevision -1 x/y/z.c

git prevision은 어떻게 작동합니까?

다을추다니에 합니다.gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

명령어는 기본적으로

  • 합니다.git log된 파일 및 ""에서
  • 파일 기록에서 적절한 커밋 ID를 선택합니다.
  • 합니다.git checkout지정된 파일의 commit-id에 연결합니다.

기본적으로 이 상황에서 수동으로 할 수 있는 모든 것은
하나의 아름답고 효율적인 깃-비전 - 깃-비전으로 포장.

여기에 많은 제안이 있습니다. 대부분은 다음과 같습니다.git checkout $revision -- $file 대안 지가모호대안한몇::

git show $revision:$file > $file

또한 특정 버전을 일시적으로 보기 위해 이 기능을 자주 사용합니다.

git show $revision:$file

또는

git show $revision:$file | vim -R -

(OBS: (OBS:$file다음으로 접두사를 붙여야 합니다../의 인 경우git show $revision:$file

그리고 더 이상한 것은:

git archive $revision $file | tar -x0 > $file

숙련된 사용자를 혼란시키지 않고 초보자에게 더 친숙하게 만들기 위해 포장지인 EasyGit을 여기에 꽂아야 합니다.이것이 하는 일 중 하나는 더 많은 의미를 부여하는 입니다. 이 경우, 여러분은 간단하게 다음과 같이 말할 수 있습니다.

eg revert foo/bar foo/baz

그나참고러는 다음과 같습니다.git checkout ./foo그리고.git checkout HEAD ./foo정확히 같은 것이 아닙니다. 적절한 경우:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

번째)add파일을 인덱스에 준비하지만 커밋되지는 않습니다.)

Git checkout ./foo path 평되돌경로기리균▁revert▁path를 의미합니다../foo인덱스에서; 추가HEAD 경로를 Git게인덱스해경로해당경지되로시록다니합도돌리로를당의에로 합니다.HEAD수정하기 전에 수정합니다.

저에게는 명확한 답변이 하나도 없었기 때문에 매우 쉬워 보이는 답변을 추가하고 싶습니다.

요.abc1그에 나는 한 번) .file.txt.

을 망쳤다고 . ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠfile.txt그리고 저는 이전의 약속으로 돌아가고 싶습니다.abc1.

1.git checkout file.txt변경사항이하지 않으면 합니다.

2.git checkout abc1 file.txt이것은 당신의 파일을 당신의 원하는 버전으로 가져올 것입니다.

3.git commit -m "Restored file.txt to version abc1"이것은 당신의 복귀를 저지를 것입니다.

  1. git push 하면 .

에는 2단계 3단계를 할 수 .git status무슨 일이 일어나고 있는지 이해하기 위해.은 보통당그봐합니다야것을은신을 봐야 .file.txt이미 추가되었고 그것이 필요 없는 이유입니다.git add.

git log --oneline  // you see commits, find commit hash to which you want reset
git diff y0urhash src/main/.../../YourFile.java   // to see difference
git reset y0urhash src/main/.../../YourFile.java   // revert to y0urhash commit
git status                                        // check files to commit
git commit -m "your commit message"
git push origin

여기에 있는 많은 답변들이 사용한다고 주장합니다.git reset ... <file>또는git checkout ... <file>하지만 그렇게 함으로써, 당신은 모든 수정을 느슨하게 할 것입니다.<file>되돌리려는 커밋 후에 커밋됩니다.

단일 파일에 대한 하나의 커밋에서만 변경 내용을 되돌리려면 다음과 같이 하십시오.git revert의 파일파일의 집합이라고 )에 . 둘 다 하는 것이 .git diff그리고.git apply(with 그런식로으식로)<sha> :::

git diff <sha>^ <sha> path/to/file.ext | git apply -R

기본적으로 복구할 변경 사항에 해당하는 패치를 먼저 생성한 다음 패치를 역방향으로 적용하여 해당 변경 사항을 삭제합니다.

물론, 역방향 라인이 다음 사이의 커밋에 의해 수정된 경우에는 작동하지 않습니다.<sha1>그리고.HEAD(계속).

파일의 이전 커밋 버전으로 이동하려면 커밋 번호를 가져옵니다(예: eb917a1).

git checkout eb917a1 YourFileName

마지막으로 커밋된 버전으로 돌아가기만 하면 되는 경우

git reset HEAD YourFileName
git checkout YourFileName

그러면 파일의 마지막 커밋된 상태로 이동합니다.

이것은 매우 간단한 단계입니다.우리가 원하는 커밋 ID에 대한 파일을 체크아웃하고, 여기 전에 커밋 ID 하나를 입력한 다음, 커밋 수정만 하면 됩니다.

# git checkout <previous commit_id> <file_name>
# git commit --amend

이것은 매우 편리합니다.커밋 맨 위에 있는 이전 커밋 ID에 파일을 가져오려면 쉽게 가져올 수 있습니다.

git checkout ref|commitHash -- filePath

예.

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

4단계로 수행할 수 있습니다.

  1. 특정하게 되돌리려는 파일로 전체 커밋을 되돌립니다. 그러면 분기에 새 커밋이 만들어집니다.
  2. 커밋하는 소프트 재설정 - 커밋을 제거하고 변경 사항을 작업 영역으로 이동합니다.
  3. 복구할 파일을 직접 선택하고 커밋합니다.
  4. 작업 영역의 다른 모든 파일 삭제

단말기에 입력해야 하는 항목:

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert>&&git commit -m 'reverting file'
  4. git checkout .

행운을 빌어요

사용하다git log 사용하려면 과 같이 하십시오.git checkout <hashkey>

참고: 마지막 해시 앞에 해시를 입력하는 것을 잊지 마십시오.마지막 해시는 현재 위치(HEAD)를 가리키고 아무것도 변경하지 않습니다.

분명히 누군가는 git에 대한 이해할 수 있는 책을 쓰거나, git을 문서에서 더 잘 설명할 필요가 있습니다.이 같은 문제에 직면했을 때, 나는 추측했습니다.

cd <working copy>
git revert master

할 것으로 보이는 마지막 약속을 취소할 것입니다.

이안

git revert <hash>

지정된 커밋을 되돌립니다.당신이 생각하는 것처럼 들리네요.git revert가장 최근의 커밋에만 영향을 미칩니다.

특정 파일의 변경 내용을 되돌리고 해당 파일보다 많이 변경된 커밋을 되돌리려면 문제가 해결되지 않습니다.

언급URL : https://stackoverflow.com/questions/373812/rollback-file-to-much-earlier-version-using-git

반응형