2012-01-26 2 views
3

나는 5 커밋과 같은 커밋에 추가 할 파일을 삭제했다는 것을 깨달았다. 커밋 메시지에서 파일이 포함되었다고했는데 "Ok!이 파일을 커밋 #XXXXX에 추가하는 것을 잊어 버렸습니다"라는 문구로 새로운 커밋을하고 싶지 않습니다.이전 git commit을 편집하려면 어떻게해야합니까?

이전에 편집 한 내용을 편집하는 가장 좋은 방법은 무엇입니까? 커밋하면 파일을 추가 할 수 있습니까?

답변

8

수정 사항을 적용한 다음 git rebase --interactive을 사용하여 커밋을 재정렬하고 두 커밋을 함께 스쿼시하십시오. 자세한 내용은 the git book을 참조하십시오.

저장소 히스토리를 변경하기 때문에 커밋이 이미 푸시 된 경우이 작업을 수행하는 것은 좋지 않습니다.

예 세션은 다음과 같이 수 :

% git init 
Initialized empty Git repository in /home/user/repo/.git/ 
% echo "A line" > a.txt 
% echo "A line" > b.txt 
% git add a.txt b.txt 
% git commit -m "Initial commit" 
[master (root-commit) c6329d0] Initial commit 
2 files changed, 2 insertions(+), 0 deletions(-) 
create mode 100644 a.txt 
create mode 100644 b.txt 

귀하의 불완전한 커밋 :

% echo "Another line" >> a.txt 
% git add a.txt 
% git commit -m "Important changes" 
[master 0d28cfa] Important changes 
1 files changed, 1 insertions(+), 0 deletions(-) 

다른 어떤 커밋 : 당신이 뭔가를해야만 잊어 버린

% echo "Yet another line" >> b.txt 
% git add b.txt 
% git commit -m "Other changes" 
[master 96a092d] Other changes 
1 files changed, 1 insertions(+), 0 deletions(-) 

주의 사항 :

2,763,210은 git rebase -i와 역사를 수정 :

이 당신은 다음과 같은 내용으로 선택의 여지가 귀하의 편집기에 넣어지게된다

% git rebase -i HEAD~3 
: 그것은 있도록이 "죄송합니다"커밋이

pick 0d28cfa Important changes 
pick 96a092d Other changes 
pick 9dce889 Oops 

변경입니다 한 줄 위를 이동하여 picksquash (또는 단지 s)으로 변경하여 앞의 커밋과 결합하십시오.

pick 0d28cfa Important changes 
s 9dce889 Oops 
pick 96a092d Other changes 

그런 다음 파일을 저장하고 편집을 종료하십시오. 그러면 다른 편집기가 팝업되어 결합 된 커밋에 대한 커밋 메시지를 편집 할 수 있습니다. 다음과 같이 표시됩니다.

# This is a combination of 2 commits. 
# The first commit's message is: 

Important changes 

# This is the 2nd commit message: 

Oops 

느낌이 적절할 때 변경 한 다음 저장하고 종료하십시오.

마지막으로, 새로운 실제로 두 커밋의 조합 커밋 확인 :

% git log -p HEAD~2..HEAD~1 
commit 7a4c496956eb269c551bbf027db8b0f2320b65e4 
Author: User Name <[email protected]> 
Date: Fri Feb 3 22:57:31 2012 +0100 

    Important changes 

diff --git a/a.txt b/a.txt 
index 8d7158c..54df739 100644 
--- a/a.txt 
+++ b/a.txt 
@@ -1 +1,3 @@ 
A line 
+Another line 
+Important line forgotten previously 
+0

나는보다 철저한 설명과, 심지어는 연습을 좋아하지만, 이것이 출발점이라고 생각합니다. – Hubro

+0

예를 추가했습니다. 도움이되기를 바랍니다. –

1

당신은 확인하기 위해 git commit --fixup <hash>를 사용할 수있는 특수가가와 병합 될 것입니다 커밋 표시된 이전의 그 해시 커밋 <hash>입니다. 누락 된 파일을 추가하거나 오타를 수정하는 데 이상적입니다.

일단 수정 커밋을 얻으면 git rebase --interactive --autosquash <starting-point>을 사용하여 수정 커밋을 실제로 <hash> 커밋으로 병합해야합니다. rebase의 <starting-point><hash> 커밋 이전의 일부 지점이어야합니다 (단순화를 위해 <hash>^을 사용할 수 있음).

히스토리 다시 쓰기에 대한 일반적인주의 사항이 적용됩니다. 다른 사용자가 가져온 지점을 이미 게시 한 경우 재 작성된 기록으로 다시 푸시하면 일반적으로 많은 혼란과 병합 문제가 발생합니다. 이 경우 수정을 새로운 커밋으로 푸는 것이 더 간단합니다.

참고 : git config --global rebase.autosquash true은 기본적으로 자동 스쿼시를 켜기 때문에 더 이상 rebase 대화식 명령에 --autosquash 옵션을 전달할 필요가 없습니다. 이것은 좋은 기본값입니다. autosquashing의

좋은 walkthough는 여기에서 찾을 수 있습니다하십시오 그것을하기 위해 https://robots.thoughtbot.com/autosquashing-git-commits

1

git squash을한다. 편집을 위해 e 또는 'R'을 선택 - 당신이 당신의 커밋 스쿼시되면

// X is the number of commits you wish to edit 
git rebase -i HEAD~X 

.

보존을 위해 최신 커밋에 대해을 선택하십시오.

enter image description here


또 다른 옵션은 매개 변수를 얻을 당신이 그들을 업데이트하고 대신 오래된 것들의 새 값으로 다시 커밋 할 수있는 방법

다음

는 필터 지점을 사용하는 것입니다.

이 샘플에서는 전자 메일을 변경했지만 메시지에도 동일하게 적용됩니다.

git filter-branch --commit-filter ' 
    if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ]; 
    then 
      GIT_COMMITTER_NAME="<New Name>"; 
      GIT_AUTHOR_NAME="<New Name>"; 
      GIT_COMMITTER_EMAIL="<New Email>"; 
      GIT_AUTHOR_EMAIL="<New Email>"; 
      git commit-tree "[email protected]"; 
    else 
      git commit-tree "[email protected]"; 
    fi' HEAD ` 
관련 문제