새로운 개발자는 분기 병합을 따라 잡을 수 없습니다


223

나는 새로운 개발자입니다-이것이 나의 첫 프로그래밍 위치입니다.

내 문제는 이것입니다 : 우리는 사용합니다 git-지점에서 지점을 잘라낸 develop다음 할당 된 사소한 작업을 시작합니다. 내가 경험이 없기 때문에 매우 느립니다. 지점을 develop다른 지점으로 다시 병합 할 준비가 되었을 때 갈등을 해결하는 데 많은 변화가있었습니다 (실제로 작업을 중단하고 작업을 다시 시작하는 것이 더 쉬운 것 같습니다. 물론 지속 가능한 솔루션은 아닙니다) ).

이것을 어떻게 극복합니까? '코딩에 능숙하다'외에 다른 방법을 사용할 수 있습니까? 다음 주에 상사와이 문제를 제기하려고합니다.


165
완료 한 후에 만 ​​브랜치를 개발에 병합 할 필요는 없습니다. 원할 때마다 점진적으로 기능 분기로 개발을 병합하여 최종 병합을 더 작게 만들 수 있습니다.
DavidB

16
병합 프로세스를 올바르게 수행하고 있는지 확인하십시오. 파일에만 영향을 미치고 변경 사항 만 dev 분기에 적용해야합니다. 임의의 충돌이 발생하면 병합이 잘못되었거나 다른 사람이 개정 순서를 망칠 수 있습니다. 자신과 다른 사람들에게 합병을 교육 할 수있는 좋은 기회입니다. 일부 사람들은 병합되는 파일이 아니라 변경 사항을 이해하기가 어렵습니다. 따라서 동기화되지 않은 순서로 수정하면 사용자가 건드리지 않은 파일이 충돌 할 수 있습니다.

16
또한 편집기가 올바르게 설정되어 있는지 확인하십시오. 때때로 편집기는 탭과 공백을 "수정"하므로 파일을 편집하고 다시 커밋하려고하면 전체 파일이 변경됩니다. 변경 사항 만 브랜치에 커밋하고 커밋을 수정했는지 커밋하기 전에 확인해야합니다.

32
여기에 "사소한 작업을 시작합니다"라는 한 가지 이상한 점이 있으며 일반적으로 수많은 병합 충돌이 일치하지 않습니다. 방금 2 주간의 주요 업데이트 브랜치를 실험 개발에 병합했으며 자동으로 해결할 수없는 10 (!) 개의 충돌이있었습니다. 작업이 "모든 파일에서 변수 이름 변경"이 아닌 한 많은 충돌이 발생하지 않습니다. 사소한 작업에는 해당되지 않습니다.
TomTom

50
의무적 인 xkcd : xkcd.com/1597
ED

답변:


5

지점에서 수행 한 변경 사항이 동료가 develop지점에서 수행 한 변경 사항 근처에있는 경우, 즉 귀하와 동료가 동일한 파일에서 동일한 코드 줄 또는 인접한 줄을 변경 한 경우 병합 충돌이 발생 합니다.

따라서 병합 충돌 가능성을 줄이려면 이전에 동료가 줄 수를 줄 이도록 미리 병합을 시도하거나 줄 수를 줄이려고 할 수 있습니다.

줄 수를 줄이려면 작업과 관련된 내용 만 변경하십시오.

목표를 달성하기 위해 다른 방법으로 실험해야하는 경우 일부 실험에서 실제로 변경하지 않아도되는 행이 변경 되었습니까? 병합하기 전에 이러한 변경 사항을 취소하십시오.

가능한 한 적은 수의 행을 변경하는 데 도움이되는 Git 명령도 있습니다.

  • git diff그리고 git diff --staged당신이 변화하는 라인을 볼 수 있습니다.
  • git add -p 파일에서 일부 변경 사항 만 추가합니다.
  • git commit --amendgit rebase -i다른 Git 저장소에 밀어 전에 이미 해당 지역의 기능이 지점에서 만들어진 커밋을 조정할 수 있습니다.

(가능한 한 몇 줄을 변경하면 쉽게 작업을 검토하거나 같은 커밋의 차이점에 대한 작업 도구를 사용하여 만들 수 있습니다 git cherry-pick, git rebase, git bisect,와 git blame.)

그러나 병합 충돌 가능성을 줄이더라도 때때로 병합 충돌이 발생합니다. 따라서 그들을 두려워하지 말고 갈등을 해결하는 방법을 배우십시오.


1
또한 병합하기 전에 a git fetch및 a git diff origin/develop는 병합 (정렬) 미리보기를 표시합니다. 무의미한 충돌이 발생하기 전에 변경 사항을 정리할 수있는 기회를 제공합니다.
최대 12

288

git을 사용한다고 가정합니다. 이 경우, 사용하게 git rebase -i합니다 ( -i상호 작용하는 방법을). 개발 브랜치에 대해 브랜치를 리베이스하려면 매일 작업을 수행하십시오 (필요한 경우 더 자주). 이렇게하면 기능 분기를 최신 상태로 유지하기 위해 매일 (적어도) 점진적으로 변경 사항이 적용됩니다. 매일 리베이스하는 동안 충돌이 발생하면 누가 무엇을하고 있는지에 대해 팀과 이야기해야합니다.

