2013-05-16 2 views
1

현재 프로젝트에서 git 트리에 이상한 상황이 있습니다. 다른 팀 구성원이 일부 변경했다 (이 커밋 병합없이) 동시에충돌로 병합 후 병동 파일 변경이 로그에 표시되지 않습니다.

old contents 
old contents 
old contents 
my new contents 

:

old contents 
old contents 
old contents 

사람 : 파일 a.txt에서

, 나는 = ID를 커밋에서 변경 my_new_contents_commit했다. 그런 다음 그는 내 변경 사항을 가져 와서 id = interesting_merge (그는 "타워"라는 git 도구를 사용합니다)를 병합했습니다. 그 병합 git show는 다음과 같이 프로그램에게 무언가를 약속한다

➤ git show interesting_merge 
commit interesting_merge 
Merge: some_commit my_commit_with_new_contents_being_there 
Author: _ 
Date: Thu May 16 19:55:27 2013 +0300 

    Merge branch 'master' of _ 

    Conflicts: 
     static/css/style.css 

그래서, 그것은 병합하는 동안 충돌이 발생했다 것 같다, 나는 그들이 해결 한 방법을 모르겠어요. 흥미로운 점은이 병합 후에 파일이 이전 버전에 있음을 의미합니다. 그래서, 당신이한다면

➤ git checkout interesting_merge 
➤ cat a.txt 
old contents 
old contents 
old contents 

당신은 오래된 내용을 얻을거야. 그게 어떻게 가능해? a.txt가 이상하게 보이지 않는 방법으로 병합 된 것을 어떻게 알 수 있습니까?

감사합니다.

답변

2

git show 많은 부모와의 커밋에 diff가 표시되지 않습니다. 왜냐하면 자식은 N 개 (예 : N은 부모 커밋의 수)를 알지 못하기 때문에 커밋에 diff가 표시되지 않습니다.

손에 의한 충돌을 해결할 때이 diff는 커밋 메시지에 포함되어 있습니다.

어떻게 가능합니까?

쉬운. 이 병합 커밋에서 my new contents은 방금 제거되었습니다. 병합 사이

  • DIFF 커밋 그것은 첫째 부모가 병합 사이
  • DIFF는 확약 그리고 그것은 둘째 부모가

마지막으로, git diff SHA^! 유용해야한다 커밋 : 당신은 두 개의 차이점 중 하나에서 찾을 수 있습니다.


어떻게 수행 할 수 있습니까?

우리가 2

$> git log --oneline 
30917b9 add my new contents 
d6a09ba add a.txt 

커밋과 마지막 커밋과 유사한이 있다고 가정하자 당신의

$> git show 
commit 30917b94b6e6740cacc854e891d67d29195b98c3 
Author: b <a> 
Date: Fri May 17 00:29:56 2013 +0400 

    add my new contents 

diff --git a/a.txt b/a.txt 
index 3be5d25..af49de6 100644 
--- a/a.txt 
+++ b/a.txt 
@@ -1,3 +1,4 @@ 
old contents 
old contents 
old contents 
+my new contents 

그런 사람이 처음 커밋에 따라 변경 (d6a09ba) 수행

commit f6997eae5f40f156897eedfbf058bcf3fe8730b6 
Author: b <a> 
Date: Fri May 17 00:34:38 2013 +0400 

    I don't care about new contents 

diff --git a/b.txt b/b.txt 
new file mode 100644 
index 0000000..d099a6a 
--- /dev/null 
+++ b/b.txt 
@@ -0,0 +1 @@ 
+well, this is a new file 

그는 그것을 밀어 붙이려고하고 거부했습니다 : [

$> git push origin 
To jws:~/test.git 
! [rejected]  HEAD -> master (non-fast-forward) 

그런 다음 그는 당신의 커밋 끌어와 병합

$> git pull origin master 
From jws:~/test 
* branch   master  -> FETCH_HEAD 
Merge made by the 'recursive' strategy. 
a.txt | 1 + 
1 file changed, 1 insertion(+) 

이것은이 Merge branch 'master' of jws:~/test 같은 메시지를 커밋입니다했다. 그리고는 git commit --amend 봐라와 커밋 준비를 추가, git add a.txt와 준비에 추가, 파일 a.txt 편집 : a.txt의 변화에 ​​대한

$> git show 
commit 51a3f94436cf1a9a763d84acfcf7202f9f2d88ec 
Merge: f6997ea 30917b9 
Author: b <a> 
Date: Fri May 17 00:36:56 2013 +0400 

    Merge branch 'master' of jws:~/test 

아무것도하지만 우리가 차이점 중 하나에서 볼 수 있듯이 수정 :

$> git diff 51a3f94436cf1a9a763d84acfcf7202f9f2d88ec^2 51a3f94436cf1a9a763d84acfcf7202f9f2d88ec 
diff --git a/a.txt b/a.txt 
index af49de6..3be5d25 100644 
--- a/a.txt 
+++ b/a.txt 
@@ -1,4 +1,3 @@ 
old contents 
old contents 
old contents 
-my new contents 
diff --git a/b.txt b/b.txt 
new file mode 100644 
index 0000000..d099a6a 
--- /dev/null 
+++ b/b.txt 
@@ -0,0 +1 @@ 
+well, this is a new file 
+0

예,하지만 문제는 a.txt에 충돌이 있지만 부모의 변경 사항 중 하나에서 콘텐츠가 여전히 삭제 될 수 있다는 것입니다. –

+0

> 간편합니다. 이 병합 커밋 내 새로운 내용이 그냥 제거됩니다. 당신은 절대적으로 맞습니다, 고마워요. 다음 질문 : 어떻게 될 수 있습니까? –

+0

충돌은'git commit --amend' 또는 어떤 것으로 제거 될 수 있습니다. 잘 알고 있겠지만, 병합 커밋은 많은 부모와의 커밋 일 뿐이며 병합 커밋 메시지의이 충돌 diff는 텍스트 일 ​​뿐이며 자동으로 계산 된 diff는 아닙니다. 조심해! –

관련 문제