Git Command

Git 명령에 대한 팁이다.

* 원격저장소에 브랜치 생성
//master 브랜치에서 child 브랜치를 새로 생성한다
//또는 다음과 같이 할수도 있다  =  git checkout -b child
git branch child master  
//원격저장소에 적용
git push origin child
//child 브랜치로 이동
git checkout child
//push/pull 명령시 원격 저장소의 child 브랜치를 자동 지정하도록 설정한다.
git branch -u origin/child

-u 명령은 --set-upstream-to 명령과 동일하다
로컬 branch가 어떤 원격 브랜치와 연결 되어 있는지 볼려면 "git branch -vv" 명령을 사용하면 된다.
-vv 옵션으로 child가 어떤 리모트 브랜치를 자동으로 참고 하는지 확인해보자.

git branch -u 사용 전

  child  2bfebc1 first
* master 2bfebc1 [origin/master] first

git branch -u 사용 후

* child  2bfebc1 [origin/child] first
  master 2bfebc1 [origin/master] first

* 원격저장소 브랜치 삭제
//로컬 child 브랜치 삭제, 커밋이 남아 있다면 -D 옵션으로 강제 삭제를 한다.
git branch -d child
//원격저장소 child 브랜치 삭제
git push origin -d child

* unstaged 파일을 head 내용으로 되돌리기 (svn revert 명령어와 동일)
//작업중인 내용은 날라가며 복구는 불가능하다

git checkout -- filenmae
//모든 파일과 폴더를 되돌린다.
git checkout -- .

//"--" 명령을 생략하고 다음과 같이 사용할수 있다.
git checkout filenmae
git checkout .

* 로컬 작업 디렉토리에서 커밋 취소, 커밋 내용도 같이 취소
//마지막 헤드 커밋 취소
git reset --hard HEAD^
//마지막 헤드 커밋 취소, 위와 동일
git reset --hard HEAD~1

//마지막 헤드 커밋 3개 취소
git reset --hard HEAD~3

* untracked 파일 제거
git clean -fd
//위와 동일한 명령
git clean -f -d

-f: 파일 제거
-d: 디렉토리 제거
-x: .gitignore 목록에 있는 파일 제거

* 로컬에서 push 안된 마지막 commit 내용 수정
콘솔창에서 입력하는 컴맨드 방식과 git gui로 사용하는 방식 두가지를 알아 본다.

- 컴맨드 방식
수정된 내용 add하고 commit --amend한다
> git add main.c
> git commit --amend

- git gui 방식
오른쪽 아래 "Amend Last Commit" 체크 박스를 선택하고 "Unstaged Changes" 뷰에서 추가할 커밋 파일을 선택후 "Commit" 버튼을 누른다.

* git cherry-pick으로 특정 커밋  가져오기
개발 브랜치의 특정 커밋을 마스터로 병합해 보자.
// 개발 브랜치에서 해쉬 확인을 위해 커밋 로그를 한줄로 본다.
$ git log --pretty=oneline
// 마스트 브랜치로 변경한다.
$ git checkout master

// 개발 브랜치의 a775840 해쉬를 마스터로 가져온다.
$ git cherry-pick a775840

git cherry-pick은 커밋을 가져온다고 표현했지만 엄밀하게 말하면 가져올 커밋을 새로 만들어서 현재 브랜치에 새로운 커밋을 추가한다.  개발 커밋 ID(해쉬)와 마스터 커밋 ID가 다르다.
즉, 새로운 커밋을 하는것과 같다.

* git cherry-pick으로 여러개의 해쉬 체리픽 하기
//공백을 주고 해쉬를 추가한다
$ git cherry-pick a775840 ab36a56
//cherry-pick을 계속한다.
git cherry-pick --continue
//cherry-pick 작업을 중단하고 이전 체리픽 작업도 취소가 된다.
git cherry-pick --abort

참조)
https://ardalis.com/clean-up-unused-git-branches
https://www.previousnext.com.au/blog/intro-cherry-picking-git

git rebase, cherry-pick, merge
https://www.tuwlab.com/ece/22218

수정한것 되돌리기
http://hochulshin.com/git-revert-changes/

리베이스
http://blog.appkr.kr/work-n-play/git-rebase/