Programing

파일을 특정 개정으로 재설정하거나 되돌리려면 어떻게합니까?

lottogame 2020. 9. 22. 20:56
반응형

파일을 특정 개정으로 재설정하거나 되돌리려면 어떻게합니까?


파일 그룹의 일부로 몇 번 커밋 된 파일을 일부 변경했지만 이제 변경 사항을 이전 버전으로 재설정 / 되돌리고 싶습니다.

필요한 개정판을 찾기 위해 a git log와 함께 수행 git diff했지만 파일을 과거의 이전 상태로 되 돌리는 방법을 모릅니다.


원하는 커밋의 해시가 다음과 같다고 가정합니다 c5f567.

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

자식 체크 아웃 설명서 페이지에 자세한 정보를 제공합니다.

이전 커밋으로 되돌리려면 다음을 c5f567추가하십시오 ~1(모든 숫자로 작동).

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

참고로이 명령은 평범한 것 (분기 간 변경)과 비정상적이고 파괴적인 것 (작업 디렉토리의 변경 사항 무시) 모두에 사용되기 때문에 항상 불편했습니다.


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

git diff <commit hash> <filename>

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

git reset <commit hash> <filename>

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

웨이 포인트를 관리하기위한 좋은 워크 플로는 태그를 사용하여 타임 라인에서 포인트를 깔끔하게 표시하는 것입니다. 나는 당신의 마지막 문장을 잘 이해할 수 없지만 당신이 원하는 것은 이전 시점에서 분기를 분기시키는 것입니다. 이렇게하려면 편리한 체크 아웃 명령을 사용하십시오.

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

fooHEAD로 재설정 됩니다. 당신은 또한 수:

git checkout HEAD^ foo

다시 한 번 수정합니다.


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

git checkout HEAD file/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

$ B 커밋을 만든 사람은 그다지 훈련되지 않았고 동일한 커밋에서 완전히 관련없는 변경을 커밋했을 수 있으며,이 되돌리기는 불쾌한 변경 사항 이 표시된 파일 이외의 파일에 영향 을 미칠 수 있으므로 수행 한 후에 신중하게 결과를 확인하는 것이 좋습니다. 그래서.


재미있게도 git checkout foo작업 복사본이 디렉토리에 있으면 작동하지 않습니다 foo. 그러나, 모두 git checkout HEAD foogit 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>

처음 두 명령 ... commit git checkout git rebase master

... 브랜치에 적용하려는 변경 브랜치를 확인하십시오 master. rebase명령은 <my branch>( 에서 찾을 수없는) 커밋을 가져 와서 master의 헤드에 다시 적용합니다 master. 즉,의 첫 번째 커밋의 부모 <my branch>는 더 이상 master히스토리 의 이전 커밋이 아니라 master. 두 명령은 다음과 같습니다.

git rebase master <my branch>

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

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

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

마지막 두 명령은 ...

git checkout master
git merge <my branch>

... 빨리 감기 병합을 수행하여 모든 <my branch>변경 사항을에 적용합니다 master. 이 단계가 없으면 rebase 커밋이에 추가되지 않습니다 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-aliases, awk 및 shell-functions를 구출하십시오!

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-alias- git-prevision


여기에 EasyGit 을 연결해야하는데 , 이는 노련한 사용자를 혼란스럽게하지 않고 초보자가 git을 더 쉽게 접근 할 수 있도록하는 래퍼입니다. 그것이하는 일 중 하나는에 더 많은 의미를 부여git revert 하는 것 입니다. 이 경우 간단히 다음과 같이 말할 수 있습니다.

eg revert foo/bar foo/baz


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

git checkout HEAD^1 path/to/file

또는

git checkout HEAD~1 path/to/file

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

병합의 경우 커밋이 두 개의 부모를 가질 수 있다는 사실을 알고 있다면 HEAD ^ 1이 첫 번째 부모이고 HEAD ~ 1이 두 번째 부모라는 것을 알아야합니다.

