2011-01-17 7 views
3

브랜치 (A)에서 몇 가지 수정 작업을 수행했습니다.힘내 - 파일 움직임이 감지 되나요?

그런 다음 기존 작업 복사본의 상태를 기반으로 새로운 지점 (B)을 만들고이를 확정하고 추진하기로했습니다.

이전 리팩토링 중에 이동 한 파일이 많았으므로 이제 파일 시스템에서 직접 이동 한 버전 제어에 포함되지 않았습니다. 우연히 나는이 파일들을 커밋하고 새로운 브랜치 (B)에 넣기 전에 git에 추가하지 않았다.

이 파일을 추가하고 커밋하고 푸시하면 파일 이동 작업을 감지 할 수 있습니까?

답변

5

하나의 개정판에서 파일이 삭제되고 새 개정판에서 새 파일이 작성되므로 두 개의 별도 커미트로 완료되지 않습니다. 이름 바꾸기를 유지하려면 git commit --amend을 사용하여 삭제가있는 이전 커밋에 추가 내용을 추가해야합니다.

+0

감사합니다 - 내가 – Ben

+0

을 두려워했을 때 * git commit --amend * 파일을 추가했습니다. 이 작업을 수행하면 충돌을 일으켰습니다. 즉, * delete * 대신 * add *를 사용하여 해결할 수 있습니다. GitHub는 더 이상 파일 기록을 표시하지 않습니다. 다른 지점을 가져올 때 파일 이동이 감지됩니까? 그렇다면, 나는 가시적 인 파일 역사의 일시적인 손실로 살 수 있습니다. – Ben

+0

정보 : 다른 브랜치를 당겨도 표시되는 파일 기록을 복원하지 않는 것 같습니다. – Ben

0

그러나 git은 경로가 아닌 내용별로 객체를 처리합니다. 즉, 개체 (파일)를 이동하거나 개체를 삭제/추가 할 때 차이가 발생하지 않습니다. git repo 데이터베이스에는 한 번만 저장됩니다.

0

힘내는 어떤 이름 바꾸기 정보도 저장하지 않고 대신 일종의 이름 바꾸기 감지 메커니즘을 실행하면 괜찮을 것입니다. 도 참조 Handling renames: svn vs. git vs. mercurial 당신이 이전과 개정 후 사이의 직접 비교를 할 경우 움직임이 감지

+0

필자의 경우에는 내 이력이 사용 가능할 수도 있지만 GitHub와 같은 도구에서 파일 개정 내역이 손실 된 것처럼 보입니다. 이는 아마도 비교가 수행 된 횟수 또는 수정 때문일 수 있습니다. – Ben

3

,하지만 당신이 볼 경우 git log 일반 : 자식이 실제로 이동을 저장하지 않기 때문에

[[email protected] testgit] echo hello world > foo 
[[email protected] testgit] git init 
gitInitialized empty Git repository in /home/bd/testgit/.git/ 
[[email protected] testgit] git add foo 
[[email protected] testgit] git commit -m 'test' 
[master (root-commit) 772dbe5] test 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 foo 
[[email protected] testgit] mv foo bar 
[[email protected] testgit] echo baz > quux 
[[email protected] testgit] git add quux 
[[email protected] testgit] git commit -a -m 'rm; add' 
[master 59dd10b] rm; add 
2 files changed, 1 insertions(+), 1 deletions(-) 
delete mode 100644 foo 
create mode 100644 quux 
[[email protected] testgit] git add bar 
[[email protected] testgit] git commit -m 'add' 
[master 823f70f] add 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 bar 

[[email protected] testgit] git log --stat -m 
commit 823f70fe50828204686a6a42a5e98dc9b258903b 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:06:16 2011 -0500 

    add 

bar | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

commit 59dd10bfb72bb9005edecb1b7609978d82d21652 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:05:58 2011 -0500 

    rm; add 

foo | 1 - 
quux | 1 + 
2 files changed, 1 insertions(+), 1 deletions(-) 

commit 772dbe5357253b533f8f2b9c64836dc09a51def4 
Author: Bryan Donlan <[email protected]> 
Date: Mon Jan 17 05:04:35 2011 -0500 

    test 

foo | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 
### As you can see, a log doesn't show the move, but... 
[[email protected] testgit] git diff --stat 823f..772d -M 
bar => foo | 0 
quux  | 1 - 
2 files changed, 0 insertions(+), 1 deletions(-) 
### A direct comparison does 

이 동작은/이름 바꾸기 정보 - 추가/제거 된 파일의 내용을 비교하여 파일을 재구성합니다. 직접 비교를 사용하면 이전/이후 상태 만 표시하므로 파일을 추가/제거하는 방법은 중요하지 않습니다. 그러나 git log을 사용하면 쌍으로 된 개정을 비교하므로 '제거됨'또는 '추가됨'중 하나만 표시됩니다. 둘 다 표시되지 않습니다.

이것이 문제인 경우 git rebase --interactive을 사용하여 파일 추가 내용을 삭제 한 개정판에 다시 병합 할 수 있습니다. 그러나 나쁜 이력을 가진 개정이 이미 다른 사람에 의해 다운로드 된 경우에는 unwanted side effects이 될 수 있습니다.