2011-01-11 7 views
2

git 저장소의 작동 버전 기록을 유지하는 가장 좋은 방법은입니까?git workflow : 기능 커밋 내역 유지

우리가 항상하는 것처럼 자식으로 분기하고 병합하는 것은 매우 쉽습니다. 필자는 일반적으로 토픽 브랜치를 사용하여 기능이 완료되었을 때 마스터로만 병합했습니다. 이것은 잘 작동하지만, 여러 번의 반복 작업을 거친 후 master 브랜치의 히스토리는 복잡한 그래프이며 어떤 시점에서든 올바르게 작동하는 애플리케이션 버전을 나타내는 커밋을 식별하는 것은 매우 어려워진다.

특정 날짜와 가장 가까운 내 Repo 사본을 쉽게 검색 할 수있는 워크 플로우에 대한 조언을 찾고 있습니다. 이 기능의 또 다른 유용한 기능은 시간이 지남에 따라 기능하는 저장소를 나타내는 커밋 목록을 검색하는 것입니다.

수동으로 수행 할 수 있음을 알았습니다. 즉, 커밋 로그와 메시지를 검사하여 다음 기능이 시작되기 전에 마지막 커밋을 찾거나 각 커밋에 대해 테스트를 실행하고 그에 따라 필터를 실행합니다. 그 방법은 다소 신뢰할 수 있지만 나는 덜 우연한 방법으로 그것을 찾고있다.

+0

궁극적으로 git에게 주어진 커밋이 작동하는지 여부를 알려주는 사람입니다. 커밋 메시지에 정보를 포함시키는 것을 기억하도록 도와주기 위해 후크를 사용할 수 있습니까? 그러나 어느 시점에서는이를 메모해야합니다. (당신이 더 잘 맞는다면 메모를 쓸 수도 있습니다.) – Cascabel

답변

4

git log --first-parent master을 사용하면 각 커밋의 첫 번째 부모 만 따라 master의 기록을 볼 수 있습니다. 즉, 병합이 발생하면 첫 번째 상위 항목 (마스터의 이전 커밋이어야 함) 만 추적되고 두 번째 상위 항목 (주제 분기의 마지막 커밋)은 무시됩니다. 워크 플로를 사용하면 대부분 병합으로 구성됩니다. 중요한 점은 마스터에 대한 커밋 (또는 병합)이 작동하는 버전으로 간주되는 한이 로그의 모든 커밋은 작동하는 버전이라는 것입니다.

+1

+1 마스터가 항상 작동하도록 유지합니다. gerrit와 같은 것이 그것을 보장하는 데 도움이 될 수 있습니다. – Thilo

+0

부분적인 해결책처럼 보입니다. 종종 병합 할 때, 마지막 병합 이후에 메인 브랜치에 커밋이 없었을 것이므로 병합 커밋이 전혀 없을 것입니다. 그러나이 솔루션은 아무 것도없는 것보다 낫습니다. –

+0

그런 경우 병합 할 때 항상'--no-ff'를 사용하여 병합 커밋을 생성하는 정책을 적용 할 수 있습니다. –

0

나는 기능 가지를 사용하여 당신을 듣고 매우 기뻐 - 단정하게 유지하는 방법은 두 가지, 그냥 더 나은 당신의 두뇌 작업을하는 데 도움이 한 가지가있다, 당신은 그 후

을 :) 이동합니다.

1) 활발하게 작업하고있는 각 지점에 대해 로컬 지점을 만드십시오. 당신은 다른 사람들이하고있는 것을 다시 rebase 할 수 있기를 원하기 때문에 이것을하고 싶습니다. rebase가 없으면 병합을 나타내는 많은 커밋을 통해 역사에 아무 것도 추가하지 않게됩니다. 원격지의 브랜치를 리베이스 할 수는 있지만 리포지토리가 히스토리를 다시 작성하므로 두 사람이 동시에 수행해야하므로 바람직하지 않습니다. 프로젝트 초기에 저는 보통 master을 해결합니다. 그래서 나는 master_local을 만들지 만, 아무것도 추적하지 않습니다 (git branch master_local). 사람들이 내가 원하거나 필요로하는 변경 (git pull)을 할 때, master_local을 체크 아웃하는 동안 rebase (git rebase master)를 체크 아웃한다.

