자주 쓰지만 잘 모르는 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

GitHub 에 여러 계정을 연결하기.

일반적으로 Git 을 사용하는 User는 Github 계정을 여러개 가지고 있다.

하지만 이 계정들을 자유자재로 Local PC에서 접근하고 다루는 것은 은근히 잘 모른다.

이에 정리해본다.

 

GitHub 에 Repository 생성 

GitHub Repository 생성은 github 사이트에 접속해서 직접 해야함.( 따로 설명 안함 )

Local에서 아래와 같이 한다.

mkdir user1

cd user1

git init // user1 디렉토리 기준으로 git을 초기화한다.

이까지 하면 내 로컬에 git 을 초기화까지 하였다.

Local에 ssh 및 계정 설정

내 Local에서 개인키/공개키 쌍을 만든다.

그리고 나는 개인키를 보유, 공개키는 github의 내 계정에 등록한다.

그리고 해당 계정의 github에 내 개인키로 접속하면 접속된다.

 

내 Local에 여러개의 ssh키 등록

mkdir ~/.ssh/github_key

mkdir ~/.ssh/bitbucket_key

이런식으로 관리를 위해 directory를 여러개 만든다.

 

그리고 cd ~/.ssh/github_key 로 하여 github용 폴더로 이동.

ssh-keygenssh-keygen -t rsa -C "XXXXXX@gmail.com"   // 개인키/공개키 생성

위 명령어 수행시 id_rsa (개인키) 와 id_rsa.pub( 공개키 )를 github_key 하부에 저장되도록 한다.

 

위까지 하고 github에 내 공개키를 등록한다.

github의 계정으로 가서, settings > SSH and GPG Keys 로 이동하여 New SSH Key를 생성한다.

생성할때 여기도 관리를 위해 이름등을 알기 쉽게 잘 입력할 것.

 

config 화일 설정

관리를 하기 위한 config화일을 설정한다. d

아래처럼 Host로 구분하면 되고, github의 경우 HostName은 "github.com" 그리고 User 는 "git" 으로만 해야 한다.

#Host gitlab
#    HostName gitlab.com
#    User git
#    PubkeyAcceptedKeyTypes +ssh-rsa
#    PreferredAuthentications publickey
#    IdentityFile ~/.ssh/gitlab-key/id_rsa

Host github-user2
    HostName github.com
    User git
    Port 22
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github-key/user2/id_rsa
    
Host github-user1
    HostName github.com
    User git
    Port 22
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github-key/user1/id_rsa

#Host gist
#    HostName gist.github.com
#    User git
#    Port 22
#    PreferredAuthentications publickey
#    IdentityFile ~/.ssh/id_rsa

#Host my-dev
#    HostName 192.168.0.214
#    User lesstif
#    Port 9022
#    PreferredAuthentications publickey
#    IdentityFile ~/.ssh/dev/id_rsa

## Host 를 * 로 지정하면 위에서 설정한 Host를 제외하고 모든 Host 에 적용됨
#Host *
#    User dosjung
#    PreferredAuthentications publickey, password
#    IdentityFile ~/.ssh/id_rsa

Local 에 Remote Repository 추가

이제 Remote Repository를 추가한다.

동일한 Repository에 서로 다른 git 계정(local)이 사용할 거다.

config를 통해 2개의 Host를 등록했다.

여기서 만약

git remote add origin git@github.com... 이렇게 등록하면,

실제 git에서 어떤 계정으로 연결할지 모른다.

즉, 아래 나오겠지만 ssh-add -l 을 하면 github 의 ssh key가 2개 나온다.

( 어떤것을 선택할 지 몰라서 될때도 있고 안될때도 있다.)

 

따라서, 아래와 같이 해야 한다.

( 아래 녹색부분은 config 화일에 host로 구분해둔 이름이다.)

 

user1 에서는...

git remote add origin git@github-user1:user1/git_training.git

 

user2 에서는...

git remote add origin git@github-user2:user2/git_training.git

 

이렇게 하면 각각의 user1, user2 에서 각각 git init 을 하였을 것이니,

해당 git 환경에서 따로 remote 에 access한다.

 

권한 오류가 날때....

사실 ssh-add는 해줘야 한다. ( 오류날때 하는 것이 아니다.)

 

ssh-add 와 file permission 을 확인.

ssh agent에 위에서 작업한 사항이 반영되도록 ssh-add 명령어를 통해 등록한다.

먼저 이전에 등록된 대상이 garbage로 있을수 있다.

이것들 때문에 잘 안되는데 해결 못하는 경우가 많다.

( 안해도 되지만 잘 안될때는 아래 ssh-add -D로 캐쉬를 제거한 후 진행해보는 거도 좋다.)

 

먼저 file permission

chmod 600 id_rsa* // id_rsa, id_rsa.pub 2개 permission 변경

chmod 644 config // config file permission 변경

 

ssh-add -D // 기존 ssh 등록분 메모리에서 제거

ssh-add /Users/XXXXX/.ssh/github-key/user1/id_rsa  // 등록

ssh-add -l  // 등록된거 조회 ( 뭔가 보이면 됨. )

 

ssh -vvv -T github-user1 // 테스트( config 화일의 호스트이름으로 테스트 )

 

참고) set-url

git 에서 직접 remote setting 시에도 아래처럼 host-in-ssh-config 처럼 하여

remote 를 변경할 수 있다. 참고할것.( host-in-ssh-config 는 config에 등록한 호스트 이름이다.)

 

git remote set-url origin git@<host-in-ssh-config>:<username>/<repo>

( 참고) <username>/<repo> 는 github에서도 copy & paste 할수 있도록 되어 있다.

  기본적으로 github repo 주소는, git@github.com( 이까지는 동일 ) + ":" + username/repository이름의 형식이다.
  즉, git@github.com:newbiestory/helloworld.git 이런 형식이다. )

Local git 환경 설정

이제 여러 계정으로 동일 repository에 접속하든 다른 repository에 접속하든,

나의 local PC 한개에서 여러개를 처리해야 한다.

따라서 global config는 지양한다.

 

cd user1 // 처음 repository 만든 위치

git config user.name "user1"

git config user.email "user1@xxx.com"

 

cd user2 // 이것도 user1과 동일한 방식으로 진행( git 설정까지 모두 )

git config user.name "user2"

git config user.email "user2@xxx.com"

 

이렇게 하면 ...

user1 에서 작업하면 user1 commit log

user2 에서 작업하면 user2 commit log 가 생기고

 

서로 user1, user2 독립된 git 환경에서 작업이 가능해 진다.

 

끝.

'개발환경 > GIT' 카테고리의 다른 글

Git 명령어  (0) 2019.04.07

Sublime Text로 개발하기

  1. 일단 다운로드 하고 설치한다.
  2. 사용법을 익힌다.
  3. 참조할 사이트는 https://www.lesstif.com/pages/viewpage.action?pageId=9437318#SublimeText3%EC%84%A4%EC%B9%98%EB%B0%8F%EC%84%A4%EC%A0%95-Packagecontrol%EC%84%A4%EC%B9%98
  4. 잘 정리되어 있다.

유용한 Tips

  1. control + ` : 
  2. command + shift + P : 명령창 ( 요거는 꼭 외울것 )
  3. fast file switching : command + p ( 파일명을 빨리 찾을때 매우 유용함 )


+ Recent posts