매일 실행하면 대화식 부분이 필요하지 않을 것입니다. 그냥 해보자.

저는 상당히 숙련 된 개발자이며 새 프로젝트를 시작하는 데 여전히 시간이 많이 걸립니다. 귀하의 경우 여러 사람이 동일한 프로젝트에서 동시에 작업하는 것처럼 들리므로 매우 큰 프로젝트이거나 빠르게 진화하는 새 프로젝트입니다. 두 경우 모두 흐름에 들어가는 데 몇 개월 이 걸리더라도 걱정하지 마십시오 . 2 주 또는 3 주 동안 프로젝트를 전환 한 다음 다시 전환하면 100 % 직접 작성한 프로젝트를 완전히 "다시"하는 데 몇 시간 (또는 하루나 이틀)이 걸릴 수 있습니다.

요컨대, 지금 느리게 걱정하지 마십시오. 더 나은 방법은 계속 연습하는 것입니다. 이해하지 못하는 프로젝트의 측면에 대해 다른 개발자에게 물어 보는 것을 두려워하지 마십시오.

편집하다:

또는을 사용하십시오 merge. 옵션이기도합니다. 따라서 위의 내용은 " git rebase -i( -i대화식을 의미 함) git merge" 또는 "입니다. 어느 것을 사용해야하는지 다른 팀원들과상의하십시오. 그들은 어느 쪽이든 강한 선호를 가질 수도 있고 그렇지 않을 수도 있습니다. 어떤 사람들 선호도가 강한 것이 분명 합니다.


22
나는 이것이 정답이라고 생각하지만 나쁜 Git 디자인과 용어의 또 다른 예 인 IMO입니다. 당신은 무엇을 "리베 이빙"하고 있습니까? 이것을 "업데이트"또는 "체크 아웃"또는 "병합"또는 이와 같은 것으로해서는 안됩니까 ??? (아래 답변은 "fetch"를 주장합니다.) 매일 업데이트하도록 강요된 경우 소스 코드 제어의 요점은 무엇입니까 ???
user949300

95
그래도 업데이트하거나 체크 아웃하지 않습니다. 브랜치에 독점적으로있는 것을 취하고 마치 다른 브랜치에서 변경 한 것처럼 변경 사항을 추가합니다. 즉, 변경 사항은 이제 다른 지점을 기반으로합니다. 또한 코드를 알고 있으며 여러 사람이 동일한 파일을 수정할 때 변경 사항을 병합하는 방법을 알 수있는 마법의 소스 제어 시스템이 없습니다. 매일 업데이트하여 갈등을 작고 관리 가능하게 유지하고 모든 사람의 마음에 변화가 생겨서 처리 방법을 알도록합니다.
Vectorjohn

54
@ user949300 rebasing은 병합과는 별개이며 훨씬 뉘앙스가 있으며 간단한 병합 워크 플로보다 Git을 더 잘 이해해야합니다. 그렇기 때문에 Git 초보자에게 리베이스하는 워크 플로를 권장하지 않는 이유는 리베이스가 브랜치를 업데이트하는 유일한 / 기본 방법이며 많은 불필요한 함정과 고통으로 이어지기 때문입니다. 이 경우 병합은 동일한 방식으로 문제를 해결하고 두 개의 장기 실행 병렬 피쳐 분기에서 병합 충돌 문제를 해결 하지 않습니다 .
앤트 P

14
@ user949300 git pullgit fetchgit merge(또는 --rebase병합 대신 리베이스를 수행하기 위해 추가 할 수 있음) 의 조합입니다 . 하루 정도 밖에 지나지 않았다고 가정하면 LAN에서 1 초 이내에 완료 될 수 있습니다. 인터넷을 통해 몇 초가 걸릴 수 있습니다. 인터넷을 통하거나 약간의 병합 충돌이 있더라도 일반적으로 1 분 이내에 최신 상태를 유지하고 깔끔하게 병합 할 수 있습니다. 일주일 내내 5 분의 시간을 보내는 것이 일주일에 한 시간을 소비하는 것보다 심하게 병합되는 충돌을 처리하는 것보다 훨씬 좋습니다.
데릭 엘 킨스

66
이 답변은 전적으로 rebasing에 고정되어 있기 때문에 나에게 찬성하지 않습니다. 리베이스는 유용한 도구가 될 수 있지만, 절대 마음이 쓰이지 않아야합니다. 매일 업데이트하는 경우 병합하는 것이 좋습니다. 왜? 모든 rebase가 거짓말 이기 때문에 . 당신은 결코 일어나지 않은 방식으로 역사를 말하고 있습니다. 이 같은 강력한 도구를 완전히 나사 수 git bisect다음으로 업데이트 물건도 컴파일되지 않을 수 있으므로 git bisect결과 깨진 커밋에 쓸모없는 것입니다. @maaartinus : 나는 선형 역사보다 진실 된 역사를 선호합니다. 리베이스하면 해로운 거짓말을 피하기 위해 모든 새로운 커밋이 온전한 지 확인해야합니다.
cmaster

131

이것은 회사 측에서 잘못된 소프트웨어 엔지니어링의 징후 일 수 있습니다. 상호 종속성이 너무 많거나, 기능이 겹치는 다른 문제, 잘못된 순서로 문제를 해결하려고하면 설명중인 상황이 발생할 수 있습니다. develop개발하는 동안 정기적으로 지점에 병합하는 것이 좋습니다.


