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


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.