etc./StackOverFlow

Git 커밋에서 파일 제거

청렴결백한 만능 재주꾼 2021. 12. 21. 22:08
반응형

질문자 :Lolly


나는 Git을 사용하고 있으며 다음을 사용하여 몇 개의 파일을 커밋했습니다.

 git commit -a

나중에 파일이 실수로 커밋에 추가된 것을 발견했습니다.

마지막 커밋에서 파일을 제거하려면 어떻게 해야 합니까?



이것은 잘못 커밋된 파일을 변경 사항을 취소하지 않고 이전 커밋에서 스테이징 영역으로 다시 옮기는 문제이기 때문에 여기에 있는 다른 답변은 잘못된 것이라고 생각합니다. 이것은 Paritosh Singh이 제안한 대로 수행할 수 있습니다.

 git reset --soft HEAD^

또는

 git reset --soft HEAD~1

그런 다음 커밋에서 제외하기 위해 원하지 않는 파일을 재설정합니다.

 git reset HEAD path/to/unwanted_file

이제 다시 커밋하면 동일한 커밋 메시지를 다시 사용할 수도 있습니다.

 git commit -c ORIG_HEAD

juzzlin

주의 ! 이전 커밋에서만 파일을 제거하고 디스크에 유지하려면 바로 위 의 juzzlin의 답변을 읽으십시오.

이것이 마지막 커밋이고 로컬 및 원격 저장소에서 파일 을 완전히 삭제하려는 경우 다음을 수행할 수 있습니다.

  1. git rm <file> 파일 제거
  2. 수정 플래그로 git commit --amend

수정 플래그는 git에게 다시 커밋하도록 지시하지만 이 커밋을 마지막 커밋과 "병합"합니다(두 가지를 병합한다는 의미가 아님).

주석에서 언급했듯이 git rm rm 명령 자체를 사용하는 것과 같습니다!


CharlesB

기존 답변은 모두 마지막 커밋에서 원하지 않는 파일을 제거하는 것에 대해 이야기하고 있습니다.

이전 커밋(푸시된 경우에도)에서 원치 않는 파일을 제거하고 작업 때문에 불필요한 새 커밋을 만들고 싶지 않은 경우:

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

불행히도 충돌이 발생하면 수동으로 해결해야 합니다.


Brian

허용된 답변에서 알 수 있듯이 전체 커밋을 재설정하여 이를 수행할 수 있습니다. 그러나 이것은 다소 무거운 접근 방식입니다.
이를 수행하는 더 깨끗한 방법은 커밋을 유지하고 변경된 파일을 간단히 제거하는 것입니다.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit

git reset 은 이전 커밋에서와 같이 파일을 가져 와서 인덱스에 스테이징합니다. 작업 디렉토리의 파일은 변경되지 않습니다.
git commit 은 현재 커밋에 인덱스를 커밋하고 스쿼시합니다.

이것은 본질적으로 이전 커밋에 있던 파일의 버전을 가져와 현재 커밋에 추가합니다. 결과적으로 순 변경 사항이 없으므로 파일이 커밋에서 효과적으로 제거됩니다.


phemmer

서버에서 변경 사항을 푸시하지 않은 경우 다음을 사용할 수 있습니다.

 git reset --soft HEAD~1

모든 변경 사항을 재설정하고 하나의 커밋으로 되돌립니다.

변경 사항을 푸시한 경우 @CharlesB가 답변한 단계를 따르세요.


Paritosh Singh

rm을 사용하여 파일을 제거하면 파일이 삭제됩니다!

항상 git에서 커밋을 제거하는 대신 추가하므로 이 경우 파일을 첫 번째 커밋 이전의 상태로 되돌립니다(파일이 새 파일인 경우 'rm' 삭제 작업일 수 있음). 다시 커밋하면 파일이 이동합니다.

파일을 이전 상태로 되돌리려면:

 git checkout <commit_id> <path_to_file>

또는 원격 HEAD의 상태로 되돌리려면:

 git checkout origin/master <path_to_file>

그런 다음 커밋을 수정하면 파일이 목록에서 사라지고 디스크에서 삭제되지 않은 것을 확인할 수 있습니다.


Bob Flannigon

git checkout HEAD~ path/to/file git commit --amend

Denis Shchepetov

예를 들어 설명하겠습니다.
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>

Moaz Rashad

다음은 OP가 요청한 의도한 파일만 스테이지 해제합니다.

 git reset HEAD^ /path/to/file

다음과 같은 내용이 표시됩니다...

