자식은 커밋의 변경 내용을 추적하지 않습니다. 각 커밋에는 repo에있는 파일의 전체 복사본이 들어 있습니다. "변경"은 두 커밋을 서로 다르게하여 결정됩니다.
그래서, 짧은에, 절대적으로 F
커밋에 E
, B
및 C
을 부수 다음 dev에 지점에 그 병합에 문제가 없습니다. B
커밋은 dev 브랜치에 여전히 존재합니다. git이 F
을 B
과 비교하면 C
과 E
에 의해 도입 된 변경 사항 만 F
으로 표시됩니다.
물론이 문제는 git rebase
을 사용하여 해결할 수 있지만 그 자체의 두통이 있습니다. 예를 들어, git rebase
은 분기 히스토리를 변경하기 때문에 (커밋을 dev에서 최신 커밋의 맨 위로 이동), 충돌이있는 경우 rebase 할 때마다 이러한 충돌을 다시 해결해야합니다. 문제가 해결되는 데 시간이 오래 걸리면 dev에 최신 상태를 유지하기 위해 몇 가지 리베이스가 필요합니다.
그냥이 모든 사실이 있음을 입증하고 당신이 걱정할 필요가 없다고, 내가 설정을 예를 들어 GitHub의의의 repo했습니다 : https://github.com/cyborgx37/sandbox
시작하기를, 우리는이있는의 dev branch이 B
커밋
B:patch
|
A
은 그 때 나는 가지고
feature1 branch이
C
,
D
및
E
커밋 만들었습니다.
E
|
D:merge with dev
|\
C \
| B
A
가 마지막으로 dev-with-feature1 branch있다 (D가 병합했고, 따라서이 부모님을 가지고 있기 때문에, 그 주, B
또한 커밋 역사에 표시).
F
|
B:patch
|
A
나는 다음 dev에 떨어져이 분기를 생성,
F
는 하나의 커밋으로의 커밋
feature1을 모두 스쿼시
git merge --squash feature1
git commit -m "F"
을 사용했다.
diff for the F
commit을 살펴보면 "패치 적용"이 표시되지 않습니다. B
already contains those changes 이후로 F
이 단지 이것을 반복하면 자식은 F
과 연결되지 않습니다. 또 다른 관점에서
,
here's the blame :
initial hello!
B:patch patch!
F new feature!!!
힘내 커밋의 변화를 추적하지 않습니다. 전체 프로젝트 상태를 저장합니다. "변경"은 커밋을 상위 (또는 전임자) 커밋과 비교하여 결정됩니다. B
에 패치가 있기 때문에 git은 변경된 내용을 B
과 연관시킵니다. 패치가 F
에있을 것으로 예상됩니다. F
에없는 유일한 방법은 패치를 삭제했는지 여부입니다.
출처
2017-10-12 04:41:43
JDB
워크 플로 권장 변경 : 절대 병합하지 마십시오. 대신 그것에 rebase. 'dev'에 리베이스하기 만하면됩니다. – o11c
동의 함 (모두). 그것을 시도 할 것입니다 – lfk
@ o11c - Rebasing은 당신의 분기 이력을 바꿉니다. 내가 팬이되는 동안, 때때로 위험 할 수 있습니다. 특히 자신이하는 일을 모르는 경우. 또한 rebase는 충돌이있을 때 정말로 짜증나게합니다. 왜냐하면 리베이스 할 때마다 충돌을 다시 해결해야하기 때문입니다. 병합을 사용하면 충돌을 한 번 해결 한 다음 앞으로 이동할 수 있습니다. – JDB