9
이것은 당신이 언급 한대로 101 가지를 코딩합니다. 신입 사원을 반드시 정확하게 반영 할 필요는 없습니다.
Mister Positive

2
@Ivan Anatolievich 기업 영업 이익은 그들이 참고로, 마스터하지 개발의 분기되어 있다는 것을 말한다
매튜 피츠 제럴드 - 체임벌린

6
이 답변은 내가 GIT를 싫어하는 이유를 정확하게 보여줍니다. 팀이 적절한 관리 및 적절한 계획을 피하는 또 다른 도구입니다. 모든 문제에 대한 답은 문제가 발생하기 전에 문제를 피하는 대신 "누가 신경 쓰는가, 나중에 언제든지 해당 명령을 사용할 수 있습니다"입니다.
motoDrizzt

7
내 첫 번째 생각은 나쁜 습관의 징조였습니다. 개발자는 대부분 같은 파일을 작업해서는 안됩니다. 소규모 프로젝트에 이러한 많은 충돌이 발생하는 경우 다른 모든 사람은 하루 종일 충돌없이 문제를 해결해야합니다!
Aequitas 5

14
@motoDrizzt 무엇? 나는 누군가가 그 주장을하는 것을 들어 본 적이 없다.
jpmc26

95

내가 생각하는 대답은 기술적 인 "Git을 더 잘 사용하는 방법"성격이라고 생각한다. 이것이 엔지니어링이나 툴링 문제보다는 팀 문제라고 생각한다.

병합 충돌이 많이 발생하면 나와 다른 팀원이 서로 발가락을 밟고 있다는 의미입니다.
코딩을하는 동안 개인 공간을 개발하고 이미 분주 한 지역에서 일하는 것을 피해야합니다.

우리 팀에서는 높은 직무 소유권을 지향합니다.
나는 보통 한 번에 두세 개의 파일에 대한 완전한 소유권을 가지고 하루나 이틀 동안 지점에서 작업 할 것입니다.
일반적으로 다른 사람이 해당 파일을 만지면 자신의 작업에 반드시 필요한 경우에만 동일한 작업 블록에서 전혀 작업하지 않습니다!

많이 병합해야한다는 것을 알게되면 모든 팀 코드가 한곳에 있거나 (그 자체로 피해야 할 부분) 모든 작업이 수행됩니다.

새로운 개발자로서 아마도 모든 종류의 구조 조정을 시행, 요청 또는 제안 할 위치에 있지 않을 것입니다.
내가 기대하는 것은 당신의 업무가 당신을 팀으로 편하게하기 위해 당신의 기술 수준에서 합리적으로 접근 할 수있는 "배우기 학습"항목으로 할당되었을 것입니다. 그들은 여전히 ​​같은 지역에서 일하는 동료의 작업에서 추론되었을 수 있으므로 병합 충돌이 발생합니다.
이 문제에 대한 해결책은 문제를 해결하고 문제를 해결하며 가능한 한 병합 충돌을 처리하고 최선을 다하는 한 너무 걱정하지 않아도됩니다. 당신의 진행 상황.
갈수록 더 빠르고 자신감이 생길 것입니다.


4
동료 갈등으로 머리에 못을 박았다고 생각합니다. 병합 충돌은 일반적인 일이지만 일반적으로 소수의 파일로 제한됩니다.
Matthieu M.

10
이것은 Conway의 법칙단일 책임 원칙 결론처럼 들립니다. 즉, 사람들이 다른 문제에 대해 작업하는 경우 이상적으로 소스 코드의 개별 부분을 편집하게됩니다.
ChrisW

7
프로세스가 열악하거나 디자인이 열악하면 많은 양의 충돌이 발생할 수 있다는 데 동의하지만, 문제는 단순히 OP가 메인 라인에서 정기적으로 병합되지 않는다는 것입니다. 파일의 "완전하고 완전한 소유권 확보"가 당연히 적절하다는 데 동의하지 않습니다. 팀이 현재 누가 "소유"를 추적하고 "권한"을 요청하여 변경을 요청하거나 그들이 어떤 파일을 "청구"해야하는지에 대한 지속적인 오버 헤드를 원하지 않습니다. 구성 요소를 크게 다시 작성할 때 팀 구성원에게 특정 파일을 변경할지 여부를 알려주는 경우는 거의 없었습니다.
Derek Elkins

1
ChrisW는 내가 무엇을 운전하고 있는지에 대한 올바른 아이디어를 가지고 있습니다. 일반적으로 우리 회사의 소유권은 응용 프로그램 기능의 형태를 취하며, 검색 필터 시스템의 소유권을 하나의 작업으로 취하며 대부분의 상황에서 아무도 관련 파일을 만질 필요가 없습니다. 제 생각에는 새로운 개발자가 다른 개발자가 진행중인 작업 세트와 밀접한 관련이있는 작은 작업을 받았기 때문에 OP 일 가능성이 높습니다. 다른 개발자가 코드베이스의 동일한 부분에서 작업하고 서로의 방식으로 진행되고 있음을 의미합니다.
Rowan

