나는 Git을 사용하고 있으며 사용하는 파일이 거의 없다.
git commit -a
나중에 파일이 커밋에 실수로 추가 된 것을 발견했습니다.
마지막 커밋에서 파일을 어떻게 제거합니까?
git reset filepath
나는 Git을 사용하고 있으며 사용하는 파일이 거의 없다.
git commit -a
나중에 파일이 커밋에 실수로 추가 된 것을 발견했습니다.
마지막 커밋에서 파일을 어떻게 제거합니까?
git reset filepath
답변:
실수로 커밋 된 파일을 변경 사항을 취소하지 않고 이전 커밋에서 스테이징 영역으로 다시 이동시키는 문제이기 때문에 여기에 다른 답변이 잘못되었다고 생각합니다. 이것은 Paritosh Singh이 제안한 것처럼 수행 할 수 있습니다.
git reset --soft HEAD^
또는
git reset --soft HEAD~1
그런 다음 원하지 않는 파일을 재설정하여 커밋에서 제외하십시오.
git reset HEAD path/to/unwanted_file
이제 다시 커밋하면 동일한 커밋 메시지를 다시 사용할 수도 있습니다.
git commit -c ORIG_HEAD
git pushrepo까지 수정 하려고 하면 불평 할 것 Updates were rejected because the tip of your current branch is behind its remote counterpart.입니다. 푸시하려는 경우 (예 : 포크) -f옵션을 사용 하여 푸시를 강제 할 수 있습니다 ( 예 :) git push origin master -f. (다른 사람들이 가져 오는 업스트림 저장소에는이 작업을 수행하지 마십시오)
git reset --soft HEAD^가장 일반적인 실행 취소 작업입니다
git reset기존의 커밋에 영향을 줄 수있는 방법을 원했다. 방금 배웠습니다 git commit -C. 나에게있어, 내가 원하는 것은 "새로운 커밋"이라는 또 하나의 단계가있는 정확한 레시피입니다 git commit -C [hash of original HEAD commit from first step].
주의 ! 이전 커밋에서 파일을 제거하고 디스크에 보관하려면 위 의 juzzlin의 답변을 읽으 십시오 .
이것이 마지막 커밋이고 로컬 및 원격 저장소에서 파일 을 완전히 삭제 하려는 경우 다음을 수행 할 수 있습니다.
git rm <file>git commit --amendamend 플래그는 git에게 다시 커밋하도록 지시하지만 마지막 커밋과 함께이 커밋을 "병합"합니다 (두 가지를 병합한다는 의미는 아님).
주석에서 언급했듯이 git rm여기서 사용하는 것은 rm명령 자체를 사용하는 것과 같습니다 !
git rm --cached디스크에 파일을 유지하는 데 사용할 수 있습니다
rmgitrm
git commit --amend아직 거기와와 예를 들어 찾을 수 있습니다 git reflog. 따라서 다른 의견에서 제안한 것처럼 나쁘지 않습니다.
기존 답변은 마지막 커밋 에서 원하지 않는 파일을 제거하는 것에 관한 것 입니다.
오래된 파일에서 원하지 않는 파일을 제거하려면 커밋 (푸시조차도) 새 커밋을 생성하지 않으려는 경우 작업으로 인해 필요하지 않습니다.
1.
파일이 준수 할 커밋을 찾으십시오.
git checkout <commit_id> <path_to_file>
많은 파일을 제거하려는 경우이 작업을 여러 번 수행 할 수 있습니다.
2.
git commit -am "remove unwanted files"
삼.
파일이 잘못 추가 된 커밋의 commit_id를 찾으십시오. 여기에서 "35c23c2"라고하겠습니다.
git rebase 35c23c2~1 -i // notice: "~1" is necessary
이 명령은 설정에 따라 편집기를 엽니 다. 기본 설정은 vim입니다.
"원치 않는 파일 제거"마지막 커밋을 잘못된 커밋의 다음 줄 (이 경우 "35c23c2")로 이동하고 명령을 fixup다음 과 같이 설정하십시오 .
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
파일을 저장 한 후에는 양호해야합니다.
끝내기 위해 :
git push -f
불행히도 충돌이 발생하면 수동으로 해결해야합니다.
git rm --cached <file(s)>.
--fixup=35c23c2는 git commit명령 에 추가 하여 조금 더 쉽게 만들 수 있습니다 . 이렇게하면 커밋이 필수 커밋 수정으로 자동 설정되므로 리베이스에서 커밋을 지정할 필요가 없습니다. 또한 명령에 추가 --autosquash하면 git rebasegit이 자동으로 커밋을 올바른 위치로 이동하므로 대화식 리베이스에서 아무것도 할 필요가 없습니다. 결과를 저장하면됩니다 -i. 어쨌든 그것을 사용하여 모든 것이 예상대로 보이도록하고 싶습니다.)
수락 된 답변에서 알 수 있듯이 전체 커밋을 재설정하여이 작업을 수행 할 수 있습니다. 그러나 이것은 다소 무거운 접근 방식입니다.
더 확실한 방법은 커밋을 유지하고 변경된 파일을 간단히 제거하는 것입니다.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
는 git reset그 이전 있다는 파일을 커밋 인덱스에 무대됩니다. 작업 디렉토리의 파일은 변경되지 않습니다.
그러면 git commit인덱스가 커밋되고 현재 커밋으로 스쿼시됩니다.
기본적으로 이전 커밋에 있던 파일 버전을 가져 와서 현재 커밋에 추가합니다. 결과적으로 순 변경이 없으므로 파일이 커밋에서 효과적으로 제거됩니다.
서버에서 변경 사항을 푸시하지 않은 경우 사용할 수 있습니다
git reset --soft HEAD~1
모든 변경 사항을 재설정하고 하나의 커밋으로 되돌립니다.
변경 사항을 적용한 경우 @CharlesB의 답변에 따라 단계를 수행하십시오.
rm을 사용하여 파일을 제거하면 파일이 삭제됩니다!
항상 제거하지 않고 git에서 커밋을 추가하고 있으므로이 경우 파일을 첫 번째 커밋 이전 상태로 되돌립니다 (파일이 새로운 경우 'rm'삭제 작업 일 수 있음). 다시 커밋하면 파일이 이동합니다.
파일을 이전 상태로 되돌리려면
git checkout <commit_id> <path_to_file>
또는 원격 HEAD의 상태로 되돌리려면 :
git checkout origin/master <path_to_file>
그런 다음 커밋을 수정하면 파일이 목록에서 사라지고 디스크에서 삭제되지 않았 음을 알 수 있습니다.
git checkout HEAD~ path/to/file
git commit --amend
다음은 OP가 요청한 파일의 스테이지를 해제합니다.
git reset HEAD^ /path/to/file
다음과 같은 것을 보게 될 것입니다 ...
커밋 할 변경 사항 : ( "git reset HEAD ..."를 사용하여 스테이지 해제)
수정 : / path / to / file
커밋을 위해 준비되지 않은 변경 사항 : (커밋 될 내용을 업데이트하려면 "git add ..."사용) (작업 디렉토리에서 변경 사항을 무시하려면 "git checkout-..."사용)
수정 : / path / to / file
이 시점에서 다른 버전으로 재설정하는 등 파일에 원하는 모든 작업을 수행 할 수 있습니다.
커밋 할 준비가되면 :
git commit --amend -a
또는 (커밋하지 않으려는 다른 변경 사항이있는 경우 아직 커밋하지 않음)
git commit add /path/to/file
git commit --amend
예를 들어 설명해 드리겠습니다.
A, B, C를 3 개의 연속 커밋으로 둡니다. 커밋 B에는 커밋해서는 안되는 파일이 있습니다.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop으로 변경하십시오.edit [A_commit_ID]e [A_commit_ID]
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
여전히 로컬 파일을 남겨 둡니다. 파일을 로컬로 원하지 않으면 --cached 옵션을 건너 뛸 수 있습니다.
모든 작업이 로컬 지점에있는 경우 나중에 커밋에 파일을 보관해야하며 깨끗한 기록을 유지하는 것처럼 더 간단한 방법은 다음과 같습니다.
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
그러면 더 복잡한 명령을 기억하거나 메시지를 커밋하거나 입력하지 않고도 쉽게 리베이스를 완료 할 수 있습니다.
git GUI를 사용하면 이전 커밋에서 파일을 간단하게 제거 할 수 있습니다.
이것이 공유 브랜치가 아니며 history를 다시 쓰는 것을 신경 쓰지 않는다면 다음을 실행하십시오.
git gui citool --amend
실수로 커밋 된 파일의 선택을 해제 한 다음 "Commit (커밋)"을 클릭하십시오.

