git: terminal에서 간지나게 써보자.

Git을 이클립스나 IntelliJ에서만 사용해야한다면 좀 쪽팔릴 것 같다.
GUI 없는 상황에서는 바보가 될 거기도 하고 뭔가 Cool하지 않다.

기억력은 역시나 3초말이라 항상 까먹는다. 흔하게 사용하는 것들 위주로 정리해놓는다.

Git Repository 처음 사용하기

$ git init
현재 디렉토리를 git 저장소로 등록한다.

$ git add –all
현재 디렉토리 및 그 하위에 있는 모든 파일들을 git의 변경 대상으로 등록한다. 하기전에 아래 .gitignore 파일에 쓸데없는 파일들을 먼저 정리하자. 안그러면 번거로운 일을 두번할 수 있다.

만약 이전에 .gitignore 파일이 없다면 아래 파일을 먼저 정의한 다음에 –all 옵션으로 실행한다. 이미 실행했다고? 그럼 rm -rf .git 명령으로 git repository 설정을 날려버리면 된다. 쫄지 말자!

.gitignore
이 파일에 만약 git을 통해 관리하기 싫은 파일이 있다면 기록해둔다. .gitignore 파일이 존재하는 디렉토리를 기준으로 상대 경로를 지정하면 해당 파일은 관리 대상에서 빠진다. 생각외로 이거 사용해보면 참 좋다. 이클립스나 IntelliJ를 포함해서 서버에 올릴 파일들을 빼고 설정을 잡는다면 대강 아래와 같다.

*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# eclipse ignorings
.classpath
.project
.settings/

# intellij ignorings
*.iml
.idea/

 

변경 내용 커밋하기

$ git commit
git add 명령을 통해 등록된 파일들을 커밋한다. git add / rm 되지 않은 파일들은 커밋 대상에 포함되지 않는다. 단순히 변경했다고 하더라도. 이런 상태를 unstaging이라고 부르는데 add/rm을 통해 staged 상태로 만들어줘야 한다.

$ git commit -a
git add 명령을 통해 이전에 등록해둔 파일들의 변경(modified, deleted)된 내역들을 자동으로 커밋한다.

$ git commit file1 file2 file3
지정된 특정 파일들만 커밋한다.

$ git commit -m ‘commit message’
커밋 로그를 작성하지 않고 -m 명령에 붙은 메시지를 커밋 로그로 반영한다. 이렇게 하면 뭔가 쿨해보인다. *^^*

여기까지 했으면 로컬에 설치된 git을 통해 작업할 건 다 했다. 이제 원격에 있는 git repository에 작업된 코드를 반영할 시간이다.

$ git stash / git stash apply

작업을 하다보면 현재 작업 부분을 마무리하지 못하고 git repository에 반영을 해야만하는 경우가 있다.  작업한 부분이 좀 된다면 Rollback한 다음에 하기에는 좀 아쉬움이 크다.  그렇다고 진행중인 내용을 commit 해버릴 수도 없는 노릇이고…  이런 경우에 활용할 수 있는 명령이 stash 기능이다.  stash 기능을 사용하면 현재 작업중인 결과물을 임시로 별도의 공간에 저장하고, 소스 repository의 상태를 최종 commit한 버전의 상태로 돌려준다.

최종 커밋한 결과물까지를 서버에 push하거나 그 상태에서 추가적인 작업을 마무리하고 commit & push를 하면 된다.  그리고 stash apply 기능을 통해 이전에 작업중인 코드를 현재 branch로 불러들여와 작업을 이어가면 된다.

 

원격 서버와 친해지기

$ git remote add origin git-repo-address
원격 git repository를 현재 디렉토리에 바인딩한다. git repository를 지정하는 방식은

  • https://protocol
  • git:// or
  • user@server:path/to/repo.git

방식 가운데 하나를 사용해서 지정한다.

만약 origin 이라는 이름이 너무 상투적이라고 생각된다면 다른 이름을 사용해도 된다. 하지만 헷갈리지 말자. 지정해놓고 헷갈리면 .git 디렉토리에서 뒤지면 나온다.

$ git clone git-repo-address
만약 이미 원격에 있는 소스를 내가 받아와야 한다면, clone 명령을 사용한다. address 뒤에 별도의 디렉토리 이름을 입력하지 않으면 repository 이름이 그대로 디렉토리 이름으로 사용된다.

$ git pull origin master
원격 서버의 master branch의 변경 내역들을 땡겨온다.

$ git pull origin master
서버에 올린다. 만약 master라는 원격 branch의 이름을 까먹으면 로컬에 있는 모든 브랜치가 서버에 다 올라간다. 작업하다가 임시로 만들어놓은 것까지… 귀찮으니까 가능하면 branch의 이름을 적어주는 습관을 들이는게 좋고, 그게 아니라면 로컬에는 작업이 끝난 branch는 삭제해주는게 좋다.
평소에 보이지 않는 깔끔한 코드 작성할 때는 보여주자.

 

머지하기

다른 git repository와 머지하는 방법은 다음과 같은 방식을 사용한다.

1. 현재 작업 내용을 일단 commit 한다.

2. 현재 branch를 기준으로 머지할 브랜치를 따로 checkout 한다.
$ git checkout -b update_branch current_branch
만약 작업할 branch가 이미 있다면…
$ git checkout update_branch

3. 해당 branch로 다른 repository의 데이터를 땡겨온다.

$ git pull git-repo-address branch_name

이 과정에서 만약 쫑이나면 쫑이난 문제를 해결해야한다.
보통 쫑나면 해당 파일에 > < 와 같은 표식으로 표시가 되고, 그걸 vi 혹은 GUI 편집기를 가지고 편집하면 된다. 분량이 작을 경우에는 vi를 가지고 해도 되겠지만, 분량이 좀 된다면 그냥 이클립스나 IntelliJ를 사용하도록 하자.

4. 이제 현재 branch로 이동
$ git checkout current_branch

5. 머지하기
$ git merge update_branch

이미 앞단계에서 원격 서버와 다 합쳤기 때문에 여기서는 별달리 할게 없이 바로 되야한다. 안되면 뭔가 이상한거야!!

불필요해진 파일 삭제하기

$ git rm filename
그냥 용감하게 rm 명령으로 지운다고 git에서 제거되지 않는다. 꼭 이 명령으로 제거해줘야지 git entry에서도 빠지고, 이후에 작업하는데 번거롭지 않게된다.