자주 쓰지만 잘 모르는 git 명령어
git commit -am <message>
이 명령어는 git add + git commit 이다.
즉 Tracking되는 unstaged 된 화일을 staging area 로 이동( git add ) 후 commit 을 하는 것임.
참고로, git commit -am 을 하면 모든 tracking되는 화일이 모두 staging으로 간다.
따라서 주의해야한다. ( 필요한 화일만 add 할려면 따로 git add filename1 filename2.. 이런식으로 하고
git commit -m 으로 해야 한다.
git pull ? fetch ?
이건 아주 간단하다.
git fetch 한후 git merge 한것이 git pull 과 완전 동일하다.
따라서 git pull 도 충돌이 날수 있다.( git merge를 하는 것이므로 )
하지만 git fetch는 충돌안난다. 변경사항만 가져오므로.
Remote의 특정브랜치 기준으로 브랜치 만들기
요약하자면, Remote의 특정Branch기준으로 Local에 브랜치 만들고 그걸 remote에도 반영하기.
일단 현재 Branch 상태를 알아봐야 겠지?
git branch : 현재 local의 branch를 조회함.
git branch -a : remote 포함해서 모두 조회함.
그런데 동료가 remote에 branch만들었다고 하는데..왜 안보이지?
그럴때는 git fetch 이걸 통해 remote들의 정보를 가져온다.
그리고 나서 다시 git branch -a 를 하면 branch 정보를 모두 볼수 있다.
Remote에 이미 Branch가 있는 경우.( Remote 특정 Branch 로 부터 만들기 )
리모트의 Branch명과 동일하게 내 Local에 Branch를 만들기.
git checkout -t origin/feature-01 ( -t 는 tracking option 이며 --tracking 도 동일옵션임 )
이렇게 하면 리모트와 동일하게 만들고 tracking까지 한다.
리모트의 Branch명과 다르게 내 Local에 Branch를 만들기
git checkout -b local_feature-01 origin/feature-01
Remote에 Branch가 없는 경우.
Remote의 특정브랜치로 부터 만들고 그 Branch를 remote에 올려야함.
git checkout -b issue-001 origin/feature/iss-1
git push origin issue-001
이렇게 하고 github가보면 issue-001이 생긴것을 확인할 수 있다.
단순하지만 중요한 것.
위의 issue-001을 보면, issue-001은 origin/feature/iss-1 에서 만들었고 origin/feature/iss-1은 master로 부터 만들었다.
따라서 issue-001을 수정하고 push하면 반드시 origin/feature/iss-1 에 merge하고 그걸 master로 또 merge해야 한다.
일단 해보자.
수정, git commit , git push origin HEAD 를 수행함.
github에 가보면 pull request 대상으로 뜬거 확인.
pull request 를 원래 base 였던 issue-001 -> origin/feature/iss-1 로 진행함. commit 1개 발생.
이후에 수기로 다시 pull request 함. ( origin/feature/iss-1 -> master )
merge 시 confict 남. -> conflict 해결 -> commit 1개 발생.
즉 origin/feature/iss-1 에는 2개의 commit이 존재하게 되고 그걸 master로 merge하면 된다.
즉, conflict 가 나서 merge 작업을 하면 그것 또한 origin/featrue/iss-1 브랜치에서 수정된 것으로 된다.
참고로 물론 issue-001 -> 바로 master에 머지할 수 있지만, 그렇게 하게 되면 history 와 브랜치가 꼬여서
복잡해지고 관리가 안됨. 따라서 실무에서는 항상 branch의 base가 된 remote branch에 먼저 push하고 merge
하면서 차근차근 진행할 것.
복잡하지만 중요한 것 ( Branch 관련 )
만약, 리모트에 브랜치(feature/iss-2) 가 있는데 로컬에 그 기준으로 다른 이름으로 브랜치를 만들고 Tracking 을 하는 경우.
git checkout -b local_iss-2 origin/feature/iss-2
그럼 local 은 즉시 local_iss-2 로 checkout 되어 있는 상태이다.
여기서 문서를 수정하고 commit 하고 git push 를 하면 오류가 난다.
local 현재 브랜치 명과 remote 브랜치 명이 틀려서 다른 명령어를 쓰라는 것이다.
따라서,
git push origin HEAD 이렇게만 하면 새로운 iss-2 이라는 브랜치를 리모트에 만들고 push하고,
git push origin HEAD:feature/iss-2 를 하면 그 feature/iss-2 에 push한다.( 즉, local에서 tracking하는 리모트브랜치로 push)
git push origin HEAD 를 하고 나면 github에서는 어떤일이 생기냐 하면,
local로 부터 remote의 feature/iss-3를 base로 만든 branch local_iss-3 이 push되었으니 remote의 feature/iss-3에 pull request해야 한다. 라는 메세지가 github 상단에 친절하게 보인다.
( 실제로 아래 Compare pull request 를 눌르면 기본으로 feature/iss-3 <-- local_iss-3 으로 표시됨.)
pull request하고 feature/iss-3에 merge & commit을 하면 자동으로 또 한번 더 나온다. 뭐가? ( 맞춰보세요 0)
아래와 같이 나온다. 아래는 master <-- feature/iss-3 을 하라는거다.( 캡쳐는 iss-2로 된건데 실수임. )
이 사항들은 꼭 기억하길 바란다.
'개발환경 > GIT' 카테고리의 다른 글
Git & Github (0) | 2019.04.07 |
---|