git [duplicate]에서 단일 파일을 이전 버전으로 되돌리기
이 질문에 이미 답변이 있습니다.
파일에 대해 다른 커밋을 수행하는 방법이 있습니까? 파일을 5 번 수정했고 이미 커밋하고 저장소에 푸시 한 후 변경 2로 돌아가고 싶습니다.
내 이해에서 유일한 방법은 많은 지점을 유지하는 것입니다. 내가 옳다면 며칠 안에 수백 개의 지점을 갖게 될 것이므로 아마 이해하지 못할 것입니다.
누구든지 제발 그것을 정리할 수 있습니까?
우리가하고 싶은 일에 대한 질적 설명부터 시작해 보겠습니다 (이 중 대부분은 Ben Straub의 답변에 나와 있습니다). 몇 번의 커밋을 수행했으며 그 중 5 개는 주어진 파일을 변경했으며 파일을 이전 버전 중 하나로 되돌리려 고합니다. 우선, git은 개별 파일의 버전 번호를 유지하지 않습니다. 콘텐츠 만 추적합니다. 커밋은 기본적으로 일부 메타 데이터 (예 : 커밋 메시지)와 함께 작업 트리의 스냅 샷입니다. 따라서 원하는 파일의 버전이있는 커밋을 알아야합니다. 이 사실을 알게되면 파일을 해당 상태로 되 돌리는 새 커밋을 만들어야합니다. (우리는 이미이 내용을 밀고 있고, 편집 역사는 다른 모든 사람들을 엉망으로 만들기 때문에 우리는 역사 만 가지고 다닐 수는 없습니다.)
이제 올바른 커밋을 찾는 것부터 시작하겠습니다. 주어진 파일을 매우 쉽게 수정 한 커밋을 볼 수 있습니다.
git log path/to/file
커밋 메시지가 충분하지 않고 각 커밋에서 파일에 수행 된 작업을 확인해야하는 경우 다음 -p/--patch
옵션을 사용합니다 .
git log -p path/to/file
또는 gitk의 그래픽보기를 선호하는 경우
gitk path/to/file
보기 메뉴를 통해 gitk를 시작한 후에도이 작업을 수행 할 수 있습니다. 보기 옵션 중 하나는 포함 할 경로 목록입니다.
어느 쪽이든 원하는 파일 버전으로 커밋의 SHA1 (해시)을 찾을 수 있습니다. 이제해야 할 일은 다음과 같습니다.
# get the version of the file from the given commit
git checkout <commit> path/to/file
# and commit this modification
git commit
(체크 아웃 명령은 먼저 파일을 색인으로 읽은 다음 작업 트리에 복사하므로 git add
커밋을 준비하기 위해 색인에 추가하는 데 사용할 필요가 없습니다 .)
파일에 간단한 기록 (예 : 이름 변경 및 복사)이 없을 수있는 경우 VonC의 우수한 주석을 참조하십시오. git
속도를 희생하면서 그러한 것들을 더 신중하게 검색하도록 지시 할 수 있습니다. 역사가 간단하다고 확신한다면 귀찮게 할 필요가 없습니다.
Git은 매우 유연합니다. 요청한 작업을 수행하기 위해 수백 개의 분기가 필요하지 않아야합니다. 상태를 두 번째 변경으로 되돌리려면 (실제로 이미 커밋되고 푸시 된 변경)을 사용 git revert
합니다. 다음과 같은 것 :
git revert a4r9593432
여기서 a4r9593432는 백 아웃하려는 커밋 해시의 시작 문자입니다.
커밋에 여러 파일에 대한 변경 사항이 포함되어 있지만 파일 중 하나만 되돌리려면 다음을 사용할 수 있습니다 git reset
(두 번째 또는 세 번째 형식).
git reset a4r9593432 -- path/to/file.txt
# the reverted state is added to the staging area, ready for commit
git diff --cached path/to/file.txt # view the changes
git commit
git checkout HEAD path/to/file.txt # make the working tree match HEAD
그러나 이것은 매우 복잡하고 git reset은 위험합니다. git checkout <hash> <file path>
Jefromi가 제안한대로 대신 사용하십시오 .
commit x에서 파일이 어떻게 보이는지 보려면 다음을 사용할 수 있습니다 git show
.
git show a4r9593432:path/to/file.txt
모든 명령에 대해 커밋 해시를 통하지 않고 커밋을 참조하는 방법은 여러 가지가 있습니다 ( Git 사용 설명서의 커밋 이름 지정 참조 ).
Git은 파일 버전 측면에서 생각하지 않습니다. git의 버전은 전체 트리의 스냅 샷입니다.
이것을 감안할 때, 여러분이 정말로 원하는 것은 대부분의 파일의 최신 내용을 가지고 있지만 한 파일의 내용이 5 개 커밋 전과 동일한 트리입니다. 이것은 이전 커밋 위에 새로운 커밋의 형태를 취할 것이며 최신 버전의 트리는 원하는 것을 가질 것입니다.
I don't know if there's a one-liner that will revert a single file to the contents of 5 commits ago, but the lo-fi solution should work: checkout master~5
, copy the file somewhere else, checkout master
, copy the file back, then commit.
You can take a diff that undoes the changes you want and commit that.
E.g. If you want to undo the changes in the range from..to
, do the following
git diff to..from > foo.diff # get a reverse diff
patch < foo.diff
git commit -a -m "Undid changes from..to".
Extracted from here: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html
git revert <commit>
git reset
git add <path>
git commit ...
git reset --hard # making sure you didn't have uncommited changes earlier
It worked very fine to me.
참고URL : https://stackoverflow.com/questions/2733873/reverting-a-single-file-to-a-previous-version-in-git
'Program Tip' 카테고리의 다른 글
왜 this ()와 super ()가 생성자의 첫 번째 문장이어야합니까? (0) | 2020.10.03 |
---|---|
Java에서 getPath (), getAbsolutePath () 및 getCanonicalPath ()의 차이점은 무엇입니까? (0) | 2020.10.03 |
"(function () {…}) ()"과 같은 익명 함수에서 전체 Javascript 파일을 래핑하는 목적은 무엇입니까? (0) | 2020.10.03 |
Flexbox : 수평 및 수직 중앙 (0) | 2020.10.03 |
커밋 메시지를 변경하지 않고 커밋을 수정하는 방법 (이전 메시지 재사용)? (0) | 2020.10.03 |