커밋할 변경 사항: ("git reset HEAD ..."를 사용하여 스테이지 해제)

수정됨: /경로/대상/파일

커밋을 위해 준비되지 않은 변경 사항: (커밋할 내용을 업데이트하려면 "git add ..."를 사용) (작업 디렉토리의 변경 사항을 취소하려면 "git checkout -- ..."를 사용)

수정됨: /경로/대상/파일

  • "커밋할 변경 사항"은 커밋 전 파일의 이전 버전입니다. 파일이 존재하지 않는 경우 삭제된 것처럼 보입니다. 이 변경 사항을 커밋하면 변경 사항을 분기의 파일로 되돌리는 개정판이 있을 것입니다.
  • "커밋을 위해 준비되지 않은 변경 사항"은 커밋한 변경 사항이며 파일의 현재 상태입니다.

이 시점에서 다른 버전으로 재설정하는 것과 같이 파일에 대해 원하는 모든 작업을 수행할 수 있습니다.

커밋할 준비가 되면:

 git commit --amend -a

또는 (아직 커밋하고 싶지 않은 다른 변경 사항이 있는 경우)

 git commit add /path/to/file git commit --amend

ThatsAMorais

당신은 단순히 시도 할 수 있습니다.

 git reset --soft HEAD~1

그리고 새로운 커밋을 생성합니다.

그러나 멋진 소프트웨어 "gitkraken"이 있습니다. git으로 쉽게 작업할 수 있습니다.


HamzaMushtaq

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>^

그러면 더 복잡한 명령을 기억하거나 메시지를 커밋하거나 많이 입력하지 않고도 쉽게 리베이스를 완료할 수 있습니다.


Bryan Buckley

git GUI를 사용하면 이전 커밋에서 파일을 간단하게 제거할 수 있습니다.

이것이 공유 분기가 아니고 history 를 다시 작성해도 괜찮다고 가정하고 다음을 실행하십시오.

 git gui citool --amend

실수로 커밋된 파일의 체크를 해제한 후 "커밋"을 클릭할 수 있습니다.

여기에 이미지 설명 입력

파일은 커밋에서 제거되지만 디스크에는 유지됩니다 . 따라서 실수로 파일을 추가한 후 선택을 취소하면 추적되지 않은 파일 목록에 표시됩니다(그리고 실수로 파일을 수정한 후 파일을 선택 취소하면 커밋 목록에 준비되지 않은 변경 사항에 표시됩니다).


JDiMatteo

커밋을 유지하고(이미 자세한 커밋 메시지를 작성하는 데 시간을 보냈고 이를 잃지 않으려는 경우) 커밋에서 파일만 제거하고 저장소에서 완전히 제거하지 않으려면 다음을 수행합니다.

 git checkout origin/<remote-branch> <filename> git commit --amend

mattexx

추가 명령을 실행해야 했기 때문에 최상위 답변을 보완하고 싶었습니다.

 git reset --soft HEAD^ git checkout origin/master <filepath>

건배!


andrepo

다음 명령을 순서대로 수행하십시오.

 //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'

Sergey Onishchenko

이전 커밋에서 파일을 제거하려면 필터를 사용하세요.

 git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

이 오류가 표시되는 경우:

새 백업을 만들 수 없습니다. 이전 백업이 이미 refs/original/에 존재합니다. -f를 사용하여 백업을 강제로 덮어씁니다.

로컬 리포지토리에서 refs 백업을 제거하기만 하면 됩니다.

 $ rm -rf .git/refs/original/refs

wilo087

git reset --soft HEAD~1.

이것은 로컬 repos의 마지막 커밋을 취소하고 커밋을 수행하기 전과 같이 모든 것을 스테이지 영역으로 다시 이동합니다. 그런 다음 일반적인 Git UI 도구(TortoiseGit, Git UI, Git Extensions...)를 사용하여 커밋하고 싶지 않은 파일을 언스테이징한 다음 커밋을 다시 수행합니다.


Minh Nguyen

나를 위해 일했지만 여전히 더 나은 솔루션이 있어야한다고 생각합니다.

 $ git revert <commit_id> $ git reset HEAD~1 --hard

버리고 싶은 변경 사항을 다른 커밋에 남겨두고 다른 커밋을 확인하십시오.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes

saiyancoder

하나의 파일만 되돌리려는 로컬 분기에 변경 사항이 있는 동일한 문제가 있었습니다. 나를 위해 일한 것은 -

( 아래 기능/target_branch 는 특정 파일에 대해 실행 취소하려는 변경 사항을 포함하여 모든 변경 사항이 있는 곳입니다)

