파일을 특정 개정으로 재설정하거나 되돌리려면 어떻게해야합니까?
파일 그룹의 일부로 몇 번 커밋 된 파일을 일부 변경했지만 이제 변경 내용을 이전 버전으로 다시 설정 / 되돌리려 고합니다.
필자는 필요한 개정을 찾기 위해 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 commit에 대한 참조를 사용할 수 있습니다. 요점은 명령이 다음과 같다는 것입니다.
git checkout [commit-ref] -- [filename]
git checkout -- foo
foo
HEAD로 재설정 됩니다. 당신은 또한 수:
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에 의해 기록 된 상태에서 파일을 체크 아웃하고 싶습니다"라고 묻습니다.
반면에, 당신이 의미하는 것은 $ C가 파일에 수행 한 것을 유지하면서 두 번째 반복 (예 : commit $ B)으로 인한 변경을 제거하는 것입니다.
$ git revert $B
커밋 $ B를 만든 사람은 매우 규율이없고 같은 커밋에서 완전히 관련이없는 변경을 커밋했을 수 있으며,이 되돌리기는 문제 가있는 파일 이 아닌 다른 파일 을 건드릴 수 있으므로 수행 후 결과를주의 깊게 확인하고 싶을 수 있습니다 그래서.
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>
처음 두 명령 ... 커밋 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>
file 롤백 할 파일의 개정 수입니다 <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
지정된 파일에서를 수행 하고- 파일 히스토리에서 적절한 commit-id를 선택하고
git checkout
지정된 파일에 대해 commit-id에 a 를 실행 합니다.
기본적 으로이 상황에서 수동으로 수행하는 모든 작업은
아름답고 효율적인 하나의 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에 색인의 해당 경로를 수정하기 전에 되돌릴 것을 지시 합니다.HEAD
HEAD
의 제안에 따라 여기에 많은 제안이 있습니다 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
For me none of the reply seemed really clear and therefore I would like to add mine which seems super easy.
I have a commit abc1
and after it I have done several (or one modification) to a file file.txt
.
Now say that I messed up something in the file file.txt
and I want to go back to a previous commit abc1
.
1.git checkout file.txt
: this will remove local changes, if you don't need them
2.git checkout abc1 file.txt
: this will bring your file to your wanted version
3.git commit -m "Restored file.txt to version abc1"
: this will commit your reversion.
git push
: this will push everything on the remote repository
Between the step 2 and 3 of course you can do git status
to understand what is going on. Usually you should see the file.txt
already added and that is why there is no need of a 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).
- 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:
- revert the entire commit with the file you want to specifically revert - it will create a new commit on your branch
- soft reset that commit - removes the commit and moves the changes to the working area
- handpick the files to revert and commit them
- drop all other files in your work area
What you need to type in your terminal:
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
good luck
if you commit a wrong file in your last commits follow the instruction :
- open source tree, change to this commit
- change the lines and find your commit that the wrong file sent as commit
- you can see the list of your changes in that commit
- select it and then click on ... buttons right-hand side ... click reverse file
- then you can see it on file status tab at the bottom left-hand side then click unstage:
- open your visual studio code and revert back by committing your removed files
- after them all, you can see results in your last commit in the source tree
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/373812/rollback-file-to-much-earlier-version-using-git
'IT story' 카테고리의 다른 글
일부 개발자에게는 왜 좋은 UI 디자인이 그렇게 어려운가요? (0) | 2020.05.05 |
---|---|
ld : 프레임 워크를 찾을 수 없음 (0) | 2020.05.05 |
for 루프 내에서 JavaScript 클릭 핸들러가 예상대로 작동하지 않음 (0) | 2020.05.05 |
baselineAligned를 false로 설정하면 LinearLayout의 성능이 어떻게 향상됩니까? (0) | 2020.05.05 |
CSS : 테이블 셀을 자르지 만 가능한 한 적합 (0) | 2020.05.05 |