2017-11-02 1 views
0

나는 우리가 병합 충돌을 방지하고보다 깨끗하고 깨끗한 공통 포맷터를 구현하기로 결정한 매우 큰 프로젝트에서 작업합니다 PRs를 볼 때 diffs (제발, 이것에 대한 의견 - 그것은이 시점에서 협상 불가능하다). 전체 코드 기반에서 포맷터를 실행하고 하나의 커밋/PR에서 모든 포맷팅을 방해하는 것이 정말 좋을 것 같습니다. 문제는 동시에 진행중인 여러 릴리스가 있다는 것입니다. 이런 식으로 뭔가 :Git의 대규모 변경을위한 전략 - 다운 스트림 브랜치와의 병합 충돌을 피하기 위해

___master_____________________ \ \__release_1_________________ \ \ \__release_2_______\________

참고이 매주 발생하고 수동으로 해결해야 병합 충돌을 자주 소스입니다 2. 해제 릴리스 1에서 병합. 모든 릴리스 1 분기를 형식화 한 다음 해당 변경 사항을 릴리스 2에 병합하려고하면 많은 수의 병합 충돌이있을 것으로 가정합니다. 이 문제를 해결하기 위해 우리가 생각한 전략은 다음과 같습니다.

  1. 모든 변경 사항을 Repo에서 고정합니다. 릴리스 1에서 릴리스 2로 병합하여 릴리스 2가 최신이고 릴리스 1이 현재 날짜로 변경됩니다.
  2. 릴리스 1에서 형식을 변경하십시오. 이렇게하면 repo에서 대부분의 행이 변경됩니다. 커밋 및 홍보 변경.
  3. 릴리스 1에서 릴리스 2로 병합이 변경됩니다. 충돌이있는 경우 릴리스 2 버전의 파일을 선택하십시오.
  4. 포맷되지 않은 상태로 유지되는 릴리스 2의 파일 (3 단계에서 병합 충돌이 발생한 파일 또는 새 파일 일 가능성이 있음)에 서식을 변경합니다. 커밋 및 홍보 변경.

질문은 -이 기능이 릴리스 1에서 릴리스 2 로의 주기적 병합으로 병합 충돌을 최소화 할 것입니까? 이로 인해 Git이 공통 조상 정보를 잃어 버리게되어 앞으로 더 많은 문제가 발생하게됩니까?

우리가 가지고있는 두 번째 옵션은 릴리스 1을 포기하고 릴리스 2의 모든 내용을 다시 포맷하는 것입니다. 그러나 릴리스 1에 대한 모든 변경 사항에 대해 병합 충돌이 발생할 것으로 예상되어 앞으로 릴리스 2로 병합됩니다.

답변

0

쉽게 이력을 다시 쓸 수 있고 git filter-branch을 사용하여이 작업을 쉽게 수행 할 수 있습니다. 그러나 분명히 당신은 그때 당신이 모든 지부들에게 지역 지부, 은신처 등을 가지고 있으면 악몽이 될 재작 성한 역사를 집어 들게해야합니다.

그래서 당신이 당신의 접근 방식을 고수하고 싶다면 당신의 릴리즈에 대해 별도의 포맷팅 커밋을하는 것이 좋습니다. 3- 방향 병합은 릴리스 간 추가 병합을 쉽게 수행 할 수 있어야합니다. 더 극단적 인 갈등과 회귀를 피하기 위해 앞으로의 모든 PR 지점을 병합하기 전에 다시 포맷해야합니다.

이 코드 변경은 물론 완전히 자동화 된 것으로 가정합니다. 그리고 ... SE는 아스키 아트를 엉망으로 만들었습니다.

관련 문제