file checkout -b - Git에서 한 파일의 작업 사본 수정을 취소 하시겠습니까?





6 Answers

git checkout <commit> <filename>

왜냐하면 나는 내 favicon이 내가 drupal 6.10으로 승격되었을 때 약간의 커밋을 덮어 썼다는 것을 깨달았 기 때문에 이것을 사용했다. 그래서 나는 그것을 되돌려 놓아야했다. 여기 내가 한 일이있다.

git checkout 088ecd favicon.ico
옵션 branch remote

마지막으로 커밋 한 후 작업 복사본에서 많은 파일을 수정했지만 가장 최근의 커밋과 동일한 상태로 다시 설정하는 것처럼 해당 파일 중 하나의 변경 사항을 취소하고 싶습니다.

그러나, 그저 하나의 파일 만 작업 복사본의 변경 사항을 원상태로 되돌리고 싶습니다.

어떻게해야합니까?




파일이 이미 준비된 경우 (파일을 편집 한 후 git add 등을 수행 할 때 발생) 변경 사항을 취소합니다.

용도

git reset HEAD <file>

그때

git checkout <file>

이미 상연되지 않은 경우

git checkout <file>



나는 항상 이것과 혼란스러워, 여기 미리 알림 테스트 케이스가있다; git 를 테스트 할 bash 스크립트가 있다고 가정 해 봅시다.

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

이 시점에서 변경 사항은 캐시에 저장되지 않으므로 git status 는 다음과 같습니다.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

이 시점에서 우리는 git checkout 을 수행하면 결과는 다음과 같습니다.

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

대신 git reset 을 수행하면 결과는 다음과 같습니다.

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

따라서,이 경우 - 변경 사항이 준비되지 않은 경우 git reset 은 아무런 차이가 없으며 git checkout 은 변경 사항을 덮어 씁니다.

위의 스크립트에서 마지막으로 변경 한 내용이 staged / cached라고 git add b.txtgit add b.txt . 즉, 끝에 git add b.txtgit add b.txt .

이 경우, git status 는 다음과 같습니다.

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

이 시점에서 우리는 git checkout 을 수행하면 결과는 다음과 같습니다.

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

대신 git reset 을 수행하면 결과는 다음과 같습니다.

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

그래서,이 경우 - 변경 사항이 준비되면 git reset 은 기본적으로 무단 변경에 대한 단계적 변경을 수행합니다 - git checkout 은 변경 사항을 완전히 덮어 씁니다.




SHA id를 사용하여 파일을 복원합니다. git checkout <sha hash id> <file name>




아직 커밋하지 않았거나 커밋을 공유하지 않은 경우 :

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend



이미 커밋 된 경우 파일 변경 내용을 되돌리고 다시 커밋 한 다음 마지막 커밋을 통해 새 커밋을 스쿼시 할 수 있습니다.




Related