커밋에서 파일이 제거되지만 disk에 유지됩니다 . 따라서 실수로 파일을 추가 한 후 확인을 취소하면 추적되지 않은 파일 목록에 표시됩니다 (실수로 파일을 수정 한 후 확인을 취소하면 커밋 목록에 대해 변경되지 않은 변경 사항에 표시됨).
sudo apt-get install git-gui
git rebase -i HEAD~4편집기를 열고 명령을 실행했습니다. 또 다른 메모 : "Unstaging"은 "Commit"메뉴에서 찾을 수 있습니다.
git reset --soft HEAD^--soft arg를 기억하는 것보다 오류가 발생하기 쉽지 않으며, git commit -c ORIG_HEAD--amend 대신에 모든 것을 망칩니다 .
다음 명령을 순서대로 수행하십시오.
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
추가 명령을 실행해야하기 때문에 최고의 답변을 보완하고 싶었습니다.
git reset --soft HEAD^
git checkout origin/master <filepath>
건배!
사실, 더 빠르고 쉬운 방법은 git rebase 대화 모드를 사용하는 것입니다.
git rebase -i head~1
(또는 머리 ~ 4, 얼마나 가고 싶은지)
그런 다음 'pick'대신 'edit'을 사용하십시오. 나는 '편집'이 얼마나 강력한 지 몰랐습니다.
https://www.youtube.com/watch?v=2dQosJaLN18
도움이 되길 바랍니다.
하나의 파일 만 되돌리려는 로컬 브랜치에서 변경 사항이있는 동일한 문제가 있습니다. 나를 위해 일한 것은-
( 아래의 feature / target_branch 는 특정 파일에 대해 실행 취소하려는 변경 사항을 포함하여 모든 변경 사항이있는 곳입니다)
( origin / feature / target_branch 는 변경 사항을 푸시하려는 원격 지점입니다)
( 기능 / 스테이징 은 하나의 파일에 대한 변경을 제외하고 원하는 모든 변경 사항을 추진할 임시 준비 지점입니다.)
내 origin / feature / target_branch 에서 로컬 브랜치를 만듭니다 ( feature / staging 이라고 함).
작동중인 로컬 지점 기능 / target_branch 를 기능 / 스테이지 지점으로 병합
기능 / 스테이징 을 체크 아웃 한 후 git reset --soft ORIG_HEAD (이제 기능 / 스테이징의 모든 변경 사항은 준비되었지만 커밋되지 않습니다.)
불필요한 변경으로 이전에 체크인 한 파일을 스테이지 해제
기능 / 스테이지 의 업스트림 브랜치 를 origin / feature / target_branch로 변경했습니다.
나머지 단계적 변경 사항을 적용하고 원격 원점 / 기능 / target_branch로 업스트림으로 푸시
변경 사항을 아직 자식으로 푸시하지 않으면
git reset --soft HEAD~1
모든 변경 사항을 재설정하고 하나의 커밋으로 되돌립니다.
이것이 마지막 커밋이고 로컬 및 원격 저장소에서 파일을 삭제하려면 다음을 시도하십시오.
git rm <file>
git commit --amend
또는 더 나은 :
먼저 재설정
git reset --soft HEAD~1
원치 않는 파일을 재설정
git reset HEAD path/to/unwanted_file
다시 커밋
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
현재로서는 어떤 대답도 합리적이지 않습니다. https://github.com/git/git/blob/master/Documentation/SubmittingPatches : 실제 솔루션을 제안해야 할만 큼 충분한 수요가있는 것처럼 들립니다.
git --uncommit <파일 이름>
좋은 것. 히스토리를 수정하고 싶지는 않지만 로컬이고 실수로 로컬 "hack"파일을 추가하고 커밋에서 제거하려는 경우 매우 유용합니다.