1
@Rowan Cool 네, 많이 생각했습니다. 기능 분리는 파일 분리 (다른 파일의 기능 세트 등)에도 도움이되며이 IMO는 병합에 도움이됩니다.
SaltySub2

28

병합에있어 가장 중요한 것은 기다릴수록 더 고통 스러워진다는 것입니다. 그리고 문제는 선형 이상으로 커집니다. 세 배나 많은 갈등이 아홉 배나 많은 일입니다. 몇 가지 전략이 있습니다.

변경 될 때마다 개발 브랜치와 병합하므로 항상 가까이에 있으며 많은 충돌이 발생하지 않습니다.

시간이 오래 걸리면 변경 내용을 파악하는 데 대부분의 시간을 소비 한 다음 변경 사항을 구현하는 데 약간의 시간이 걸리기 때문일 수 있습니다. 이 경우 실제 코드 변경을 시작하기 전에 개발 지점과 병합하십시오.

갈등을 피하는 전략에 대해 동료들과 이야기하십시오. 두 사람이 동일한 코드를 편집하면 충돌이 발생합니다. 동일한 파일뿐만 아니라 동일한 코드. 그래서 새로운 함수 functionA가 필요하고 새로운 함수 functionB가 필요합니다. 우리는 같은 파일의 끝에 함수를 추가하면 충돌이 발생합니다. 다른 장소에 추가하면 충돌이 없습니다. 둘 다 논리적으로 속한 파일의 위치에 추가하면 충돌이 없을 가능성이 있습니다.

경우 당신이 충돌이, 당신이 병합, 원래 코드 및 병합 된 코드 전에 병합하기 전에 코드를 개발 분기를 비교할 수 있도록, 좋은은 diff 도구를 얻을, 손으로 병합합니다.

최악의 경우 : 작업을 버리지 말고 좋은 diff 도구를 사용하여 변경 내용을 정확하게 확인하고 개발에서 다시 분기하고 변경 사항을 수동으로 적용하는 대신 수동으로 변경 한 내용을 모두 적용하십시오.


기능 지점은 다른 지점의 기술 부채처럼 표시되며, 상위 지점의 업스트림 변경은 리팩토링과 같습니다.
Dan Lyons

당신 그 빚을 갚아야한다는 것을 제외하고 . 지금.
gnasher729

15

그 때까지는 내가 준비가 병합 다시에 내 지점 (강조 광산) 개발

충돌을 다루는 git merge것이 종종보다 간단 git rebase합니다. Git 병합에서는 한 번에 수정 된 전체 파일 목록을 볼 수 있습니다. 다른 동료가 수행 한 커밋 수에 관계없이 한 번 병합해야합니다 . rebase 워크 플로를 사용하면 동일한 충돌이 반복되어 결국 수동으로 검토해야 할 수 있습니다. 13 번째 커밋을 수정 하면 터널에서 빛이 보이지 않는 것처럼 느껴질 수 있습니다 .

내 경험에 따르면 반복되는 리베이스 충돌을 순진하게 해결하려고 시도했을 때 누군가 수정 사항을 얻지 못하거나 컴파일조차하지 않은 응용 프로그램이 생겼습니다. 종종 저와 동료들은 많은 일을했지만 반복되는 갈등의 복잡성 때문에 압도 당하여 소수의 재 수집 커밋 후 이전 작업을 중단하고 잃어 버렸습니다.

몇 가지 기술을 제안하지만 작업을 자동화하는 것보다 병합이 더 쉬워지는 데 도움이 될 수 있습니다.

  • 리소스 / 언어 파일 . 당신이있는 경우 첨가제 리소스 파일에 대한 변경 사항을 쉽게 불러올 수 있도록 항상 파일의 끝으로 이동해야합니다 당신 에 대한 변경 다른 사람 '변경. 하단에 변경 사항을 복사하여 붙여 넣거나 충돌 마커를 제거 할 수 있습니다
  • 하다. 아니. 물론. 다시 포맷하십시오 . 귀 하나 귀하의 동료 개발자는 일상 업무 중에 "대량 코드 재구성"을 수행 할 수 없습니다. 코드 재 포맷은 충돌 관리에 잘못된 수의 오 탐지를 추가합니다. 코드 재 포맷 가능
    • 예를 들어 자동화 도구를 사용하자마자 커밋 할 때마다 모든 개발자가 점진적으로 증가시킵니다 (예 : Eclipse에는 저장시 다시 포맷 할 수있는 옵션이 있으며 vanilla Visual Studio에는 없음). 절대적으로 모든 개발자는 IDE에서 사용하는 형식 파일로 코딩 된 동일한 코드 형식 표준을 사용해야합니다. 아이디어를 제공하기 위해 4 개의 공백 또는 2 개의 탭이면 중요하지 않지만 모든 사람이 동일한 것을 사용하는 경우 실제로 중요합니다.
    • 팀 리더가 릴리스 직전에. 사람들이 브랜치에서 작업하지 않을 때, 즉 브랜치 전에 "코드 재 포맷"커밋이 발생하면 상황이 더 쉬워집니다.
  • 동료 간 작업 분할을 검토 하십시오. 이것은 대부분의 엔지니어링이 오는 부분입니다. 다른 답변에서 알 수 있듯이 다른 작업을 수행하는 여러 개발자가 동일한 리소스를 터치 해야하는 경우 디자인 냄새가납니다. 각 동시 개발자가 어떤 부분을 수정해야하는지 팀 리더와상의해야 할 수도 있습니다.

