파일 그룹의 일부로 몇 번 커밋 된 파일을 일부 변경했지만 이제 변경 내용을 이전 버전으로 다시 설정 / 되돌리려 고합니다.
필자는 필요한 개정을 찾기 위해 a git log
와 함께 수행 git diff
했지만 파일을 과거의 이전 상태로 되 돌리는 방법을 모릅니다.
파일 그룹의 일부로 몇 번 커밋 된 파일을 일부 변경했지만 이제 변경 내용을 이전 버전으로 다시 설정 / 되돌리려 고합니다.
필자는 필요한 개정을 찾기 위해 a git log
와 함께 수행 git diff
했지만 파일을 과거의 이전 상태로 되 돌리는 방법을 모릅니다.
답변:
원하는 커밋의 해시를 가정하면 다음과 c5f567
같습니다.
git checkout c5f567 -- file1/to/restore file2/to/restore
자식 체크 아웃 설명서 페이지에 자세한 정보를 제공합니다.
전에 커밋으로 되돌리려면 c5f567
append를 추가하십시오 ~1
(여기서 1은 되돌릴 커밋 수입니다).
git checkout c5f567~1 -- file1/to/restore file2/to/restore
부수적으로, 나는이 명령이 평범한 것 (분 기간 변경)과 비정상적이고 파괴적인 것 (작업 디렉토리의 변경 사항 무시) 모두에 사용되기 때문에 항상 불편했습니다.
develop
하려는 경우 git checkout develop -- file/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>
git checkout <commit hash> <filename>
것이 나에게 더 효과적이었다git reset
git checkout <commit hash> <filename>
나를 위해 일했다. 이것은 정답이 아닙니다. IMHO. git reset
하지 않았다.
git reset
단일 파일을 재설정 하는 데 사용할 수없는 경우 오류가 발생합니다fatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. 이 의지 오류 fatal: Cannot do hard reset with paths.
무엇은 Motti 스트롬은 말했다 : 사용git checkout <commit hash> <filename>
가장 편리한 경우 SHA-1을 포함하여 git commit에 대한 참조를 사용할 수 있습니다. 요점은 명령이 다음과 같다는 것입니다.
git checkout [commit-ref] -- [filename]
--
과 그렇지 않은 답변의 차이점은 무엇입니까 ?
rm
명령은 getopt (3)을 사용하여 인수를 구문 분석합니다. getopt
명령 인수를 구문 분석하는 명령입니다. gnu.org/software/libc/manual/html_node/Getopt.html
git checkout -- foo
foo
HEAD로 재설정 됩니다. 당신은 또한 수:
git checkout HEAD^ foo
다시 한 번 수정하는 등
git checkout -- foo
있다면 실수를 피하기 위해 구문 을 사용하는 것이 좋습니다 . git을 사용하면 확실하지 않은 경우 항상 모든 파일과 디렉토리 앞에 특수 인수를 붙 입니다. foo
-f
--
--
은 git 명령이 아니며 git에 특별하지 않습니다. 명령 옵션의 끝을 나타 내기 위해 내장 된 bash입니다. 다른 많은 bash 명령과 함께 사용할 수도 있습니다.
--
가 아닙니다 . 그러나 많은 명령 줄 파서에서 지원하고 git을 포함한 많은 CLI에서 사용하는 일반적인 규칙입니다.
가장 빈번하게 필요한 최종 커밋 된 버전으로 되돌리려면이 간단한 명령을 사용할 수 있습니다.
git checkout HEAD file/to/restore
나는 그것을 발견했다고 생각한다 .... http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
때로는 돌아가서 특정 지점을 지나는 모든 변경 사항을 잊고 싶을 수도 있습니다.
로 시작 :
$ git log
최근 커밋 목록과 SHA1 해시가 표시됩니다.
다음을 입력하십시오.
$ git reset --hard SHA1_HASH
주어진 커밋으로 상태를 복원하고 레코드에서 모든 최신 커밋을 영구적으로 삭제합니다.
git push --force
"롤백"이라고 말할 때주의해야합니다. 커밋 $ A에 한 버전의 파일이 있고 나중에 두 개의 별도 커밋 $ B와 $ C에서 두 가지 변경을 한 경우 (파일의 세 번째 반복이 표시됨) " 첫 번째로 롤백하고 싶습니다. 정말로 그렇습니까?
두 번째와 세 번째 반복 모두의 변경 사항을 제거하려면 매우 간단합니다.
$ git checkout $A file
그런 다음 결과를 커밋합니다. 명령은 "커밋 $ A에 의해 기록 된 상태에서 파일을 체크 아웃하고 싶습니다"라고 묻습니다.
반면에, 당신이 의미하는 것은 $ C가 파일에 수행 한 것을 유지하면서 두 번째 반복 (예 : commit $ B)으로 인한 변경을 제거하는 것입니다.
$ git revert $B
커밋 $ B를 만든 사람은 매우 규율이없고 동일한 커밋에서 완전히 관련이없는 변경을 커밋했을 수 있으며,이 되돌리기는 문제 가있는 파일 이 아닌 다른 파일 을 건드릴 수 있으므로 수행 후 결과를주의 깊게 확인하고 싶을 수 있습니다 그래서.
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 v2.23.0부터는 새로운 git restore 방법이 있는데, git checkout
책임 있는 것의 일부를 가정 합니다 (허용 된 대답 git checkout
은 상당히 혼란 스럽습니다). github 블로그의 주요 변경 사항을 참조하십시오 .
이 명령의 기본 동작은 source
매개 변수 에서 오는 내용 (커밋 해시) 으로 작업 트리의 상태를 복원하는 것입니다.
따라서 Greg Hewgill의 답변 (커밋 해시가 있다고 가정 c5f567
)에 따라 명령은 다음과 같습니다.
git restore --source=c5f567 file1/to/restore file2/to/restore
또는 c5f567 이전에 하나의 커밋 내용으로 복원하려는 경우 :
git restore --source=c5f567~1 file1/to/restore file2/to/restore
대상 파일의 첫 번째 재설정 헤드
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
에 다음을 추가하십시오 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 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 $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
점에 유의 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
나에게 답장 중 아무것도 분명하게 보이지 않았으므로 매우 쉬운 것처럼 내 것을 추가하고 싶습니다.
커밋이 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"
: 이것은 당신의 복귀를 저지를 것입니다.
git push
: 원격 저장소의 모든 것을 푸시합니다. 물론 2 단계와 3 단계 사이에서 진행 상황 git status
을 이해하기 위해 할 수 있습니다 . 일반적으로 file.txt
이미 추가 된 것을보아야하므로이 필요하지 않습니다 git add
.
git checkout Last_Stable_commit_Number -- fileName
2.Git 파일을 특정 브랜치로 되돌리기
git checkout branchName_Which_Has_stable_Commit fileName
많은 여기에 답 주장 사용 git reset ... <file>
또는 git checkout ... <file>
그러나 그렇게함으로써 당신의 모든 수정을 잃어 버리게된다<file>
를 사용해서 되돌리려 커밋 이후에 최선을 다하고 있습니다.
하나의 파일에 대한 한 커밋의 변경 사항 git revert
을 하나의 파일 (또는 커밋 파일의 하위 집합) git diff
과 git apply
마찬가지로 되돌리려면 두 가지 모두를 사용하는 것이 좋습니다 ( <sha>
= 되 돌리겠다고 약속하십시오) :
git diff <sha>^ <sha> path/to/file.ext | git apply -R
기본적으로 되돌리려는 변경 사항에 해당하는 패치를 생성 한 다음 패치를 역적 용하여 변경 사항을 삭제합니다.
물론, 어떤 사이 커밋으로 복귀 라인이 수정 된 경우 일 수 없다 <sha1>
와 HEAD
(충돌).
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
대신 사용할 수 있습니다<sha>^ <sha>
4 단계로 수행 할 수 있습니다.
터미널에 입력해야하는 것 :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&& git commit -m 'reverting file'
git checkout .
행운을 빕니다
git-revert
전체 저장소에서만 작동하므로 보상하기 위해 다른 모든 것을 취소해야한다는 것입니다.
git revert --no-commit <commit_hash>
2. git reset HEAD
추가 커밋을 저장하고 작업 디렉토리에서만 모든 변경 사항을 수행합니다.
git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
. 새 분기 팁은 되 돌린 파일을 제외한 모든 변경 사항을 반영했습니다.
이것은 매우 간단한 단계입니다. 우리가 원하는 커밋 ID에 대한 체크 아웃 파일.
# git checkout <previous commit_id> <file_name>
# git commit --amend
이것은 매우 편리합니다. 커밋 상단의 이전 커밋 ID로 파일을 가져 오려면 쉽게 할 수 있습니다.
--cached
확인시 잊지 마십시오git diff
. 링크