Search
Duplicate
📄

(git)새내기를 위한 과제 개인레포 세팅하기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
git
Scrap
태그
잡지식
9 more properties
이 글은 추후에 입과하실 새내기 분들을 위하여 제 경험을 공유하기 위해 작성한 게시물입니다
우선 저는 라피신때부터 git을 생성하는 방법도 몰라서 과제 제출용 레포를 clone하고 그 위에서 작업을해서 push를 했었습니다
하지만 이렇게 하다보면 제출 주소가 달라질때마다 매번 새로 clone을 할때도 있었고 나중에 git log들을 합칠때 꽤나 고생스러웠습니다
그리고 가장 큰 문제로는 클러스터 밖에서 해당 레포를 clone 할 수 없기때문에 집에서 과제를 할 수 없었습니다
이 문제를 고치기위해 개인레포를 세팅해야겠다는 생각이 들었습니다
우선 42cursus 통째로 레포를 파는 방법, 과제별로 branch를 생성하는 방법, 과제별로 레포를 따로 파는방법
이렇게 세가지를 떠올렸으나 첫번째는 ‘아슬아슬한 클러스터 맥 용량에서 나중에 clone해올때 감당 할 수 있는가?’ 가 문제였고
두번째는 default로 설정되지 않은 branch는 GitHub 에서 잔디가 표시되지 않는다는 문제가 있었습니다
그래서 가장 마지막 방법인 과제별로 일일이 레포를 생성하는것으로 결정하였습니다
우선 github에서 먼저 과제용 레포를 하나 생성하고 해당 레포를 clone합니다
그리고 그 디렉토리에서 이전과 같이 작업하다가 제출할때만 git remote add, git remote remove 명령어로
과제 제출용 레포 주소만 변경해주고 git push (remote add로 추가한 레포 이름) (현재 branch 이름) 으로 쉽게 제출 할 수 있고
집에서도 얼마든지 clone으로 내려받아 작업하고 push 할 수 있습니다
하지만 새로 시작하기에 이미 너무 많은 commit을 거쳐왔다면…
두가지 방법을 제시해드립니다
1.
merge
새로 작성한 레포에서 이전 레포의 로그를 fetch로 가져와서 병합하는 방식입니다
git fetch 원격레포 branch 명령어를 통해 이전에 작성하던 레포의 작업물을 가져옵니다
git checkout 명령어로 병합의 베이스가 되고싶은 브랜치로 이동합니다 (ex. master)
git merge (fetch로 가져올때 만들어진 branch 이름) 명령어로 병합합니다
쉬운 방법이긴 하지만 만약 클러스터에서 작성한 commit을 github에 업로드 했을때 잔디가 생기지 않는다면 아래와 같은 이유를 생각해볼수있습니다
GitHub에 등록되어있는 계정 정보와 클러스터에서 작성한 commit의 author 정보가 다르다
이를 해결하기 위해서는 commit —amend로 수정할수있지만 수정해야하는 commit이 한두개가 아닌경우
사용할수있는 다음 방법이 있습니다
2.
rebase
merge랑 비슷한것같으면서도 다른 명령어입니다 merge는 두개의 branch를 병합하여 하나의 새 branch 처럼 만든다면
rebase는 다른 branch의 base를 수정하여 마치 하나의 branch였던것처럼 만드는것입니다
그리고 rebase를 통해서 다중 commit을 수정할수도 있습니다
git rebase -i 수정하고싶은 commit의 직전 hash -x "git commit --amend --author=\"이름 <이메일>\" --no-edit"
JavaScript
복사
위 처럼 작성해주면 수정하고싶은 commit부터 가장 최근 commit까지 일괄적으로 author 정보를 수정할수있는데요 뒤의 —no-edit을 붙여주지 않으면 날짜가 오늘날짜로 일괄적으로 수정되어버립니다 그러니 날짜로 보존하고싶다면 꼭 적어주셔야 합니다
만약 맨 처음에 작성한 commit부터 수정하고싶다면 -i 뒤에 —root를 적어주시면 됩니다
그러나…이렇게 작성하고 push를 해도 github에 잔디는 오늘날짜로 생겨버리게 됩니다
(도움을 주신 kissing님 감사드립니다)
그런 상황은 commit에 적혀있는 author date와 github에서 인식하는 committer date가 달라서 생기는 현상인데요
위의 스크린샷의 명령어를 작성해주시고 강제로 push해서 다시 덮어주시면 해결됩니다