빠똥빠똥
Git의 모든 것 본문
※생활코딩의 수업을 그대로 가져와서 정리했습니다.
<Git 설치>
- git-scm.com 에서 운영체제에 맞는 EXE파일 다운로드
<버전관리의 시작>
1. 버전관리를 하고자하는 디렉토리 생성, 해당 디렉토리로 위치 이동.
2. git init . -> "현재 디렉토리를 git에게 버전관리 시킨다." 는 의미의 명령어, "."은 하위 모든 디렉토리 포함.
git init -> 현재 디렉토리를 저장소로 관리한다.
3. 위의 명령어를 실행하면 ".git" 이라는 디렉토리가 생성된다. ".git"에는 ".git"의 부모디렉토리에 생성되는 문서들을 버전관리하는 정보들이 적당히 저장되고 관리된다. -> ".git"이라는 디렉토리를 지우면 모든 버전이 사라진다.
<버전 생성/조회>
1. Working tree(날 것) -> add -> Staging Area(버전만들 문서선택) -> commit -> Repository(버전저장)
2. nano hello.txt -> hello.txt라는 문서를 생성하고 내용을 수정할 수 있게 해줌. (ctrl+x : 수정종료)
3. git status -> git에게 문서의 상태가 어떤지 볼 수 있게 해주는 명령어.
4. git add 파일명 -> Working tree에서 Staging Area로 넘겨서 버전관리할 문서로 선택함.
git add . -> 현재 디렉토리 안에 있는 모든 파일을 Stage에 추가한다.
git add 디렉토리 -> 해당 디렉토리 안에 있는 모든 파일을 Stage에 추가한다.
5. git commit -m "수정제목명시" -> Staging Area에 있는 파일을 Repository로 옮겨서 버전 저장.
git commit -am "수정제목명시" -> Stage에 add 와 commit 을 동시에 진행. 단, 이 명령어는 해당 파일이 최초 add 명령어로 Stage에 추가되어 Tracked 상태여야만 사용할 수 있다.
git commit --amend -> 최근에 커밋한 수정제목을 수정할 수 있다.
git commit -> 에디터로 여러줄의 수정메시지를 작성할 수 있다. 에디터는 디폴트 설정된 에디터를 사용.
git config --global core.editor "nano"
git config --global core.editor "vim" -> 이렇게 명령어를 실행하면 기본 에디터가 원하는대로 바뀜.
6. git log -> 버전의 히스토리를 볼 수 있음.
7. 여러개의 파일을 생성/ 수정하고, git status를 확인해보면 새로 생성된 파일인지, 단지 Stage에 올라가지 않은 파일인지 확인 가능함. 만약, 협업하고 싶지 않은 파일이 있다면 Stage에 올리지 않고, Untrack File로 냅두면 된다. 여러개의 파일을 한 버전으로 관리하고 싶다면, 각각의 파일을 전부 add 명령어로 Stage 올리고, commit 하면 된다.
8. git log --stat -> Log를 보면 각각 버전에 어떤 파일이 어떻게 수정되었는지 확인할 수 없는데, 이 명령어를 통해 어떤 버전에 어떤 내용들이 Grouping 되었는지 확인할 수 있다.
9. git diff -> Stage에 올리기 전에, 수정한 내용이 어떻게 달라졌는지 보여주는 명령어. 검토의 용도.
10. git reset --hard -> 지금까지 작업한 내용이 사라지고, 이전 버전의 상태로 돌아간다.
11. git log -p -> 로그의 패치 세부 내용을 보여준다.
<버전 선택>
1. git log 를 통해 어떤 버전으로 되돌릴지 선택. 아래에 드래그된 버전으로 돌아가고 싶다면, commit 뒤에 있는 식별자를 전체 복사 한 후에, git checkout 식별자 의 형식으로 명령을 내리면 해당 버전으로 돌아간다.
2. 위 사진을 보면, 가장 최근의 commit 오른쪽에 (HEAD -> master) 라고 되어있는데, 가장 최근의 버전을 master라고 생각하면되고, 현재 그 버전을 가리키고 있다(HEAD->)는 의미이다.
3. git checkout 식별자 를 실행한 이후에 HEAD가 가리키는 위치만 해당 버전으로 바뀐 것일뿐, log에서 사라진 버전들이 지워진 것이 아니다.
4. git checkout master -> 다시 버전을 되돌리기 전의 최신상태로 돌아가고 싶다면 이 명령어를 작성하면 된다.
<버전 삭제>
1. git reset --hard 식별자 -> 식별자의 버전으로 돌아가겠다는 의미, 해당 버전 이후에 작성된 버전들과 수정중이던 내용 모두 삭제.
2. git reset --soft (or --mixed) -> 식별자의 버전으로 돌아가고, 최신 버전들은 모두 삭제하지만, 현재 작성하고 수정중이던 내용들은 살려둠.
<버전 되돌리기>
1. git revert 식별자 -> 식별자가 ver.4라면 ver.4의 내용을 ver.3로 되돌린다는 의미이다. 해당 명령어를 실행하면 ver.4의 커밋은 살아있게 냅두고, 새로운 ver.4가 커밋된다. 이 새로운 ver.4의 내용은 ver.3와 같다.
2. ver.5 까지 작성을 해놨다고 했을때, ver.1로 되돌아가고 싶다면, ver.2의 식별자를 git revert ver.2식별자 이렇게 한다고 해서 ver.1으로 되돌아가지 않는다. 이렇게 하면 충돌이 일어난다. 따라서, ver.5 -> ver.1 으로 가고싶다면, ver.5 -> ver.4 로 되돌리고, ver.4 -> ver.3로 되돌리고 ... ver.2 -> ver.1로 되돌려야 충돌이 생기지 않는다. 즉, 역순으로 revert를 해야 제대로 작성한다. 원리는, ver.2 만 revert하면, ver.1 <-> ver.2 의 차이만 원래대로 되돌리고, 이후의 ver.3, ver.4, ver.5의 내용은 그대로 유지되기때문에, ver.1의 내용을 얻을 수가 없다.
<Branch>
1. git log --all --graph --oneline -> all 옵션 : 모든 branch를 볼 수 있게 해준다.
-> graph 옵션 : 시각적으로 표현.
-> oneline 옵션 : 로그가 장황하지 않게 한 줄로 나옴.
2. git branch -> 브랜치의 목록을 보여준다.
3. git branch 브랜치명 -> 브랜치명을 가진 브랜치를 새로 생성.
4. 위 사진을 보면 HEAD가 가리키는 것이 master고, 그 위 콘솔을 보면, master앞에 *이 붙어있는 것을 볼 수 있다. 즉, 현재 우리가 master에 속해있는 상태다라는 의미.
5. git checkout 브랜치명 -> 해당 브랜치가 있던 버전으로 돌아가고, HEAD가 해당 브랜치를 가리킴. 브랜치 전환.
- apple 브랜치에 새로운 커밋을 하면,
- apple 브랜치에 새로 커밋한 work 4와 master 브랜치에서 커밋한 work 4 모두 부모는 ms와 google이 있는 work 3.
<Merge>
1. 합치려는 브랜치의 공통의 조상을 Base 라고 한다.
2. 합쳐진 commit을 merge commit 이라 한다.
[서로 다른 파일 병합]
3. git merge 브랜치명 -> 현재 위치한 브랜치에 merge 명령어 뒤에 작성한 브랜치의 버전을 가져와서 병합하고, 새로운 버전으로 생성.
4. git reset --hard 브랜치버전 -> 병합 이전의 상태로 되돌아간다. 물론, 병합된 버전은 삭제된다.
[ 같은 파일, 다른 부분 병합 ]
5. 같은 파일의 다른 부분을 각각 수정하고, 병합하면 각각의 수정사항이 모두 병합된 파일에 적용되어 나타난다. 예를들어, ms work1에서 test.txt의 내용이 "yes NO" 이고, google work1에서 test.txt의 내용이 "YES no" 라면, 그리고 가장 최근에 변경한 내용이 소문자->대문자 라면, 병합 이후의 test.txt 파일에는 "YES NO"가 저장된다. 최신의 수정상태를 모두 반영하는 것이다.
[ 같은 파일, 같은 부분 병합 ]
6. 같은 파일의 같은 부분을 각각 수정하고, 병합하려 한다면 CONFLICT 가 뜨면서, 어느 부분이 충돌이 일어났는지 사용자에게 명시해주고, 바로 수정할 수 있도록 해준다. 수정을 완료했다면, 다시 add 와 commit 을 해주면 버전등록이 완료된다.
[ 3 way merge ]
<원격저장소와 연결>
1. git remote add 원격저장소별명 원격저장소주소 -> 원격저장소와 지역저장소를 연결하는 명령어, 별명은 보통 origin으로 한다.
2. git remote -v -> 원격저장소의 별명과 주소를 보여준다.
3. git push -> 원격저장소로 버전들 push, 처음에만 다른 명령어를 입력해야하는데, 그건 기본적인 저장소 설정을 해당 원격저장소로 할것인지 설정하는 것.
4. git clone 저장소URL DIR -> 저장소의 HTTPS clone 버튼으로 URL을 가져와서 붙임, DIR은 현재 디렉토리 말고 다른 디렉토리에 저장하고 싶은 경우, DIR위치에 디렉토리를 작성하면 된다.
5. git pull -> 원격 저장소로부터 버전을 다운받을 수 있음.
6. 만약 a라는 사람이 push한 상태에서, b가 pull하지 않고, 또 push를 하면, git은 a라는 사람이 이미 올려놓은 코드가 있다. pull을 먼저하고, 확인 후에 push해달라는 메시지를 띄운다. push 충돌을 방지해주면서, 협업자간에 원활한 소통을 하게 해주는 기능도 한다.
7. git fetch -> git merge FETCH_HEAD -> commit -> push는 git pull -> commit -> push 와 동일한 작업을 수행.