나는 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 push
repo까지 수정 하려고 하면 불평 할 것 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 --amend
amend 플래그는 git에게 다시 커밋하도록 지시하지만 마지막 커밋과 함께이 커밋을 "병합"합니다 (두 가지를 병합한다는 의미는 아님).
주석에서 언급했듯이 git rm
여기서 사용하는 것은 rm
명령 자체를 사용하는 것과 같습니다 !
git rm --cached
디스크에 파일을 유지하는 데 사용할 수 있습니다
rm
git
rm
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 rebase
git이 자동으로 커밋을 올바른 위치로 이동하므로 대화식 리베이스에서 아무것도 할 필요가 없습니다. 결과를 저장하면됩니다 -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"파일을 추가하고 커밋에서 제거하려는 경우 매우 유용합니다.