그리고 뇌를 잘 관리하는 팁 - 로컬 브랜치를 추적/원격 지형지 물에 자주 병합하십시오. 더 많은 것을 분리하면 더 많은 것을 기억할 수 있습니다. 더 큰 병합 일수록 더 많은 사람들이 당신이 일하지 않는다고 불평 할 것입니다.)

2) 큰 특징이 있다면 많은 사람들이 지사 지점 당 커밋 수가 많습니다. 이러한 기능을 마스터 할 준비가되면 모든 기능을 볼 필요가 없습니다. 또한이 기능을 되돌리려면 수백 개의 패치를 되돌리고 싶지 않습니다. 이 모든 것에 대한 해답은 커밋을 1 회의 커밋까지 스쿼시하는 것입니다. 이 방법은 마스터가 포함 된 기능의 좋은 짧은 목록입니다. (http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.htm)

+0

당신의 대답은 * 항상 스쿼시 커밋이므로 마스터의 역사에 커밋되지 않아 앱이 작동하지 않는 상태가됩니다 *? –

+1

주제 분기에서 병합하는 일반적인 방법으로 커밋을 스쿼시하는 것은 적절하지 않습니다. 그 역할은 주제 분지의 역사를 완전히 버리는 것입니다. 그러한 역사는 흥미로운 것은 아니지만 나중에 특히 버그를 찾기 위해 양분 할 필요가 있거나 다른 토픽 브랜치와의 충돌로 끝나는 경우 매우 유용 할 수 있습니다. –

+0

그건 그렇고, # 1은 바퀴를 다시 발명 한 것 같습니다. git은 이미 원격 지점을 추적하는 로컬 지점을 지원합니다. 즉 당신은'master'를 로컬로 가지고 있고'origin/master'는 자동으로 원격 브랜치를 추적하도록 설정되어 있습니다. 'git fetch'는 원격 브랜치를 갱신하고,'git rebase origin/master'는 로컬 마스터를 원격 브랜치에 리베이스합니다. –

0

최상의 솔루션 (장기적)은 워크 플로를 조정하여 중간 지점 '체크 포인트'커밋을 깨끗하게 유지하는 것입니다. Benjamin Sandofsky details a workflow은 Git이 설계된 방식과 가장 유사한 것으로 보입니다.

기사의 요점 : 두 가지 범주에 지사의

생각해 : 공공 및 민간.

공개 분기는 프로젝트의 신뢰할 수있는 기록입니다. 공개 브랜치에서, 모든 커밋은 간결해야하며, 원자 적이어야하며 잘 문서화 된 커밋 메시지가 있어야합니다. 가능한 한 선형이어야합니다. 그것은 변경할 수 없어야합니다. 공용 지점에는 Master 및 릴리스 지점이 포함됩니다. 개인 지점은 고객님을위한 것입니다. 문제를 해결하는 동안 그것은 당신의 스크래치 종이입니다.

반창고, 깨진 이등분선 및 비난의 신비는 스크루 드라이버를 망치로 사용하는 모든 증상입니다.

개인 분기를 바닐라 병합으로 공용 분기에 직접 병합해서는 안됩니다. 먼저 재설정, 리베이스, 스쿼시 병합 및 수정 커밋과 같은 도구로 지점을 정리하십시오. 공개 기록을 초기 상태로 취급하는 경우, 빨리 감기 병합은 안전 할뿐만 아니라 바람직합니다. 개정 내역은 선형적이고 쉽게 따라갈 수 있습니다.

대중 역사를 불변, 원자력 및 따르기 쉬운 것으로 취급하십시오. 사적 역사를 일회용으로 처리하십시오.

의도 된 워크 플로우는 다음과 같습니다

  1. 공개 분기하는 사설을 만듭니다.
  2. 정기적으로 작업을이 개인 분기에 위탁하십시오.
  3. 코드가 완벽 해지면 코드 히스토리를 정리하십시오.
  4. 정리 된 분기를 공용 분기에 다시 병합하십시오.