힘내 빨리 감기 대 빨리 감기 병합


247

Git 병합을 사용하면 빨리 감기와 빨리 감기 분기 병합을 수행 할 수 없습니다. 빨리 감기 병합을 사용하는 경우와 빨리 감기 병합을 사용하지 않는 경우에 대한 아이디어가 있습니까?


12
겠습니까 stackoverflow.com/questions/2850369/... 도움을?
— VonC

2
나는 다른 정말 좋은 관점은 여기에서 찾을 수 있습니다 생각 endoflineblog.com/gitflow-considered-harmful
— 드미트리 Minkovsky을

답변:


290

이 --no-ff옵션은 기능 분기에 대한 명확한 개념을 원할 때 유용합니다. 따라서 그 동안 커밋이 수행되지 않은 경우에도 FF가 가능합니다. 때로는 메인 라인의 각 커밋이 하나의 기능에 해당하도록하는 것이 좋습니다. 따라서 커밋이 많은 기능 분기를 단일 단위로 취급하고 단일 단위로 병합합니다. 로 분기 병합 기능을 수행 한 경우 이력에서 분명합니다 --no-ff.

그런 것에 신경 쓰지 않는다면 가능할 때마다 FF로 도망 갈 수 있습니다. 따라서보다 svn과 같은 워크 플로 느낌을 갖게됩니다.

예를 들어,이 기사 의 저자는 --no-ff옵션이 기본값이어야하며 그의 추론은 위에서 설명한 것과 비슷 하다고 생각합니다 .

"기능"브랜치에 대한 일련의 작은 커밋이 집합 적으로 하나의 새로운 기능을 구성하는 상황을 고려하십시오. "없이"git merge feature_branch "만 수행하면" --no-ffGit 히스토리에서 커밋 객체 중 어떤 것이 모든 로그 메시지를 수동으로 읽어야하는 기능을 구현 한 경우 전체 기능 (예 : 커밋 그룹)을 되 돌리는 것은 진정한 두통 --no-ff입니다 (사용되지 않는 경우 ). 반면 --no-ff플래그가 사용 된 경우에는 쉽게 수행됩니다. 한 번의 커밋입니다. "

--no-ff가 기능 분기의 모든 커밋을 마스터 분기의 하나의 커밋으로 그룹화하는 방법을 보여주는 그래픽


3
그리고 빨리 감기는 지금 밀접하게 관련된 지점을 모아서 함께 움직이고 싶을 때 유용합니다. 모든 병합이 실제 히스토리 이벤트 인 것은 아닙니다.
— Cascabel

3
왜 여러 가지를 유지해야합니까? 그들이 밀접한 관련이 있다면-단일 지점에서 모든 것을하지 않는 이유는 무엇입니까?
— Ivan Danilov

11
밀접하게 관련된 것은 동일하지 않습니다. 게다가 워크 플로가 항상 깔끔하지는 않습니다. 항상 자신이 생각하는 커밋을하는 것은 아니며 항상 최고의 장소에서 분기하는 것은 아닙니다. 어쩌면 한 곳에서 몇 가지 기능을 시작하고 그 중 하나에서 작업을 시작하고 일반적인 기능을 인식하고 다른 기능을 빨리 전환하여 분기하기 전에 할 수 있습니다.
— Cascabel

2
첫 번째 답변에 관해서는 OP가 따라야 할 모범 사례를 알고 싶어한다는 것을 이해합니다. 일이 일어나고 모든 것이 이상적이지는 않지만 강제적 인 타협처럼 보입니다.
— Ivan Danilov

1
--no-ff과 같은 기본 도구를 사용할 때 커밋 기록에 대한 이점 이 즉시 명백하지 않을 수도 있습니다 git log. 현재 도구에 병합 된 모든 브랜치의 모든 커밋이 계속 표시됩니다. 예를 사용하는 경우 말했다, 장점은 명확하게 git log --first-parent같은 통합 지점에 develop또는 master. 종교적으로 사용하면 병합 요청 --no-ff을 독점적으로 표시 git log하는 동시에 (더 많은) 포괄적 인 기록을 제공합니다. 그래서 Vincent는 GitFlow 와 함께 사용하도록 권장합니다 .
— Jeremy Caney '28

12

프로젝트에서 일반적으로 보이는 예를들 수 있습니다.

여기서 옵션 --no-ff(즉, true merge )은 여러 부모와 함께 새로운 커밋을 만들고 더 나은 기록 추적을 제공합니다. 그렇지 않으면 기본적으로 --ff(즉, 빨리 감기 병합 )가 사용됩니다.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) 여기서 newFeature브랜치를 재사용하면 새 브랜치를 만드는 대신 git이 --no-ff병합 을 수행해야 합니다. 이는 빨리 감기 병합이 항상 적합한 것은 아닙니다.


6

개발 환경에서 작업하고 코드를 준비 / 생산 지점에 병합하면 Git no fast forward가 더 나은 옵션이 될 수 없습니다. 일반적으로 개발 지점에서 단일 기능에 대해 작업 할 때 여러 커밋이있는 경향이 있습니다. 여러 커밋으로 변경 내용을 추적하는 것은 나중에 불편할 수 있습니다. Git을 사용하여 스테이징 / 프로덕션 브랜치와 병합하지 않으면 단 하나의 커밋 만 갖습니다. 이제 기능을 되돌리려면 언제든지 커밋을 되 돌리십시오. 인생은 쉽다.


0

또한 코드가 하루 만에 배치되는 개인화 된 기능 분기를 원할 수도 있습니다. 이를 통해 개발을보다 세밀하게 추적 할 수 있습니다.

작동하지 않는 코드로 마스터 개발을 오염시키고 싶지 않으므로 --no-ff를 수행하는 것이 원하는 것일 수 있습니다.

참고로, 개인이 같은 지점에서 작업하는 사람이 없으면 git rebase -i서버에서 기록을 다시 작성 하고 강제 실행할 수 있으므로 개인화 된 지점에서 작업 코드를 커밋하지 않아도됩니다 .

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