또한 팀의 Git 워크 플로에서 나쁜 습관을 겪었습니다. 사람들은 종종 자신의 지사에 과도하게 헌신합니다. 필자는 개인적으로 한두 줄씩 커밋하는 "fix"라는 10 ~ 20 개의 커밋을 추가 한 개발자를 직접 목격했습니다. 우리의 정책은 커밋에 JIRA 티켓이 표시되어 아이디어를 제공하는 것입니다.

@JacobRobbins는 git rebase일일 작업을 제안합니다 . 그의 접근 방식을 추진하고 싶습니다.

먼저 커밋 수를 줄이려면 rebase를 한 번만 사용하십시오. 그리고 원래 개발 브랜치 에만 리베이스하십시오 . 내가 소수라고 말하면, 3 또는 4 (예 : 모든 프론트 엔드, 모든 백 엔드, 모든 데이터베이스 패치) 또는 인간이 합리적인 수치를 의미 할 수 있습니다. 통합 한 후 fetch업스트림 지점에서 리베이스를 사용 하고 작업하십시오. 팀이 자신의 접근 방식을 검토하지 않으면 갈등에서 벗어날 수는 없지만 인생의 고통을 덜어줍니다.

특정 작업에 대한 추가 질문이 있으면 언제든지 검색하여 Stackoverflow를 요청하십시오.

재 포맷 금지 및 보이 스카우트 규칙에 대한 [편집] 나는 RE- 포맷 을 약간 바꿔서 내가 의미하는 것은 당신이 만지지 않은 코드를 포함하여 전체 소스 파일을 처음부터 포맷하는 작업이라는 것을 강조했다. 완벽한 보이 스쿠 어티 인 자신의 코드를 항상 포맷하는 것과는 달리, 나 자신을 포함한 많은 개발자들이 IDE의 기능으로 전체 파일을 다시 포맷하는 데 사용됩니다. 다른 사람이 파일을 만지면 영향을받는 줄이 내용과 의미에서 변경되지 않더라도 Git은 파일을 충돌로 간주합니다. 매우 강력한 언어 인식 편집기 만이 충돌이 형식화와 관련이 있으며 최상의 형식의 조각을 자동 병합하는 것만 제안 할 수 있습니다. 그러나 나는 그러한 도구에 대한 증거가 없습니다.

결국, 보이 스카우트 규칙은 다른 사람들의 엉망을 청소하도록 요구하지 않습니다. 너만


3
그것은 대체로 의견의 문제이지만 병합 충돌이 리베이스 충돌보다 처리하기 쉽다는 것에 동의하지 않습니다. 리베이스 할 때 본질적으로 커밋을 하나씩 적용하여 병합 충돌의 범위를 훨씬 작고 따르기 쉽게 유지합니다 (알지 못하는 사람의 변경 사항이 아닌 알고있는 변경 사항을 적용 함). 커밋에서 동일한 파일을 여러 번 터치하기 때문에이 방법으로 더 많은 병합 충돌을 해결해야 할 수도 있지만 더 작고 다루기가 더 쉽습니다.
user622505

3
재 포맷과 관련하여 VS는 저장시 자동으로 수행 할 수 없지만 "도구"-> "옵션"-> "텍스트 편집기"-> "<에서 붙여 넣기시"들여 쓰기 "로 설정하면 선택한 언어> "->"포맷 "은 붙여 넣기시 자동 서식을 의미합니다. 이를 통해 ctrl-A, ctrl-C, ctrl-V의 세 가지 키 입력 순서를 통해 원하는 결과를 얻을 수 있습니다. 즉, +1했습니다 . 아니. 물론. 다시 포맷하십시오. 매우 신중하게 통제 된 조건에서 개요를 제외하고는.
dgnuff

1
Bob Martin 독자는 팀에서 일하는 경우 보이 스카우트 규칙 을 적용해야합니다 (직접 작업하는 경우 훨씬 더 융통성이 있음). 규칙을 "내가 알아 낸 순간 완벽하지 않은 모든 파일에서 문자 그대로 모든 것을 수정하는 것은 코더로서의 의무입니다. 다른 사람이 무엇을하고 있는지 신경 쓰지 마십시오." 갈등을 해결하기가 엄청나게 어려우며, 의도가 아무리 좋더라도 큰 혼란이 될 것입니다.
jrh

2
코드를 재 포맷하거나 가볍게 리팩터링해야한다고 느끼고, 의미있는 커밋 전후에 수행하십시오. 충돌을 줄일뿐만 아니라 검토
자를

1
내 C # 문화권에서 "재 포맷팅"이란 전체 코드 파일 또는 서식 지정이 가독성에만 관련된 전체 저장소의 서식 지정 작업을 의미합니다 . 언어에서 공백을 의미있게 사용하는 경우 자신이 아닌 LOC에서 공백을 혼동해서는 안됩니다. 반대로, 선택의 여지가 귀하의 언어는 여전히 허용 할 수 있습니다 비 - 의미 "포맷"가독성 표준에 따라 할 수있다 공백 (중괄호 전에 예)
USR-로컬 ΕΨΗΕΛΩΝ

