파일을 추가 해제하기 위해 마지막 커밋을 수정하는 방법은 무엇입니까?


108

나는 두 개의 파일을 수정 한 a, b마지막에 커밋합니다. 그러나 파일 b을 커밋해서는 안됩니다.이를 수정하는 워크 플로는 무엇입니까?

답변:


109

업데이트 (몇 년 후)

얀 후덱

인덱스에서만 제거하는 것은 쉽지 않습니다.

사실 : 최근 답변 ( Matt Connolly 작성 )이 제안한 것처럼 파일을 색인 내용으로 쉽게 재설정 할 수 있습니다 .

git reset HEAD^ path/to/file/to/revert

HEAD^커밋 이전에 자사의 콘텐츠에 액세스 할 수있는 파일 수 있습니다 전에 마지막으로 하나.

git commit --amend내가 처음에 쓴 것처럼 당신은 할 수 있습니다.


Git 2.23 (2019 년 8 월)에서는 새로운 명령을 사용할 수 있습니다git restore

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

더 짧은 :

 git restore -s@^ -S -- path/to/file/to/revert

다시 git commit --amend처음에 쓴 것처럼 다시 할 수 있습니다.


원래 답변 (2011 년 1 월)

이 경우 마지막, 당신은 할 수 커밋 (당신은 어디를 밀어하지 않은 경우) 개정 을 :
(첫번째 은닉 또는 저장 b)

 git commit --amend

그런 다음 b를 삭제하고 다시 커밋하십시오. b를 복원하면 완료됩니다.

--amend

현재 지점의 팁을 수정하는 데 사용됩니다.
평소와 같이 최신 커밋을 바꾸려는 트리 객체를 준비하십시오 (일반적인 -i / -o 및 명시 적 경로 포함). 커밋 로그 편집기에는 현재 브랜치의 끝에서 커밋 메시지가 시드됩니다.
생성 한 커밋은 현재 팁을 대체합니다. 병합 된 경우 현재 팁의 부모를 부모로 갖게됩니다. 따라서 현재 상위 커밋은 삭제됩니다.


... Then stash/delete b, re-commit.., 여기에 단어 Then가 없어야 after합니까? - --amendstach / 삭제 B 후, ...
시에 Jìléi

@ 谢 继 雷 : 다시 말해, 먼저 b를 저장하고 커밋 --amend 한 다음 복원 하시겠습니까? 참된. 답변을 업데이트했습니다.
VonC

git index의 힘으로, 누군가에게 파일을 숨기거나 저장하라고 말하는 것은 단순한 바보입니다 (-1). 인덱스에서만 제거하는 것은 쉽지 않습니다.
Jan Hudec

1
@ JanHudec 사실, 그에 따라 답변을 편집했습니다. Stack Overflow와 마찬가지로 이전 답변을 따르지 않았습니다. SU에 대한 자식 질문의 99 %는 어쨌든 마이그레이션해야합니다.
VonC

66
  1. git diff --name-only HEAD^ -(선택 사항) 마지막 커밋에서 변경된 파일을 나열하는 데 사용합니다.
  2. git reset HEAD^ path/to/file/to/revert- 작업 복사본을 건드리지 않고 인덱스 를 마지막 버전 으로 재설정합니다 .
  3. git commit --amend- 인덱스 변경 사항 을 포함하도록 마지막 커밋을 수정합니다.

9
Imho 그것은 받아 들여지는 것보다 훨씬 더 나은 대답입니다.
mik01aj

1
git commit -a --amend3 단계에서 사용하지 않아야합니다 (예 : 파일 추가 안 함). 제거하려는 편집인 작업 사본 변경 사항을 커밋합니다. 선택적인 단계 2.5는 git checkout path/to/file/to/revert작업 사본도 정리하는 것입니다.
dmnd

1
또는 git rm --cached path/to/file/to/revert트리에서 파일을 삭제하지 않고 파일을 추가 취소 할 수 있습니다.
Jan Hudec

13

또는을 사용하는 경우 git gui"마지막 커밋 수정"옵션을 선택하기 만하면 추가 된 파일이 "스테이지"목록에 표시되고 해당 아이콘을 클릭하여 "스테이지되지 않은"목록으로 이동하고 커밋합니다.


1
@VonC : 패치 편집 및 분할은 많은 git 사용자에게 매우 일반적인 작업이므로 GUI는 쉽게 만들 수 있도록 설계되었으며 IMO를위한 최고의 도구입니다.
Jan Hudec

저것은 작동한다! 나는 그 특정 작업에 대한 다른 옵션으로 성공하지 못했습니다. 팁 고마워!
Serguzest

10

마지막 커밋에서 b를 삭제하려면

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

마지막 커밋에서 b에 대한 모든 변경 사항을 제거하려면

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cached백업 / 복원 댄스 (-1)를 치우십시오.
Jan Hudec

지적 해 주셔서 감사합니다. 나는 이것이 전체 스레드를 읽은 후에도 가장 편안하다고 생각한 접근 방식이기 때문에 어떻게했는지 공유하고 싶었습니다.
pingo

4

인덱스 해커가 필요하지 않지만 그럼에도 불구하고 이전 커밋 메시지를 보존하는 대안 :

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

(a) 정기적으로 사용하는 명령을 사용하고 (b) git add -p커밋하려는 항목을 정확하게 파악할 수 있기 때문에 이것을 좋아합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.