2012-10-26 5 views
2

우리 회사에서 최근에 git로 옮겼습니다. 이 환경에서 작업하는 과정에서 나는 로컬 커밋 (로컬 브랜치에서)을 많이 만듭니다. 내 코드를 최신 상태로 유지하기 위해 나는 끌어 당깁니다. 이제 최종 결과는 git 로그를 작성하면 커밋과 다른 개발자의 커밋이 해당 로그에 있음을 알 수 있습니다. 내 커밋을 원격으로 밀기 전에 모든 로컬 커밋을 모아서 하나의 커밋 (병목 현상을 줄이기 위해 inorder)에 병합하고 원격으로 푸시하고 싶습니다. 어떻게해야합니까?git local 커밋을 어떻게 하나의 커밋으로 병합합니까?

rebase -i (대화 형 REBASE)를 사용하는 방법에 대한 자세한 내용은

답변

1
git fetch <remote name> 
git rebase -i <remote name>/<branch name> 

,이 가이드를 참조하십시오 병합 커밋과 리베이스/밀어 넣기는 항상 잘 재생되지 않는

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

참고. Rebasing은 병합 후에 커밋을 이동하기 때문에 병합 커밋이 사라질 수 있으며 문제가 발생하지 않을 수 있습니다. 그러나 병합 된 것이 원격 지점에없는 경우 이미 커밋해야합니다. 꼼꼼한.

0

접근 방식을 변경해야합니다. 로컬 지사에서 개발하는 동안 풀 (또는 페치)을해서는 안됩니다. 오히려 "main"개발 브랜치를 업데이트하고 때때로 "main"브랜치를 사용하여 개발 브랜치를 rebase (git rebase)하십시오.

지금 바로 git cherry-pick을 (를) 찾을 수 있습니다.

또한 주어진 (개발) 분기에서 수동으로 재설정 (git reset --soft) 한 후 다음 커밋을 커밋 할 때만 변경하도록 선택할 수 있습니다.

브랜치에만 커밋을하는 경우 훨씬 간단합니다. 스쿼시를 할 수 있습니다 (스쿼시). 개발 방법에 너무 많은 커밋을 생성하지 않는 방법 중 하나는 커밋을 시도하는 것입니다 (git ammend).

+0

Git은 실제로 리버스하는 것에 대해 꽤 지능적입니다. 리버스하는 것은 상상할 수있는 한 중간 분기를 시작하는 것입니다. – Amber

+0

사실 그렇지만이 특별한 경우에 모든 것은 커밋 된 분기가 무엇이며 병합되어야하는지에 따라 다릅니다. 둘 다 동일하다면 (또는 둘 다 커밋이 더 일반화되는 경우) 이는 사실입니다. 체리 피킹을하지 않으면 효과가 있습니다. – codewarrior

3

가장 간단한 방법은 git pull을 실행하고 모든 충돌을 해결하고 최신 상태 인 경우 지점 포인터를 최신 원격 커밋 (나는 origin/master으로 가정)으로 재설정 한 다음 새로운 커밋을하십시오.

git reset --soft origin/master 
git commit 

새로운 커밋은 리모트의 마스터 커밋 맨 위에 단일 커밋으로 변경됩니다. 그런 다음이 커밋을 리모컨으로 푸시 할 수 있습니다. 푸시하기 전에 커밋을 확인하려면 git show을 사용하십시오.

참고 :이 경우에만 하나 개의 공유 지점 (master)에서 가져온 또는 한 것으로 가정 당신이 뽑아 한 모든 다른 공유 지점이 이미 병합되어있는 원격의 master.

+0

나는 그것을 좋아한다. 'git rebase -i'보다 조금 덜 성가시다. – jszakmeister

관련 문제