5

먼저 변경 사항을 버리는 것에 대해 생각하지 마십시오. 병합 프로세스를 배울 수있는 기회를 잃게됩니다.

둘째, 파일 작업을 통해 충돌을 일으킨 사람을 찾으십시오. 당신은 역사를 볼 수 있습니다. 사람과 대화하고 해당 파일의 충돌을 해결하십시오. 다른 충돌에도 똑같이하십시오.

충돌이 너무 많으면 작지만 반복되는 작업 일 수 있습니다. 패턴을 찾아보십시오. 이것은 Git UI 클라이언트 도구의 충돌을 해결하는 데 도움이됩니다. TortoiseGit을 사용합니다. 병합에 도움이됩니다.

그리고 미래에 피하기 위해

  • 개발 브랜치를 정기적으로 기능 브랜치에 병합하는 것이 좋습니다.

  • CI를 사용하도록 설정 한 경우 CI 도구가 분기 빌드를 제공하는지 확인하십시오. 이것은 피처 브랜치에서, 그러나 병합 개발 브랜치에서 수행 할 때마다 체크해야합니다.


1
+1 Git을 더 잘 사용하기위한 다른 제안은 좋지만 실제로 다른 개발자와 병합 충돌에 대해 이야기하는 것이 OP의 효과를 개발하는 또 다른 주요 측면입니다.
Dragonel

1
"역사를 볼 수 있습니다"아마도! 모든 것이 어떻게 찌그러지고 다시 쌓이는 지에 달려 있습니다 : P
Lightness Races Orbit

1

개발 브랜치에서 'git fetch'(git pull 아님) 명령을 정기적으로 (매일) 실행해야합니다. 이렇게하면 다른 사람들이 변경 사항을 커밋하여 변경 사항을 지점에 통합하지 않고도 기능 지점으로 가져올 수 있습니다.

회사는 자체 표준을 가지고 있거나이 문제를 처리하는 권장 방법이있을 수 있으므로 수석 개발자에게 문의해야합니다 (관리자 일 필요는 없음). 매우 흔합니다. 다음 주까지 기다리지 말고 지금 프로세스를 찾아 코드 형식 지정 또는 주석 추가와 같은 사소한 작업을 수행 할 수 있는지 확인하여 프로세스를 테스트하십시오.


21
이것이 올바른지 확실하지 않습니다. Git fetch는 remotes / origin / master를 최신 상태로 유지하지만 remotes / origin / master를 기능 브랜치로 병합해야합니다 (또는 사용중인 플로우 인 경우 remotes / origin / develop)
Richard Tingle

그가 git을 사용한다고 가정하면 의미있는 부분에 대한 헌신을 스쿼시하는 방법을 배우는 것이 좋습니다. 이렇게하면 풀 요청을 할 준비가되었을 때 커밋이 간결하고 간단하며 이해하기 쉽습니다.

@RichardTingle 맞다, 그는 rebase 옵션을 생각하고있다. dev 브랜치를 사용하여 브랜치를 가져오고 리베이스하십시오. 모든 것이 동기화됩니다.

6
@ Dan 나는 그것이 의견의 문제라고 생각합니다. 개인적으로 나는 엄청난 커밋을 싫어합니다. git bisecting을 시도하십시오!
Richard Tingle

2
@PeteCon "및 변경 사항을 지점에 통합하지 않고 기능 지점으로 가져옵니다." 모순되는 말처럼 보입니다. 기능 브랜치에 통합하지 않고 로컬 리포지토리로 가져와야한다고 생각하지만 어떻게 도움이
될지 모르겠습니다

1

분명히 가장 먼저해야 할 일은 적어도 여러 사람이 동일한 파일에서 최소한 충돌을 일으키는 방식으로 동일한 파일을 작업하지 않도록하는 것입니다. 좋은 코드 형식을 사용하는 한 열거 형에 항목을 추가해도 문제가 없습니다. 제어 흐름을 다른 방식으로 변경하고 코드를 이동하는 것은 훨씬 더 까다 롭습니다. 그럼에도 불구하고 때때로 이것은 불가피하다. 정말 복잡한 갈등을 해결할 때 질문을해야합니다.

즉, 정기적으로 개발을 병합 / 리베이스하는 것이 좋습니다 많은 답변을 참조하십시오. 나는 그런 종류의 조언에 대해 훨씬 덜 열성적입니다. 이 시점의 목표는 가능한 한 쉽고 안전하게 충돌 해결 프로세스를 만드는 것입니다. 이 과정에 큰 도움이 될 것 중 하나는 새 기능의 일부인 새로운 테스트를 포함하여 많은 회귀 테스트를 즉시 사용할 수 있다는 것입니다. 브랜치를 개발과 매우 정기적으로 동기화하면 실제로 절반의 기능을 구현하는 동안 충돌을 해결해야합니다. 그리고 그것은 당신이 그것을하지 않았으므로 코드가 무엇을 해야하는지 알아 내려는 것이 훨씬 더 어려울 것임을 의미합니다. 병합을 시도하기 전에 지점이 일관된 변경 단위인지 확인하십시오. 더 나은

나는 아마도 다른 질문에 대한 병합보다 rebase의 장점으로 가지 않으려 고 노력했다. 이러한 맥락에서 도구는 실제로 중요하지 않습니다.


