C 언어
Cpp 언어
Kotlin
Android App
알고리즘
Git/CI/CD
[02] Git Command

1. git init
git init [--bare] [directory]
Git 저장소 또는 원격 저장소를 생성하는 명령어이다.
git init만 하면 로컬 저장소를 생성하고, git init --bare 하면 원격 저장소가 생성됨.



2. git clone
git clone <repository> [<directory>] [-b <specific_branch]
Git을 원격 저장소(repository)로부터 복제하는 명령어이다.
Directory를 넣으면 해당 Directory가 새로 생성되면서 카피해오고, 입력하지 않으면 repository명으로 생성된다.

-b 옵션을 주고 Branch명을 작성하면 해당 원격 Branch 를 기반으로 복제한다.



3. git branch
Show Branch List
git branch [-r | -a]

현재 Git의 Branch 목록을 보기 위한 명령어이다.
아무 옵션이 없으면 Local Branch 리스트를, -r 옵션을 주면 Remote Branch 리스트를, -a 옵션을 주면 모든 Branch 리스트를 출력한다.

Create/Modify Branch
git branch
 <newbranch>

Branch를 새로 생성한다. 

Create/Modify Branch
git branch -m [<oldbranch>] <newbranch>

Branch 이름을 변경한다. oldbranch명을 입력 안하면 현재 Branch의 이름을 변경한다.

Delete Branch
git branch -d [-r] <branchname>

Branch를 삭제하기 위한 명령어이다.

Set Branch's Remote Target
git branch --set-upstream-to [<branch>] <remote_branch>

Branch의 Remote Branch를 설정한다. 만약 로컬 Branch명을 작성하지 않았으면 현재 사용중인 Branch의 Remote Branch를 변경한다.
Branch를 생성하고 Remote에 Push할 때 "-u" 옵션을 안주었으면 꼭 --set-upstream-to를 설정해 주어야 한다.



4. git switch/restore (구 checkout)
checkout 코맨드는 현재는 deprecated이며 Git 2.23.0부터는 switch, restore로 변경되었다.
git switch는 HEAD 포인터를 이동시키는 명령어이다. *(사용중인 브랜치는 HEAD를 따라 이동하지 않음!)
git restore는 Working Tree File들을 복원하는 명령어이다.

Change HEAD to Branch/Tag/Commit
git switch [<branch>]
git switch [<tag>]
git switch [<commit_id>]

특정 Branch나 Tag, Commit으로 HEAD 포인터를 이동시킨다.
특정 tag나 commit으로 바로 이동하는 경우 브랜치 정보가 (no branch) 상태가 되므로 주의하자.

Restore File
git restore [<filename>]

특정 File이 Modified 상태인 경우 원래 상태로 돌린다.

Restore File to specific Commit
git restore <commit_id> [<filename>]

특정 File을 Commit 상태로 복원한다. 돌아간 후에 Staged 상태로 되어 있다.
만약 Commit Id 대신 HEAD를 입력하면 HEAD 상태로 돌린다.



5. git reset
Reset the HEAD to specific Commit
git reset [--mixed | --soft | --hard] [<commit_id>]

현재 HEAD가 가리키고 있는 상태를 특정 Commit으로 초기화한다. HEAD가 가리키고 있는 Branch도 함께 움직인다.
만일 Commit id가 입력되지 않았으면 HEAD로 간주한다.
--mixed : Default 옵션. Commit id 상태로 이동하되, 변경사항은 Unstaged, Untracked로 남겨둔다.
--soft : Commit id 상태로 이동하되, 변경사항은 Staged 상태로 남겨둔다.
--hard : Commit id 상태로 이동하고, 변경사항은 버린다.(Discard)

만약 Staged에 있는 파일을 Unstaged로 변경하고 싶으면 해당파일에 대해서 아래와 같이 하면 된다.
git reset HEAD <Filename>



6. git remote
Add the Remote Git
git remote add <name> <url>

Remote Git 대상을 추가한다. name은 Url에 대한 이름이고, Url이 Remote Git 주소이다.



7. git push
Branch Push
git push -u <remote> <local_branch>

Local Branch를 Remote 저장소에 Push하는 명령어이다.
-u 옵션(set upstream)을 주지 않아도 Push가 되지만, 안 주는 경우 push 후에 해당 branch의 remote 설정을 직접 변경해 주어야 하므로 주는게 좋다.


8. git fetch



9. git merge



10. git pull
Pull the Remote/Local Branch Commit (Fetch & Merge)
git pull

remote 혹은 local branch에 대해서 fetch 및 merge를 한다.
git pull은 git fetch + git merge의 조합이다.
옵션을 아무것도 안 주면 Local Branch의 remote의 HEAD에 대해 fetch 및 merge한다.

git pull <remote_name> <remote_branch>:<local_branch>
remote repository 의 특정 branch를 자신의 local branch로 pull하기 * 추가 테스트 필요
예) git pull origin origin/master:master


12. git stash
현재 수정 내용을 Stash 영역에 임시로 저장
만약 내가 일단 코드수정을 좀 했는데 리모트 브랜치에 커밋이 더 들어와 있어서 다시 땡겨야해서 git pull 했는데 컨플릭나서 안땡겨진다면?
git stash로 현재 Unstaged 파일을 백업하고, 다시 git pull하고, git stash pop 해서 백업 내용을 리스토어하면서 컨플릭 나는 부분 수정하면 됨.


13. git rebase
git rebase는 git merge와 비슷하게 2개의 브랜치 흐름을 합치는 개념이다.
다만, merge는 Merge Commit이 생성되고 원본 Commit 히스토리를 그대로 남겨두는 반면 git rebase는 현재의 브랜치의 Base를 Target 브랜치로 변경하는 작업이라, 새로 작성했던 Commit은 없어지고 다른 Commit Id로 재생성되서 합쳐진다.



14. git add / commit
...



15. git clean
...



16. git cherry-pick
...