레이블이 rebase인 게시물을 표시합니다. 모든 게시물 표시
레이블이 rebase인 게시물을 표시합니다. 모든 게시물 표시

commit does not belong to any branch

# 잘못된 email 주소가 있어 수정하기 위해 아래 포스팅한 rebase 스크립트를 실행했다.
# rebase 후 tag 를 푸시하지 않았고 no branch(브랜치가 없는) 커밋으로 남게 됐다.
# git log 에는 보이지 않지만 tig cli 툴로 보면 최초 커밋 이전에 수정전 커밋이 no-branch 상태로 추가되어 보인다.

# tig 에서 봤을때 tag 커밋은 no branch 상태로 email 도 수정되지 않은 상태였다.
# 깃헙에서 no-branch 커밋을 보면 다음과 같은 메시지가 나온다.
https://github.com/xxxx/commit/{커밋해시} 
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

# 또 다음 명령으로 커밋이 포함된 브랜치를 찾아도 결과가 없다.
git branch --contain {커밋해시}

# 문제는 tig 로 보면 no-branch 커밋들이 최초 커밋 이전에 중복되어 보인다는 것이다.

# [해결방법]
# 다시 위 포스팅의 rebase 스크립트(이름,email 값 변경해서)를 실행했다.
# mater, develop 강제 푸시해도 변경사항이 없다고 나왔지만, tag 는 강제 푸시가 됐다.
git push --tags -f

# tig 에서 다시 확인해보니 email 수정된 tag 커밋이 제대로 반영됐다.(해결!)

# [로컬 refs 제거방법]
# 추가로 no branch (tag) 커밋들은 다음과 refs/.. 로만 표시된다.
refs/original/refs/tags/1.0.0
refs/original/refs/tags/1.0.1

# refs 는 로컬에 남아 있는 참조 정보라 지워도 된다.
# refs 지우기
# 방법1
# 다음과 같이 일일히 삭제하면 된다.
git update-ref -d refs/original/refs/tags/1.0.0
git update-ref -d refs/original/refs/tags/1.0.1

# 방법2
# 아래 경로의 파일들을 삭제해도 된다. 하지만 .git 내용을 직접 수정하는거 권장되지 않는다.
rm -rf .git/refs/original

# 방법3
# 삭제해야할 refs 가 많다면 이미 remote(origin) 에는 푸시됐으니 로컬에서 새로 클론 받자.
git clone http://{저장소}

# 참고로 이제 tig 에선 no branch 상태의 커밋들이 보이진 않지만
# https://github.com/xxxx/commit/{커밋해시} 에는 여전히 no branch 커밋들을 확인할 수 있다.
# rebase 가 수정된 새로운 커밋을 생성하는거고 이전의 no branch 커밋들은 유효하지 않은 상태로 github 저장소에 계속 남아 있는 것으로 보인다.
# 이 부분은 제거가 안돼서 저장소를 새로 만들어야 하는것 같다.

git push 된 커밋 사용자 name, email 변경

# 현재 저장소 ./git/config 에 user(name, email) 을 설정하지 않은 상태에서
# 전역 ~/.gitconfig 에 설정된 회사 user(name, email) 로
# 오랫 동안 commit , push 하고 있었다.
# github 에선 등록되지 않은 email 로 contribution 카운트가 누락된다.
# 이미 push 된 커밋들의 author(user name, email)를 변경할 수 있다.
# 참고 https://www.git-tower.com/learn/git/faq/change-author-name-email


#####


# [첫번째 방법]
# 잘못된 author 로 커밋이 일어나기 전의 커밋으로 rebase 한다.
# 잘못된 커밋 해시 이후 부터 head 까지의 커밋들을 수정할 수 있다.
# -i, --interactive 사용자가 rebase 하기전에 수정할 수 있도록 한다.
# --preserve-merge 를 옵션을 사용하지 않으면 하나의 브랜치 커밋들로 변경된다.
git rebase -i --preserve-merge 잘못된_커밋_이전_커밋_해시

# 최초 커밋부터 잘못되었다면
git rebase -i --root

# 이제 rebase 커밋 이후의 모든 커밋들이 vim 에디터로 보인다.
# 위쪽 부터가 오랜된 커밋이다.
# github 커밋 기록을 보면서 잘못된 커밋은 pick -> edit 또는 e 로 변경해 저정한다.


# 이제 터미널에서 커밋마다 author 만 수정한다.
# 참고로 --abort 로 rebase 취소할 수 있다.
git commit --amend --author="ysoftman <ysoftman@gmail.com>" --no-edit

# rebase 계속 진행(다음 커밋으로 이동)
git rebase --continue

# 위 두과정을 커밋이 없을때까지 반복한다.
# 더이상 진행할 커밋이 없으면 다음과 같은 메시지 나온다.
Successfully rebased and updated refs/heads/master.

# master, develop, feature 등 로컬의 브랜치 마다 강제 push 한다
git push -f

# 혹시 로컬에 rebase 전 상태로 clone 받은 곳이 있고, 여기서 git pull 하면
# 이곳에선 rebase 수정전 커밋들이 그대로 남아있고 수정한 커밋들이 추가되는 형상이 된다.
# 여기서 push 하면 다시 수정한 커밋들이 푸시되니 이런 clone 은 삭제하자.


#####


# [두번째 방법]
# 우선 git pull 받아 최신 상태로 업데이트한다.
https://git-scm.com/docs/git-filter-branch
# 다음 스크립트를 이용해 한번에 변경할 수 도 있다.(완전 편함~ㅋ)
git filter-branch --env-filter '
WRONG_EMAIL="wrong@example.com"
NEW_NAME="ysoftman"
NEW_EMAIL="ysoftman@gmail.com"
if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

# pull 표시가 나더라도 pull 없이 강제 push 한다.
# master, develop, feature, tag 등 로컬의 브랜치들을 강제 push 한다.
git push origin master -f
git push origin develop -f
git push --tags -f

# git filter-branch 를 실행해서 다음과 백업이 있어 실행하지 못한다면
# git filter-branch 뒤에 -f 로 강제(백업 덮어쓰기)할 수 있다.
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

# 로컬에 refs/original/refs/... 참조가 보이면 삭제한다.
# 업데이트할 참조가 많다면 새로 clone 받는것이 편할 수 있다.
git update-ref -d refs/original/refs/heads/master
git update-ref -d refs/original/refs/heads/develop


#####


# 실제 커밋(contribute) 수 보다 적게 표시되는 상황


# author 수정 후 정상 카운트 되는 contributions


#####

# rebase 이전의 커밋들이 보일 수 있다.
# 이를 표시하지 않으려면 해당 release 혹윽 태그를 삭제해야 한다.
git tag -d ysoftman-release-1
git tag -d ysoftman-hotfix-1


#####


# 참고로 여러 커밋을 합치는 경우 위 vim 커밋 수정화면에서
# 방법1
# 합칠 커밋들을 s 또는 squash 로 변경해 저장한다.
# s 로 표시한 커밋과 s 바로 이전 커밋이 vim 편집 화면이 열리고 커밋 메시지를 수정하고 저장하면 s -> s 이전 커밋으로 합쳐진다.
# 방법2
# 합칠 커밋들을 f 또는 fixup 로 변경해 저장한다.
# f 로 표시한 커밋 메시지는 vim 편집 화면 없이 삭제되며 f -> f 이전 커밋으로 합쳐진다.