1

내가 지점을 다시 개발할 준비가 될 때까지 다른 사람들은 갈등을 해결하는 것이 너무나 많은 많은 변화를 가져 왔습니다.

이것은 페어 프로그래밍에 이상적인 시나리오처럼 들립니다 !

혜택 및 기본 접근 방식에 대한 자세한 정보 :
https://gds.blog.gov.uk/2018/02/06/how-to-pair-program-effectively-in-6-steps/

시간이 지남에 따라 스스로 일하면서 자연스럽게 속도가 빨라지지만 그 시간이 올 때까지 어려울 수 있으며 때로는 너무 오래 걸리기도합니다. 또한 사람들은 항상 스트레스를받는 환경에서 빨리 따라 잡아야한다는 것을 배울 수 있지만, 지속적인 압박을 받고 잘 배우지 못하는 사람들은 방해를받습니다.

브랜치에서 직접 작업하고 자신보다 훨씬 빠른 다른 개발자를 따라 잡는 대신 다른 개발자와 직접 (같은 PC) 작업하는 것이 좋습니다. 이렇게하면 즉각적인 조언을 얻을 수 있으며 속도를 올리는 방법에 대한 팁을 얻을 수 있습니다.

페어 프로그래밍은 일부 프로젝트에는 항상 의미가 없기 때문에 프로젝트의 특정 코드에 대한 최선의 접근 방법을 알아봤을 것입니다. 단지 앉아 있고 경험이 많은 사람을 보더라도 학습에는 항상 의미가 있습니다. (좋은 개발자라면 경험이 반드시 좋은 습관을 사용한다는 것을 의미하지는 않습니다).

더 빠르고 경험이 많은 개발자와 함께 앉아 있으면 다음과 같은 이점이 있습니다.

  • 경험이 많은 사람과 함께 일하면 혼자 일하는 대신 완료 시간이 길어 지므로 병합 충돌이 줄어 듭니다.
  • 그들이 당신을 가르 칠 것이기 때문에 그들은 혼자 일하는 것보다 느릴 것입니다. 그래서 여전히 병합 충돌이있을 수 있으며 노련한 누군가와 함께 할 수 있으므로 시간 절약에 대한 팁을 얻을 수 있습니다.
  • 잠재적 인 속임수와 속도를 높일 수있는 방법을 알아볼 수 있도록 도와줍니다 (느린 것은 때로는 좋은 관행이 아니라 단순히 경험이 부족하기는하지만)
  • 의미가 없거나 100 % 명확하지 않은 경우 즉시 질문 할 수 있습니다.
  • 1 : 1 작업은 도움을 요청하는 사람이 작업하는 동안 정확한 코드와 시나리오를 이미 이해하고 있기 때문에 페어 프로그래밍없이 코드와 시나리오를 설명해야하기 때문에 종종 문제가되고 실제로 필요한 조언을 많이받는 데 시간과 관심을 잃게됩니다.
  • 경험이 풍부하고 노련한 사람의 사고 과정을 파악하고 의사 소통을 잘하면 새로운 것을 배우게 될 것입니다

'코딩에 능숙하다'외에 다른 방법을 사용할 수 있습니까? 다음 주에 상사와이 문제를 제기하려고합니다.

저의 조언은 다른 개발자들과 페어 프로그래밍에 대해 논의한 후 관리자에게 접근하는 것입니다. 그들이 괜찮다면, 당신은 당신이 쌍 프로그래밍의 프로를 던질 수있는 더 많은 기회를 가진 당신의 이니셔티브에 감사 할 것입니다.


솔직히 누가 downvoted :( 이것은 사소한 추측이 아닙니다. 이것은 내 직장에서 발생하며 작동하는 것으로 입증되었습니다! . 나는이 대답을 정말 열심히 아무도 그것을 제안하지 않기 때문에) 그냥이 하나 "페어 프로그래밍"을 제안 할 수있다.
제임스

1

여기에는 몇 가지 근본적인 문제가 있습니다. 병합 문제는 아마도 당신의 잘못이 아니며, 일반적으로 나쁜 관행의 증상입니다.

1) 이상적으로는 지점을 매일 개발에 병합합니다. 개발에 통합 할 수 있도록 모든 테스트를 통과하는 작업 코드를 하루에 한 번 이상 작성하십시오.

2) 평소 근무일 중 어느 시점에서 작업 코드가 없으면 작업하기에 너무 큰 코드 덩어리가있을 수 있습니다. 병합 할 수 있도록 작업을 (이상적으로 서로 독립적으로) 더 빨리 완료 할 수있는 작은 작업으로 분리해야합니다.

3) 프로젝트 파일이 너무 큽니다. 파일에 대한 병합 충돌이 많은 경우 한 파일에서 작업하는 사람이 너무 많습니다. 이상적으로 한 사람이 작업하는 것은 다른 사람이 작업하는 것과 분리되어야합니다.

4) 팀이 너무 클 수 있습니다. 전체 기능을 버리고 다시 시작하는 것이 더 쉽다는 것을 발견하면 동일한 저장소에 코드를 커밋하는 사람들이 너무 많을 수 있습니다.