( origin/feature/target_branch 는 변경 사항을 푸시하려는 원격 분기입니다)

( 기능/스테이징 은 하나의 파일에 대한 변경 사항을 제외하고 원하는 모든 변경 사항에서 푸시할 임시 스테이징 분기입니다)

  1. 내 origin/feature/target_branch 에서 로컬 브랜치를 생성 합니다. 기능/스테이징 이라고 합니다.

  2. 내 작업 로컬 분기 기능/target_branch기능/스테이징 분기에 병합했습니다.

  3. 기능/스테이징확인한 다음 git reset --soft ORIG_HEAD (이제 기능/스테이징의 모든 변경 사항이 스테이징되지만 커밋되지 않음)를 확인했습니다.

  4. 불필요한 변경으로 이전에 체크인한 파일을 언스테이징했습니다.

  5. 기능/스테이징 에 대한 업스트림 분기 를 origin/feature/target_branch로 변경했습니다.

  6. 나머지 단계적 변경 사항을 커밋하고 원격 Origin/feature/target_branch로 업스트림 푸시


user1201303

git reset --soft HEAD^ 커밋을 되돌리고 git status 를 입력하면 수행할 작업을 알려줍니다.

 Changes to be committed: (use "git reset HEAD <file>..." to unstage)

cardamom

사실 git rebase 대화형 모드를 사용하는 것이 더 빠르고 쉬운 방법이라고 생각합니다.

 git rebase -i head~1

(또는 head~4, 얼마나 가고 싶은지)

그런 다음 '선택'대신 '편집'을 사용하십시오. '편집'이 얼마나 강력한지 몰랐습니다.

https://www.youtube.com/watch?v=2dQosJaLN18

도움이 되셨기를 바랍니다.


Matt

해당 파일이 더 이상 필요하지 않은 경우 다음을 수행할 수 있습니다.

 git rm file git commit --amend git push origin branch

tven

GitHub를 사용 중이고 아직 커밋을 푸시하지 않은 경우 GitHub Desktop은 이 문제를 쉽게 해결합니다.

  1. 저장소 선택 -> 가장 최근 커밋 실행 취소
  2. 실수로 추가한 파일의 선택을 취소합니다. 이전 커밋 메시지는 이미 대화 상자에 있습니다.
  3. 커밋 버튼을 눌러주세요!

Ron

이것은 처음에 파일을 분기로 푸시한 비트 버킷 저장소에서 파일을 제거하기 위해 작동했습니다.

 git checkout origin/develop <path-to-file> git add <path-to-file> git commit -m "Message" git push

swathi

아직 변경 사항을 git에 푸시하지 않은 경우

 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

TanvirChowdhury

현재 파일을 다른 폴더에 복사한 다음 다음과 같이 푸시되지 않은 모든 변경 사항을 제거합니다.

 git reset --hard @{u}

그런 다음 다시 복사하십시오. 커밋, 푸시.


Miranda

다음 명령을 사용하면 됩니다.

 git restore --staged <file>

suulisin

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)

Sheo Dayal Singh

우리가 할 수 있는 또 다른 접근 방식은 다음과 같습니다.

  1. 파일 삭제
  2. 삭제된 파일로 새 커밋 만들기
  3. 대화형 리베이스를 수행하고 두 커밋을 모두 스쿼시합니다.
  4. 푸시

Yeikel

어떤 이유로든(내 경우와 같이) git reset --soft HEAD^ 에서와 같이 마지막 커밋에서 모든 파일을 재설정하는 데 문제가 있고 귀하의 경우가 다음 조건을 충족하는 경우 아래에서 설명하는 대로 할 수 있습니다. .

  1. 제거하려는 파일이 마지막 커밋 전에 이미 저장소에 존재했습니다.
  2. 이전 커밋 이후 파일의 모든 변경 사항을 취소할 수 있습니다( HEAD~2 - 마지막 커밋 직전 커밋)

그런 다음 이전 커밋(HEAD~2) 이후의 모든 변경 사항을 취소하고 파일을 저장하고 스테이징( git add filename )한 다음 git commit --amend --no-edit 를 실행할 수 있습니다. 이것은 "새 변경 사항"을 커밋합니다. 이는 실제로 마지막 커밋 이전과 마찬가지로 파일을 마지막 커밋으로 다시 커밋합니다.


Wesley Gonçalves

출처 : http:www.stackoverflow.com/questions/12481639/remove-files-from-git-commit

반응형