트리에 부모가 하나만 있으면 둘 중 하나가 작동합니다.


점에 유의 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인덱스./foo 에서 복귀 경로 의미 합니다 . 추가 는 Git에게 인덱스의 해당 경로를 수정 전에 되돌 리도록 지시 합니다.HEADHEAD


여기에 많은 제안이 있으며 대부분 git checkout $revision -- $file. 몇 가지 모호한 대안 :

git show $revision:$file > $file

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

git show $revision:$file

또는

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

(OBS : 작업을 위한 상대 경로 인 경우 $file접두사가 필요함 )./git show $revision:$file

그리고 더 이상 :

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

나에게는 답장이 분명하지 않았으므로 매우 쉽게 보이는 내 항목을 추가하고 싶습니다.

커밋 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.


In order to go to a previous commit version of the file, get the commit number, say eb917a1 then

git checkout eb917a1 YourFileName

If you just need to go back to the last commited version

git reset HEAD YourFileName
git checkout YourFileName

This will simply take you to the last committed state of the file


git checkout ref|commitHash -- filePath

e.g.

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

Many answers here claims to use git reset ... <file> or git checkout ... <file> but by doing so, you will loose every modifications on <file> committed after the commit you want to revert.

If you want to revert changes from one commit on a single file only, just as git revert would do but only for one file (or say a subset of the commit files), I suggest to use both git diff and git apply like that (with <sha> = the hash of the commit you want to revert) :

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

Basically, it will first generate a patch corresponding to the changes you want to revert, and then reverse-apply the patch to drop those changes.

Of course, it shall not work if reverted lines had been modified by any commit between <sha1> and HEAD (conflict).


  1. Git revert file to a specific commit

git checkout Last_Stable_commit_Number -- fileName

2.Git revert file to a specific branch

git checkout branchName_Which_Has_stable_Commit fileName

Use git log to obtain the hash key for specific version and then use git checkout <hashkey>

Note: Do not forget to type the hash before the last one. Last hash points your current position (HEAD) and changes nothing.


Obviously someone either needs to write an intelligible book on git, or git needs to be better explained in the documentation. Faced with this same problem I guessed that

cd <working copy>
git revert master

would undo the last commit which is seemed to do.

Ian


You can do it in 4 steps:

  1. revert the entire commit with the file you want to specifically revert - it will create a new commit on your branch
  2. soft reset that commit - removes the commit and moves the changes to the working area
  3. handpick the files to revert and commit them
  4. drop all other files in your work area

What you need to type in your terminal:

  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 .

good luck


if you commit a wrong file in your last commits follow the instruction :

  1. open source tree, change to this commit

open source tree

  1. change the lines and find your commit that the wrong file sent as commit

enter image description here

  1. you can see the list of your changes in that commit list of files in the source tree
  2. select it and then click on ... buttons right-hand side ... click reverse file
  3. then you can see it on file status tab at the bottom left-hand side then click unstage:

file status tab

  1. open your visual studio code and revert back by committing your removed files
  2. after them all, you can see results in your last commit in the source tree

enter image description here


This is a very simple step. Checkout file to the commit id we want, here one commit id before, and then just git commit amend and we are done.

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

This is very handy. If we want to bring any file to any prior commit id at the top of commit, we can easily do.


git revert <hash>

Will revert a given commit. It sounds like you think git revert only affects the most recent commit.

That doesn't solve your problem, if you want to revert a change in a specific file and that commit changed more than that file.


As of git v2.23.0 there's a new git restore method which is supposed to assume part of what git checkout was responsible for (even the accepted answer mentions that git checkout is quite confusing). See highlights of changes on github blog.

The default behaviour of this command is to restore the state of a working tree with the content coming from the source parameter (which in your case will be a commit hash).

So based on Greg Hewgill's answer (assuming the commit hash is c5f567) the command would look like this:

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

Or if you want to restore to the content of one commit before c5f567:

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

참고URL : https://stackoverflow.com/questions/35284/how-do-i-restore-files-to-previous-states-in-git

반응형