5) 일관된 코드 형식 표준이 없을 수 있습니다. 모두 동일한 코드 형식을 일관되게 사용하지 않으면 동일한 코드에 대해 여러 가지 다른 충돌이 발생합니다. 자식 설정 방법에 따라 공백 충돌 (줄 끝, 들여 쓰기, 탭 대 공백)이 발생할 수도 있습니다.

6) 사람들은 변경 사항을 개발 지점으로 직접 추진할 수 있습니다.

수행 수있는 작업은 다음과 같습니다 . 1) 매일 개발에 병합 할 수없는 경우 병합 / 리베이스는 매일 (또는 더 자주) 지점으로 개발합니다.
2) 다른 사람의 코드와 코드를 분리하십시오.
3) 더 작은 기능, 일관된 코딩 표준 및 더 나은 코드 구성 (더 작은 파일, 더 작은 기능)에 대해 다른 팀과 대화하십시오.


1

실제로 내 작업을 폐기하고 작업을 다시 시작하는 것이 더 쉬운 것 같습니다. 물론 지속 가능한 솔루션은 아닙니다.)

대부분의 경우, 이것이 내가하는 일입니다. 처음으로 버그를 수정하거나 시스템을 변경하면 어떻게 해야하는지 배우고 있습니다. 다음 번에 같은 버그를 수정하면 이제 문제를 이해하는 데 1 % 만 걸립니다.

또한 약간의 작업을 다시 실행할 때 더 나은 코드를 작성합니다 .....

따라서 "개인 분기"를 사용하여 수행해야 할 작업을 상기시키는 동안 마스터에서 새 분기를 작성하고 작업을 다시 실행하는 데 아무런 문제가 없습니다.

변경 사항을 논리적 인 부분과 올바른 부분으로 나누는 방법을 발견했을 수도 있습니다. 각 부분은 완료되면 마스터 브랜치로 병합됩니다. 예를 들어, 단위 테스트 및 백엔드 코드 변경을 수행하고 병합 할 수 있습니다. 그런 다음 별도의 작업에서이를 사용하는 UI 변경을 수행 할 수 있으므로 다른 사람이 동일한 UI 파일을 편집 할 위험이 줄어 듭니다.


1

개발 브랜치를 너무 자주 브랜치에 병합하지 않으려면을 사용하여 svn과 유사한 워크 플로우를 얻을 수 있습니다 git pull --rebase. 이것은 새로운 커밋을 가져오고 커밋을 리베이스합니다. 이것은 브랜치를 개발에 병합 할 때 (앞으로 커밋을 모두 동시에 한 번에 추가 한 것처럼) 빨리 병합되며 병합 중에 충돌이 발생하지 않습니다. git pull --rebase.

그러나 브랜치를 개발 또는 브랜치로 병합하기 전에 커밋을 많이할수록 다음 리베이스가 더 복잡해지며 브랜치가 병합되지 않는 한 존재하기 때문에 기능 브랜치의 감각을 조금 전복시킵니다. .


1

공통 파일로 작업 할 때 병합을 완료하기 전에 본인 또는 팀원이 모든 충돌을 해결해야하므로 처음 에는 화내지 마십시오 . 당신은 여전히 ​​프로젝트 작업을하고 있으며 자신의 작업을 자랑스럽게 생각합니다. 더 똑똑하게 움직이기 위해 아래의 제안을 따르십시오.

  1. 작업을 독립적으로 나누십시오.

    작업을 시작하기 전에 각 팀 구성원에게 할당 된 작업이 가능한 한 독립적이고 모듈화되는 방식으로 전체 작업을 계획하고 나누십시오 (개발 중에 잠재적 인 충돌을 피하기 위해). 스크럼 리더에게 접근하여 초보자로서 독립적 인 작업을 할당 할 수 있습니다.
  2. 세분화 된 커밋 커밋 병합 :

    최종 마지 전에 전체 작업이 완료 될 때까지 기다리지 마십시오. 물론 더 큰 작업을 여러 하위 작업으로 분할 할 수 있습니다. 따라서 더 나은 접근 방법은 대규모 충돌 해결을 피하기 위해 소규모 하위 작업에 대한 소규모 커밋을 동시에 자주 병합하는 것입니다.
  3. 지점을 자주 리베이스하십시오.

    원격 지사로 로컬 지사에 자주 리베이스를 연습하십시오. 아래 명령을 사용하여 로컬 지점을 원격 지점으로 자주 리베이스 할 수 있습니다.

    git pull --rebase #or
    git pull --rebase origin dev #when dev is remote branch
    

    그것은 내 개발 인생에서 지금까지 가장 유용한 git 명령입니다.

  4. 팀원들과 긴밀히 협력하십시오.

    일반적인 작업에서 팀원과 병행하여 작업해야하는 경우 공동으로 작업하십시오. 그녀는 당신이 초보자이고 전문가이기 때문에 당신의 편의를 위해 복잡한 갈등 해결을 피하기 위해 언젠가 기다릴 수 있습니다.

  5. git 옵션과 함께 사용하십시오 :

    git merging 도구를 사용하십시오. 병합하는 동안 충돌을 해결하는 편리한 방법이 많이 있습니다. 전략을 병합 하면 많은 도움이 될 수 있습니다. 자식 명령에 익숙하고 두려워하지 마십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.