git 로그 그래프를 깨끗하게 하는 약간의 기술【기본편】

6197 단어 팀 개발Git

git 로그는 아름답게



로그 그래프가 엉망이되면 기록을 쫓을 때 마음이 부러집니다.

git flow로 개발을 하고 있으면 분기하는 것은 어쩔 수 없는 때도 있습니다만, 분명히 필요 없는데 분기시키고 있는 사람을 잘 봅니다.
칠레도 쌓으면 전혀 읽을 수 없는(읽고 싶지 않은) 그래프가 되어 버리므로, 필요없는 분기는 하지 않는 것에 넘은 적은 없습니다.

자주 분기가 발생하는 패턴



팀에서 개발을 하고 있다면, "push하려고 하면 다른 사람이 먼저 push하고 있었다"라는 것이 자주 발생합니다.
아직 git 경험이 얕은 사람은 여기에서 분기시켜 버립니다.

발생 예



예를 들어 그래프가 이 상태에 있다고 가정합니다.

commit2(f9b26f3)에 대해 수정점을 commit하고 push하려고 합니다.
(master)$ git add .
(master)$ git commit -m 'commit 4'
(master)$ git push origin master

하지만 다른 사람들이 먼저 푸시를 했기 때문에 비빠른 포워드가 발생하여 푸시할 수 없었습니다.

푸시하려고 오류
(master)$ git push origin master
To https://github.com/west-hiroaki/git-test.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/west-hiroaki/git-test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

리모트를 포함한 히스토리는 이렇게 되어 있습니다.
commit3(d3dcdd3)은 다른 사람이 먼저 푸시한 수정입니다.


이 경우 푸시하기 위해 어떤 조치를 취해야합니까?

분기시킬 패턴



여기에서 pull하면 분기합니다.

pull 명령 실행(주석 입력 생략)
(master)$ git pull origin master

pull하면 병합되므로 당연히 이렇게 됩니다.


분기하지 않는 패턴



rebase하면 분기가 발생하지 않습니다.

rebase 명령 실행
(master)$ git fetch -p
(master)$ git rebase remotes/origin/master
First, rewinding head to replay your work on top of it...
Applying: commit 4



rebase 명령으로 지정된 remotes/origin/master 커밋(commit3:d3dcdd3)에 대해 로컬 커밋(commit4)을 다시 지정하기 때문입니다.
(커밋 ID가 90129be
이미지를 보면 알 수 있듯이 로그 그래프가 일직선이되어 시계열도 깔끔합니다.

참고로 rebase하기 전에 0c4c338 를 하지 않으면 로컬 remote 정보가 오래된 상태일 수 있습니다. 그 경우, rebase 되지 않으므로 가두는 것이 무난합니다.

덤 : pull 버렸을 때의 회피 방법 Tips



여기에서 덤입니다.

push하고 non-fast-forward 상태임을 깨닫기 전에, pull 해 버려, 코멘트 입력 화면이 되어 버리면 어떻게 하면 좋을까요?
(master)$ git pull origin master



코멘트 입력 화면
Merge branch 'master' of https://github.com/west-hiroaki/git-test

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

이대로 fetch 그러면 병합이 완료되므로, 그래프가 분기해 버립니다.

회피 방법



꽤 최근까지 읽지 않았습니다만, 제대로 아래에 코멘트로 방법이 써 있었습니다.

Lines starting with '#' will be ignored, and an empty message aborts the commit.

모든 것을 코멘트 상태로 하면 abort 상태로 할 수 있다는 것이므로, 1행째를 코멘트로 합니다. (자신은 귀찮아서 1행째를 지워버리고 있습니다만)

코멘트 입력 화면: 1행째를 코멘트 아웃
# Merge branch 'master' of https://github.com/west-hiroaki/git-test

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

그리고 :wq 에서 에디터를 빠져나가면, 병합이 중단된 상태가 되고 있습니다.
(master|MERGING)$

후에는, abort시키면 OK입니다.
(master|MERGING)$ git merge --abort

그러면 pull 하기 전의 상태로 돌아오므로, rebase 하는 것이 가능하게 됩니다.
(master)$

좋은 웹페이지 즐겨찾기