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



5 Answers

git checkout <commit> <filename>

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

git checkout 088ecd favicon.ico
Question

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

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

어떻게해야합니까?




나를 위해서만이 사람은 일했다.

git checkout -p filename




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

용도

git reset HEAD <file>

그때

git checkout <file>

이미 상연되지 않은 경우

git checkout <file>



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

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



나는 git bash를 완료했다 :

(use "git checkout -- <file>..." to discard changes in working directory)

  1. 힘내 상태. [그래서 우리는 하나의 파일이 수정 된 것을 보았습니다.]
  2. 자식 체크 아웃 - index.html [나는 index.html 파일에서 변경 :
  3. 자식 상태 [이제 그 변경 사항이 제거되었습니다]




나는 항상 이것과 혼란스러워, 여기 미리 알림 테스트 케이스가있다; 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 은 변경 사항을 완전히 덮어 씁니다.




Related