명령어&실습14_reset
아래 reset명령어의 차이점
> git reset --soft
> git reset --mixed
> git reset --hard



명령어&실습15_merge방식
git은 3way merge방식으로 처리해야할 중첩부분을 최소화한다.(아래 빨간?부분만 처리하면됨)




명령어&실습16_Remote Repository(원격저장소)개념&실습
local repository(지역 저장소) < - > Remote Repository(원격 저장소)
원격저장소의 큰 의미 2가지: 백업, 협업
프로젝트가 커질수록 중요한 개념.
만약 혼자하는 프로젝트라면 원격저장소를 쓸 필요 없음.

Git Bash 열기
> cd c:/developGit

git 프로젝트 이동


> git init local
local 이란 프로젝트(폴더)생성하고, git 시작


> cd local
local 폴더로 이동


> ls -al
local 폴더내용 확인


> vim f1.txt
insert키 누름
a 입력
esc키 누름
:wq


> git add f1.txt
f1.txt를 staged 시킴


> git commit -m 1
메세지 1과 함께 commit하기


> cd ..
상위폴더로 올라가기



> git init --bare remote
remote(원격저장소)라는 프로젝트(폴더)만들기
--bare 쓰기가 불가능하게 하는 옵션
수정 등의 작업불가능한 저장소로의 역할만 하도록 설정하는 것임.
원격저장소의 특성상 수정권한이 있으면 안되기에 이렇게 설정


> cd remote
remote 폴더로 이동


> ls -al
remote폴더내에 --bare 방식의 git init하면 생성되는 기본폴더들을 볼수 있음.


이제 원격저장소가 생겼기에, 다시 local 폴더로 이동하여, 원격저장소로 push 해보자!
> cd ..
> cd local


> pwd
현재 경로를 확인하기. remote프로젝트의 경로를 확인하기 위함.
remote 폴더의 경로는 /c/developGit/remote임을 확인


> git remote add origin /c/developGit/remote
최초 설정시 remote 저장소를 등록해주어야함.
remote의 옵션으로 add가 있음.
'/c/developGit/remote'는 경로를 가리킴.
origin은 해당경로를 네이밍하는 것으로 별칭이라고 볼수 있음.
즉, 이렇게 설정해두면, local의 'master' branch는 앞으로 git push를 하게 될경우 remote 저장소인 origin('/c/developGit/remote')로 이동하게됨.


참고사항
> git remote remove 닉네임.
등록한 연결된 원격저장소를 없앨수 있음.

> git push --set-upstream origin master
최초 설정시에 upstream 방식을 setting 해주어야함.
origin 원격저장소의 'master' branch로 push함을 뜻함.




명령어&실습17_GitHub회원가입
git이란 분산버전관리 툴을 사용하는 프로젝트를 지원하는 웹서비스.
가장 인기있는 오픈소스 코드 저장소이기도 함.
이러한 오픈소스 코드 저장소를 원격저장소로 사용하기 위해서 github을 알아야함!

1.github 계정-회원가입
sign up for GitHub클릭 또는 Sign up 클릭


Step1내용을 기재 -> Create an account 클릭


Step2 무료사용클릭 -> Continue 클릭


Step3 내용 선택 -> Submit 클릭



아래 화면이 나옮.
하지만, Start a project를 누르면 진행이 안됨.
이메일 인증부터 해야함.
등록했던 이메일로 들어가서 인증확인을 클릭 -> 다시 아래 화면에서 Start a project


2.github 기본 화면 설명




명령어&실습18_GitHub의 git / git 오픈소스 활용 fork 해보기
 github 사이트 들어가기 -> 'git' 키워드 검색


git / git 프로젝트 클릭



공부하고 있는 git도 마찬가지로 오픈소스프로젝트임.
아래 그림이 바로 git의 오픈소스 내용임.
-프로젝트 소스코드
- commit


watch: 이 프로젝트의 진행상황을 볼수 있는 사람 수
star: 좋아요를 누른 사람의 수
Fork: 복제버튼. 해당 프로젝트를 fork를 누른 개발자가 복제하여 가져갈수 있음.
fork의 개수가 높다는 것은 이것을 가지고, 개발한 것들이 많다는 것을 뜻함.

commits:지금까지의 commits 개수
branches: 지금까지의 branch 개수, 현황
contributors: 1145명의 기여자들


contributors(기여자)가 아니여도, 해당 프로젝트를 fork 할수 있음.
Github에서 Fork를 하게되면, github계정 / fork한 프로젝트명 으로 repository가 fork한 사람의 계정아래로 생성되게됨.
나중에, fork한 개발자가 작업해당 프로젝트를 좀더 나은 방향으로 수정후, commit한 다음 push/pull request를 git 프로젝트 관리자에게 요청할수 잇게됨.



github 사이트 들어가기 -> 'git' 키워드 검색


git / git 프로젝트 클릭



공부하고 있는 git도 마찬가지로 오픈소스프로젝트임.
아래 그림이 바로 git의 오픈소스 내용임.


watch: 이 프로젝트의 진행상황을 볼수 있는 사람 수
star: 좋아요를 누른 사람의 수
Fork: 복제버튼. 해당 프로젝트를 fork를 누른 개발자가 복제하여 가져갈수 있음.
fork의 개수가 높다는 것은 이것을 가지고, 개발한 것들이 많다는 것을 뜻함.

commits:지금까지의 commits 개수
branches: 지금까지의 branch 개수, 현황
contributors: 1145명의 기여자들






명령어&실습19_GitHub의 git / git 오픈소스 활용 Clone 해보기
 github 사이트 들어가기 -> 'git' 키워드 검색


git / git 프로젝트 클릭




Clone or download 클릭



Clone with HTTPS의 경로 복사



> cd c:/developGit
git 실습할 상위 프로젝트로 이동


> mkdir gitsrc
gitsrc폴더(프로젝트)를 생성
> cd gitsrc
gitsrc폴더로 이동


해당 폴더에 https://github.com/git/git.git 원격저장소의 git 프로젝트를 다운받아서 git버전관리 시작을 뜻함.
추가 설명:
git 을 치면 나오는 메뉴얼에는 프로젝트 시작하는 2가지 방식이 나옮.(git init / git clone)

- git init방식: 로컬에서 작업한 것을 git을 이용하여 버전관리할고자 할때
- git clone 방식: 원격저장소의 자료를 다운받아서 설치후 git을 이용하여 버전관리할고자 할때


> ls -al
> cd git
> ls -al
gitsrc프로젝트 아래 git폴더가 생성된것을 확인할수 있음.
git 폴더아래에 git프로젝트관련 내용들이 생성된것을 확인할 수 있음.


> git log --reverse
log기록을 거꾸로 볼수 있음.
리누스 토발즈님의 최초 commit을 확인할 수 있음.
from hell....


> git checkout e83c5163316f89bfbde7d9ab23ca2e25604af290
최초의 commit으로 업데이트
> git log
log 내용이 최초 commit 한개밖에 없음을 확인


> ls -al
최초 프로젝트 commit 할 당시의 구조는 단순하였다는 것을 확인 가능






명령어&실습20_GitHub저장소 만들기
github 사이트 접속 -> 로그인 -> start project 클릭


저장소 이름, 설명, public(공개/무료)선택, ReadMe.md 파일생성여부 체크 -> Create repository 클릭

아래의 원격저장소가 생성됨.

그다음 로컬로 이동하여 git bash 열기

> cd ..
> mkdir repotest
c:/developgit/repotest라는 프로젝트 생성
> cd repotest
repotest로 이동
> git init
repotest에 git을 시작
> vim f1.txt
a를 입력한 f1.txt를 만들기
> git add f1.txt
f1.txt staged 시키기
> git commit -m '1'
메세지 1과 함께 commit하기


잠깐 설명 push와 pull은 어떤 것을 기준으로 생각해야하까?
push와 pull의 개념은 로컬/원격저장소의 유무와 상관없이, 현재 사용자가 장소하는 곳을 기준으로 push, pull 한다고 생각하면됨.
ex) local에서 작업하는 사람이 원격저장소로 upload하고 싶을때는 push   <=> 원격저장소에서 작업하는 관리자입장에서 원격저장소로 가지고 올때는 pull

> git remote
현재의 remote로 등록된 원격저장소를 보여주는 명령어이지만, 현재 등록된 원격저장소가 없음.


이제 github 사이트에서 만들었던 원격저장소를 등록하자.
origin이라는 명칭으로 등록하게됨.
https~는 원격저장소의 위치를 의미

> git remote -v
remote 확인을 해보면 등록되어진것을 확인할 수 있음


원격저장소는 여러개를 등록할 수도 있고, 지울수도 있음.
origin2 라는 원격저장소를 등록함.


> git remote -v
remote에 origin, origin2가 등록되어있음을 확인할 수 있음.


> git remote remove origin2
origin2를 지울수도 있음


> git remote -v
확인한 결과 지워진것을 확인할 수 있음


> git push -u origin master
로컬저장소를 기준으로 봤을때, 로컬에서 원격저장소의 'master' branch로 push한다는 것을 설정하는 것을 뜻함.(로컬 -> 원격)

만약에 계정 아이디, 이메일, ssh가 현재 이프로젝트를 만든 사람 즉 'FROMHANBIT'이 아닐경우, 원격저자아소에 접속하고 자하는 계정을 Collaborator로 등록해주어야함.
아래 그림처럼 github의 설정 이동 -> Collaborators등록 -> 초대하고자하는 사람 이메일 또는 아이디 입력 -> add collaborator 클릭 -> Copy invite link 클릭 -> 링크url 복사후 초대하고자하는 사람에게 보내기


초대받는 사람은 보내준 url을 브라우저에 입력해서 이동하면 아래의 화면 -> accept invitation 
이로써, FROMHANBIT계정을 가진 관리자가 가지고 있는 repositorytest라는 원격저장소에 koreacoderider라는 사람도 접속할 수 있음.


다시 git bash로 이동(헷갈릴까봐 다시 기재. 현재의 로컬사용자의 아이디는 koreacoderider라는 사람임)
> git push -u origin master
origin 원격서버의 'master' branch에 이제 방금 작업하고 commit한 repositorytest 작업방의 commit 1이 push 되었음.



실제 Github사이트의 repositorytest 원격서버에 1개의 commit과 f1.txt가 올라와 있음을 확인할 수 있음.




이제부터는 github에서 제공하는 원격저장소('repositorytest')를 이용하여 언제 어디서든 백업이 가능함.




명령어&실습21_git config
git config를 통해서 계정관련 정보들을 입력 확인할 수 있음.
git을 실행할때, 최초에 하는 거지만, remote관련 기능을 보낼때, 계정때문에 push, pull이 안될수가 있기에, 확인을 위해 필요
프로젝트별로 config가 있고, 전체 global config가 있음

> git config --global --list
글로벌 config(설정)을 확인가능

> git config --global user.name "사용자아이디"
글로벌 사용자 아이디 등록

> git config --global user.email "사용자이메일"
글로벌 사용자 이메일 등록


> git config --list
해당 프로젝트의 config(설정)을 확인가능

> git config user.name "사용자아이디"
해당 프로젝트 사용자 아이디 등록

> git config user.email "사용자이메일"
해당 프로젝트 사용자 이메일 등록




명령어&실습22_원격저장소이용 협업 
협업 tip: 협업하는 프로젝트를 진행하고자 할때, 항상 원격저장소로부터 pull을 한다음에 작업을 시작할 것!!
위의 설정을 다 할수 있다는 전제로 이제부터는 github에서 제공하는 원격저장소를 이용 프로젝트를 로컬에 동기화 할수 있음
> git pull

코드 변경 작업진행 -> 저장

> git add 변경된 파일명

> git commit -m 'commit메세지'

> git push




명령어&실습23_SSH 이용 원격저장소 활용
Secure Shell을 줄여서 SSH라고 함.
장점: 로그인하지 않고도 이용할수 있음.
git bash를 열기
> ssh-keygen
ssh 생성
엔터
엔터
엔터


c/Users/ALEXKIM/.ssh/ 로 이동하면,
id_rsa와 id_rsa.pub가 생성됨을 확인할수 있음.


id_rsa는 private key, id_rsa.pub는 public key임


생성된 publickey를 원격저장소에 저장하게되면, 로그인 여부 없이 작업이 가능



원격저장소를 github을 쓰고 있으므로, github을 열어서 public key를 등록하자.
>cat id_rsa.pub
만들어진 ssh키값을 선택 복사하기


github 사이트 접속 -> 로그인 -> settings -> SSH and GPG keys -> New SSH key 클릭 -> title 넣기, 복사한 public 키값을 넣기 -> add SSH key 누르기



이미 만들어둔 repository로 이동 -> clone or download 클릭 -> use ssh 클릭 -> 경로 복사하기


> cd cd:/developGit
> git clone git@github.com:koreacoderider/coderiderweb.git gitsshtest
git 프로젝트를 만들어줄 경로로 이동하기
방금 복사한 경로를 git clone 다음에 넣기, 만들어질 프로젝트명 넣기
이렇게 하면, 노트북으로 원격저장소의 데이터를 가져오기
정말 다운 받을 건지 묻는데, yes를 클릭하기


> cd gitsshtest
> ls -al

제대로 clone이 설치되었다면, 미리 만들어둔 README.md가 있음을 확인할 수 있음.

> cat README.md
> vim README.md
README.md 파일에 있는 내요이 "# coderiderweb"인데, 여기에 ssh success를 추가하기



> git add README.md
> git commit -m 'sshtest'
> git log
> git push
수정된 README.md파일을 staged 시키고 로그기록확인 후 push하기
정상적으로 ssh인증이 이루어진다면, push가 성공할 것임.


원격저장소(github)에 push가 제대로 이루어졌음을 확인할 수 있음.






명령어&실습24_프로젝트관리방법 크게 3가지
중앙집중식 워크플로, Integration-Manager 워크플로, Dictator and Lieutenants 워크플로
중앙집중식 워크플로

변경사항을 모두 중앙저장소에 집중해서 작업.
개발팀이 작거나 이미 중앙집중식에 적응한 상황이라면 이러한 워크플로에 따라 일하면 됨.
중앙 저장소를 만들고, 모든 개발자에게 push권한을 부여.
각자가 작업을 하기전에 pull을 먼저하기
같은 부분을 수정한다고 하더라도, 먼저 push한사람과 충돌이 생긴 뒤에 push한사람이 merge하여 push하게 하기



Integration-Manager 워크플로

여러개의 저장소를 운영할때 쓰는 워크플로우
주로 github, gitlab에서 사용하는 방식(프로젝트를 fork, 수정, pull요청)
관리자이외의 개발자는 읽기만 가능. 관리자만 쓰기가 가능한 원격저장소
일반개발자의 역할
로컬에 원격저장소 프로젝트 clone -> 추가 작업 진행 -> commit -> 일반개발자의 저장소에 push -> 관리자에게 자신의 저장소의 내용을 pull 요청
통합관리자의 역할
요청받은 일반개발자의 저장소를 리모트 저장소로 등록 -> 자신의 로컬에서 테스트 -> 로컬 git작업방의 메인 브랜치에 merge -> 메인원격저장소에 push



Dictator and Lieutenants 워크플로

저장소를 여러개 운영하는 방식을 변형.
수백명의 개발자가 참여하는 아주 큰 프로젝트를 운영할때 사용 ex) Linux 커널 프로젝트
dictator 밑에 lieutenants가 있고, lieutenants 밑에 개발자들이 있음.
일반개발자의 역할
최상위 원격저장소의 master 브랜치를 기준으로 자신의 토픽 브랜치를 Rebase
코드 수정
lieutenants의 역할
일반개발자들의 작업한 내용들의 자신이 관리하는 저장소의 master 브랜치에 merge
Dictator의 역할
lieutenants들의 저장소의 master 브랜치에 merge된 내용을 확인하고 자신의 로컬 작업 메인 브랜치에 merge -> 최상위 원격저장소의 master 브랜치에 push





명령어&실습25_github웹호스팅서비스활용 개인사이트 만들기
ex) bootstrap 사이트가 대표적인 github에서 제공하는 웹호스팅을 활용한 예임.
이용 무료도메인 제공사이트: http://www.freenom.com/en/index.html?lang=en

먼저 자신이 가지고 있는 github계정의 repository에 들어가자.
settings 누르기


Github Pages 라는 영역의 Source none를 클릭해서 master branch클릭후 save




아래 url이 생성됨.



를 클릭해서 들어가면, 사이트가 연결된 것을 확인할 수 있음



또한, 보유한 도메인이 있다고 한다면, 아래 화면상의 Custom domain에 입력후 save하면, 해당 도메인에 github repository가 연동이 됨.



아래 화면에서 확인할 수 있듯이,
192.30.252.153
또는
192.30.252.154
를 도메인 제공사이트에 a record 등록하는 부분에 기재하고 저장하기




정리하면, 아래와 같음.






명령어&실습26_gitignore

gitignore란?: 원격저장소에 push 할때, 올리고 싶지 않은 파일 또는 폴더는 .gitignore에 기재를 하여서 push가 되지 않게 하는것. 
.gitignore라는 메모장을 만들어서, 거기에 기재를 하면됨.

뭘 무시해야할지 모르겠다면, 아래사이트에서 사용하는 프레임웤에 맞는 내용을 검색하면, ignore할 부분을 알려줌.







명령어&실습27_Rebase
일종의 merge라고 볼수 있지만, 조금 다름.
초보자는 사용하지 말것.

차이점을 아래 그림으로 알아봄
Merge방식


마스터의 내용을 feature라는 이름의 branch로 만드는 명령어: git checkout feature
마스터와 feature 브랜치를 합치는 명령어: git merge master




Rebase방식








> git checkout feature
마스터의 내용을 feature라는 이름의 branch로 만드는 명령어
> git rebase master
가상의 공간의 temp에 feature의 내용을 저장후, feature브랜치 지움.
그 다음 마스터에 feature 브랜치의 내용이 추가됨.
브랜치의 분기점이 사라짐.




실습
먼저: developGit 폴더 밑에 rebase_test폴더 만들기

> cd c:/developGit/rebase_test
rebase_test라는 폴더(작업방)으로 이동하기


> git init
git 프로젝트 시작


> vim f1.txt
f1.txt 파일 만들기
insert키 누르기
a 입력
esc키 누르기
:wq


> git add f1.txt
f1.txt staged 상태로 만들기


> git commit -m 1
1이라는 메세지와 함께 commit하기


> git checkout -b rb
rb라는 브랜치 생성 및 브랜치 이동


> git log --decorate --all --oneline --graph
진행상황 확인



> vim re.txt
re.txt 파일 만들기
insert키 누르기
a 입력
esc키 누르기
:wq


> git add re.txt
re.txt 파일 staged 시키기


> git commit -m 'R1'
'R1' 메세지와 함께 commit하기


> git log --decorate --all --oneline --graph
진행상황 확인


> vim re.txt
re.txt 수정하기
insert키 입력
b추가
esc키 입력
:wq


> git commit -am 'R2'
자동 staged 시키고, 'R2'라는 메세지와 함께 commit 하기



> git log --decorate --all --oneline --graph
진행상황 확인


똑같은 방식으로, master브랜치로 이동
> git checkout master
> vim master.txt
insert키 입력
a추가
esc키 입력
:wq
> git add master.txt
> git commit -m M1


> git log --decorate --all --oneline --graph
진행상황 확인


master.txt 수정하여 b추가
'M2' 메세지로 commit 하기
> vim master.txt
> git commit -am M2




Rebase해보기
이상황부터 rebase를 하면 바뀌는 변화를 볼수 있음
> git checkout rb
> git rebase master


> git log --decorate --all --oneline --graph
진행상황 확인


'master' branh로 이동해서 rb라는 브랜치를 merge시키기
> git checkout master
> git merge rb


> git log --decorate --all --oneline --graph
진행상황 확인





Rebase 충돌이 일어났을때(conflict) 해결하기
현재 작업방 지워서 초기화하기

> git init
다시 생성한 작업방(rebase_test)에 git 프로젝트 시작하기


> vim f1.txt
f1.txt 파일 만들기
insert키 누르기
a 입력
esc키 누르기
:wq


> git add f1.txt
> git commit -m 1


> git checkout -b rb
'rb' 라는 branch 생성 및 이동



> vim f1.txt
f1.txt 수정
R1 추가
esc키 누르기
:wq

> git commit -am R1


> git checkout master

마스터 브랜치고 이동하기

> vim f1.txt
f1.txt 수정
M1 추가
esc키 누르기
:wq

> git commit -am M1


> git checkout rb
'rb' branch로 다시 이동하기


> vim f1.txt
f1.txt 수정
R2 추가
esc키 누르기
:wq

> git commit -am R2


> vim f1.txt
f1.txt 수정
R3 추가
esc키 누르기
:wq

> git commit -am R3


> git log --decorate --all --oneline --graph
현재 로그 상태



위 상황에서, Rebase 충돌이 일어날수 있음.
rebase를 하게되면 같은 파일의 같은 위치에 내용이 conflict나게됨.

> git rebase master
> git status
rebase를 했지만, f1.txt 파일의 2번째열에 충돌이 일어남.



> vim f1.txt
충돌의 원인인 f1.txt열어보기


열어본 파일의 충돌내용은 아래와 같음.


충돌내용을 아래와 같게 고쳐주기
esc키 누르기
:wq


> git add f1.txt
> git status
f1.txt의 변경된 내용을 staged 시키기
그다음 진행상태를 살펴보면, git rebase --continue를 통해서, rebase를 계속 진행할수 있음을 확인 


> git rebase --continue
> git status
다시 rebase를 했지만, 충돌이 일어났다는 것을 확인할 수 있음.


> git log --decorate --all --oneline --graph
현재 로그 상태
R1까지는 rebase가 되었음을 확인할 수 있음


> vim f1.txt
f1.txt 충돌내용 확인해보면 아래와 같음


수정하기
esc키 누르기
:wq


> git add f1.txt
> git status
f1.txt를 staged 시켰으며, rebase 진행 가능함 확인할수 있음.


> git rebase --continue
다시 충돌이 발생함을 확인할 수 있음


> git log --decorate --all --oneline --graph
현재 로그 상태
R2까지는 rebase가 되었음을 확인할 수 있음


> vim f1.txt
f1.txt 의 충돌내용 확인



수정
esc키 누르기
:wq


> git add f1.txt
> git rebase --continue
> git log --decorate --all --oneline --graph
현재 로그 상태를 통해서 보면, rebase가 R3까지 완료된 것을 확인할 수 있음.
가지치기 없이 1줄에 rb가 master에 섞이게 됨을 확인할수 있음






명령어&실습9_branch만들기
정리&요약
git의 branch는 버전관리시스템들보다 간편함.

정리&요약
branch를 해야할 때의 예시(아래): 원소스를 변경하거나 더럽히지 않고, 개발을 하고자 할때
- 고객이 특정기능을 커스터마이징 요구할때, 원소스를 유지하고 추가된 소스들과는 별개로 보관하고 싶을때,
- 불필요하다고 판단되는 기능들을 고객이 요구할때, 원소스를 유지하고 작업을하면, 나중에 그 부분을 지울수 있음
- 메인되는 작업과 테스트만을 위한 작업을 구분해서 작업하고자 할때,

정리&요약
branch는 branch할 때의 시점의 모든 기록을 같이 공유한다.


실습
새로 작업폴더 만듦.
C:\developGit\branch_test

git bash 열기

cd C:/developGit/branch_test
해당경로 이동


> git init


f1.txt파일을 만들고, a입력
> vim f1.txt
insert
a 입력
esc 누르고
:wq


> git add f1.txt


> git commit -m "1"


> vim f1.txt
insert
b 입력
esc 누르고
:wq


> git commit -am "2"
리&요약
git commit -a
유의할점: commit을 한번도 제대로 하지 않는 경우, -a가 먹히지 않음.


> git branch
현재의 branch들 상태보기

정리&요약1
*표시가 되어있음.
의미: 표시된 branch를 사용하게 됨.

정리&요약2
master의 의미
git을 처음 사용하는 순간부터 기본branch를 사용하게됨.
그 branch의 이름이 "master"


> git branch exp
"exp"라는 branch 만들기


> git branch
현재의 branch들 상태보기
exp 브랜치가 생성됨을 확인할 수 있음.


> git checkout exp
"master"에서 "exp" branch를 사용


> git branch
"exp" branch를 사용하고 있음을 확인


> git log
"exp"의 git log기록이 "master"의 로그기록이 같음을 확인할수 있음.
branch한 시점에서의 "master" branch의 log를 같이 갖게됨.


> vim f1.txt
insert 누르기
c 추가입력
esc 누르기
:wq
f1.txt를 수정 "c"를 추가입력


> git add f1.txt


> git commit -m "3"
"3"이름으로 commit하기


> git log
"exp" branch의 commit이 추가됨을 확인할수 있음



> git checkout master
"exp" 에서 "master" branch 바꿈.


> git log
"master" branch 에서의 commit 기록을 볼수 있음.
3번 commit이 없음을 확인할 수 있음.



> cat f1.txt
f1.txt에 입력한 c도 없음을 확인할 수 있음

> git checkout exp
다시 "exp" branch로 이동

> vim f2.txt
f2.txt 파일을 "exp" branch에 만들어둚.

> git add f2.txt
f2.txt를 추가함.
insert키 누름
a 입력
esc 누름
:wq

> git commit -m "4"
4번으로 commit

실제 폴더에 있는 파일에 "f2.txt" 가 있음을 확인할 수 있음(현재 branch "exp")

> git checkout "master"
f2.txt파일이 사라진 것을 확인할 수 있음.
"master" branch에서 commit한 내용에는 f2.txt가 없기때문

> git checkout "exp"
f2.txt가 생겨나는 것을 확인할 수 있음.


명령어&실습10_branch 정보 확인

> git log -- branches --decorate
작업중인 branch 이외의 기록까지 볼 수 있음.
(master)라는 의미:
commit2까지가 master라는  branch의 commit 기록임
(HEAD -> exp)의미
exp라는 branch를 현재 작업중



> git log --branches --decorate --graph
좀더 그래픽화하여 보여줌.
현재는 분기점에서의 확연한 차이점이 없어서 1줄로 표기됨.



확실한 차이점을 만들기 위해서 "master"로 이동
f3.txt를 만들어줌.
> git checkout "master"


> vim f3.txt
insert 누름
a 입력
esc 누름
:wq


> git add f3.txt


> git commit -m "5"
5라는 메세지와 함께 commit


> git log
"master" branch의 기록을 확인


> git log --branches --decorate --graph
이제 2번 commit을 기준으로 분기점이 확실히 나누어지는 것을 확인할 수 있음



> git log --branches --decorate --graph --oneline
좀더 짧게 확인할 수 있음


> git log master..exp
master를 기준으로 exp의 차이점은 뭔지 확인할 수 있음


> git log exp..master
exp를 기준으로 master의 차이점을 확인할 수 있음


> git diff master..exp
master를 기준으로 exp의 차이점을 상세하게 확인할 수 있음






명령어&실습11_branch 병합(merge)
현재 branch는 master

> git merge exp
exp를 master로 merge함

esc키 누름
:wq


> git log --branches --decorate --graph --oneline
아래 사진에서처럼 exp가 master쪽으로 합쳐진 것을 확인할 수 있음


> ls -al
폴더에서도 f2.txt가 추가되어서 늘어난것을 확인할 수 있음


master를 exp로 가져오고 싶다.
> git checkout exp
"exp" branch로 이동

> git merge master
master가 exp쪽으로 merge하기


git log --branches --decorate --graph --oneline
branch "exp"도 5번 commit을 가지게됨을 확인 할 수 있음.
exp와 master는 현재 똑같음을 확인할 수 있음을 확인 할 수 있음


> git checkout master
"master" branch 이동


> git branch -d exp
"exp" branch 삭제하기


git log --branches --decorate --graph --oneline
삭제 됨을 확인할 수 있음




명령어&실습12_merge하면서 겪는것들(fast-forward, recursive' strategy)
merge를 했을때, 겪는것들
- fast-forward: commit을 할 필요없이 바로 merge
Merge made by the 'recursive' strategy: commit을 한 다음에 하는 merge

git의 공식 메뉴얼(한국어 선택하기)




3.2 Git 브랜치 - 브랜치와 Merge 의 기초
에 나와 있는 글

위와 같은 commit 히스토리가 있다고 했을때,

> git checkout -b iss53
Switched to a new branch "iss53"
iss 53이라는 브랜치를 생성하고 'master'에서 'iss53'으로 이동(git branch iss53 과 git checkout iss53을 줄여놓은 말)



> vim index.html
> git commit -a -m 'added a new footer [issue 53]'
index.html 파일을 생성
'added a new footer [issue 53]'로 commit


git checkout master
Switched to branch 'master'
'master' branch로 이동

이때, master에서 갑자기 branch 'hotfix'를 만들고 작업을 하게됨.
> git checkout -b hotfix
Switched to a new branch 'hotfix'
'hotfix'라는 branch를 생성하고 이동
> vim index.html
> git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address
1 file changed, 2 insertions(+)
index.html 파일생성하고
'fixed the broken email address' 메세지와 함께 commit


$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)

hotfix를 master쪽으로 merge시킴.
이때 실제로는 master 와 hotfix가 merge가 일어나는것이아니라, hotfix쪽으로 merge point가 이동하는것이 됨.
이것을 fast forward라고 부름.

> git branch -d hotfix
Deleted branch hotfix (3a0874c).
'hotfix'  branch 지우기


다시 iss53으로 돌아가기
> git checkout iss53
Switched to branch "iss53"
> vim index.html
> git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)
index.html 만들고, 'finished the new footer [issue 53]' 메세지로 commit


$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
README | 1 +
1 file changed, 1 insertion(+)


최종 결과







명령어&실습13_conflict해결
git bash를 연다.

> cd C:/developGit/practice2
새 작업폴더로 이동


> git init
git 시작을 알림


> vim function.txt
con.txt를 만들어서
insert키 누름
function a() {
}
입력
esc키 누름
:wq

> git add function.txt


> git commit -m '1'


> git branch contest
'contest'라는 branch를 만듦.


> git checkout contest
'contest' branch로 이동


> vim function.txt
insert키 누름

function c(){}를 function a(){} 아래에 기재
esc키 누름
:wq


> git commit -am '2'
'2'라는 메세지로 commit하기


> git checkout master
'master' branch로 이동


> vim function.txt

insert키 누름
function a(){}위에
fucntion b(){}를 기재
esc키 누름
:wq


> git commit -am '3'
방금 바꾼 파일 function.txt를 '3' 메세지와 함께 commit하기


> git merge contest

master를 기준으로 'contest' branch의 내용이 merge됨.
아래와 같은 merge관련 메세지 입력창이 나옮.
입력하지 않아도됨.
esc키 누름
:q


> cat function.txt
파일내용이 function a(){}를 기준으로 위, 아래에 b, c가 추가되었음을 알수 있음.(conflict가 없었음)




그렇다면, 같은 자리, 영역에 수정이 일어나고, 이것을 합치게된다면? conflict가 일어나게됨.
> vim function.txt

insert키 누름
a함수의 매개변수 자리에 con1추가
esc키 누름
:wq

> git commit -am '4'


> git checkout contest
'contest' branch로 이동


> vim function.txt
insert키 누름
아래와 같이 수정
esc키 누름
:wq


> git commit -am '5'
'5'라는 메세지와 함께 commit


> git checkout master
'master' branch로 이동


> cat funtion.txt
 ch

> git merge contest
같은 분기점에서 시작한 내용중에서 같은 영역의 내용이 다르게 바뀌었을때 아래와 같이 충돌이 일어나게됨.
이때는 사용자가 일일이 하나씩 보고 맞는것을 수정&저장해야만 merge가 제대로 끝남.


> cat function.txt
아래와 같이 합쳐져있음.
이것을 올바로 수정한다음 저장후, commit해야함.
======== 을 기준으로 현재 브랜치내용(<<<<<아래), contest브랜치내용(>>>>>>위)가 상이한 부분임.


> vim function.txt
insert키 누름
아래와 같이 고침
esc키 누름
:wq


> git commit -am 'complete'


정상적으로 conflict를 해결하고 commit하게됨.





명령어&실습13_stash(숨겨두기)
작업중인 branch에서 commit을 할수없는데, 다른 branch로 이동해서 작업을 해야할때, 쓰는 기능
잠깐 기록해서 멈춰두고, 다른 작업 가능
그러나, branch를 활발하게 사용하지 않으면 사용빈도가 낮음.
git stash는 최소한 버전관리가 되고 있는(tracked) 것에만 적용이됨.

WIP: Working In Process(작업중인게 저장되었다라는 의미)
stash의 list안에 저장된 내용은 삭제하지 않는한, 항상 살아있음.

stash 옵션명령 종류


실습
cd C:/developGit/practice3
practice3프로젝트로 이동


> git init


> vim f1.txt
f1.txt를 만들어 a입력, 저장


> git add f1.txt



> git commit -m '1'
'1' 메세지와 함께 commit


> git checkout -b stashtest
'stashtest' 라는 branch로 이동


> vim f1.txt
f1.txt에 b라는 내용을 수정기재 


> git status
파일이 변경되었으며, 아직 staged 상태가 아니라는 것을 알수있음


이때, 갑자기 다른 브랜치로 가서 일을 해야하는데, commit하기에는 확신할수 없음.
이런경우 stash를 사용함. 즉, commit전의 변경된 내용을 저장할수 있음

> git stash --help
stash관련 추가 옵션명령어들을 볼 수 있음.

> git stash
방금 수정된 내용이 stash 기록으로 남고, 수정되지 않은 상태로 바뀜.


> git status
수정이력이 없음을 확인할 수 있음


> git stash apply
stash에 저장해둔 최근 기록을 다시 적용함


> git stash list
stash 리스트를 볼수 있음.
아래 1개가 기록되어 있음을 볼수 있음.


> git reset --hard HEAD
기록은 없어지지만, stash 리스트는 남아 있음.


> git stash list
stash는 남아 있음을 볼수 있음.


> git stash drop
stash 최근 기록 삭제


> git stash apply; git stash drop;
최근 stash 를 적용하고 stash 지우기


> git stash list
stash 리스트에 남아 있는게 없음을 볼수 있음.


> git stash pop
git stash apply; git stash drop;과 같은 기능



f1.txt는 한번 commit된적이 있어서 tracked 되고 있음.
이상황에서 f1.txt를 수정하고, f2.txt는 새로 만들어보자.
> vim f1.txt
> vim f2.txt 


> git status
아래와 같이 나옮. (f1.txt는 한번이라도 git add 된적이 있지만, f2.txt는 한번도 git add된적이 없음을 확인가능)



> git stash
이때, stash를 해주기


> git status
stash에는 한번이라도 git add되었었던 f1.txt의 변경내용만 stash에 저장이되고, f2.txt내용은 stash에 기록이 안됨 확인.


아래 글을 읽을 때 참고할것!

> 은 콘솔창을 뜻하는 것으로 별의미 없는 것!

버전관리시스템
대표적인 것
CVS, SVN, GIT


윈도우에 git 설치
위 사이트로 가서 설치파일다운
기본값, NEXT.....
설치가 완료됨

윈도우 -> 검색-> GITBASH가 나오면 설치가 완료된 것임.
GITBASH는 리눅스계통의 명령어가 윈도우 OS에서 사용가능할수 있게해줌.

> git
위 명령어를 치면 



명령어&실습1_git bash 사용
현재 위치경로
> pwd

경로로 이동
> cd 경로

폴더 생성
> mkdir 폴더명

git 명령어리스트보기
> git


명령어&실습2_git 초기설정, 명령입력
작업시작시 git에게 작업을 하겠다는 것을 알려주는 기능
.git폴더를 만듦. .git에 버전관리폴더,파일들이 저장됨.
git을 통해 관리되어질 프로젝트 workspace의 경로로 이동하여 설치할것!
> git init
ex) git_practice폴더아래 git 프로젝트관리를 시작함.
> cd C:/developGit/git_practice
> git init



파일 생성
만약 vim이 아니라 nano와 같은 에디터가 실행시 git config --global core.editor "vim"
> vim 파일명
ex) vim f1.txt

i를 누른후, 생성된 파일에 입력가능

esc                삽입모드에서 명령모드로 가기
i                    명령모드에서 삽입모드 가기
:w                방금적고, 수정한내용 저장
:q                나가기

폴더내역보기
> ls -al


파일내용 보기
> cat 파일명


git 프로젝트 폴더의 상태확인(변경내역에 대한 git의 추적상태를 알수 있음)
> git status


변경된 파일을 git이 추적하게 만듦.
> git add 파일명



버전을 만든 사람의 정보를 설정하기(이게 있어야, 다른 협업개발자도 작성자 정보를 알수 있음)
한번만 만들면됨.
> git config --global user.name "닉네임"
> git config --global user.email "이메일"


명령어&실습3_commit하기
이전에 작업한 내용을 commit해보기
> git commit

vim을 쳐서 보여지는 화면이 보임.
#~~~~~ 내용들은 무시해도됨.
1입력
esc 누르기
:wq
엔터

git 기록들을 볼수있음
> git log


f1.txt를 수정하기
> vim f1.txt

souce: 1을 2로수정
esc 누르기
:wq
엔터


> git status
수정된 파일이 추적확인되지 않았다고 나옮.


수정된 내용을 추적하라고 다시 명령
> git add f1.txt


다시 확인해보기
> git status




명령어&실습4_commit대기(staged)개념 알기


commit전에 변경된 파일들의 내용을 최종확인후, 아래의 명령어를 시켜둔것만 git commit하면 버전관리기록상 변경된것으로 기록이 됨.
"git add 파일"

> ls -al


f1.txt를 복사해서 f2.txt로 만들기
> cp f1.txt f2.txt


f2.txt만들어진것 확인
> ls -al


git 상태확인
> git status


변경된 파일을 추적하게 명령
> git add f2.txt


git 상태확인
> git status


add추적확인한 변경된 내역 git commit 하기
> git commit


commit 기록 볼수 있음
> git log





명령어&실습5_시점별 변경된 내용 확인
각각의 commit간의 차이점을 확인
> git log -p



commit 아이디를 활용하여, 해당 commit 시점이전의 git log를 볼수 있음
> git log fdf4d2deb87ae04a2fa1844339ecad7f920cfff8

commit 아이디2개간의 차이점보기
git diff 2d52dfcd844ac7fba20297932a4ed577a37231ea..d78b479b312306de7e146b0f88cc51b23c30a874


commit전 방금 전까지 작업했었던 내용들을 마지막으로 review하기 위해서 사용
> git diff



명령어&실습6_과거버전으로 돌아가기
commmit 아이디를 시점으로 그 이전 기록 없애기
> git reset d78b479b312306de7e146b0f88cc51b23c30a874
reset을 하게되면, 실제 commit기록은 사라진것은 아니지만, commit기록은 그 시점 이후로 사라지며, 그 시점으로 작업환경이 바뀜
공유한 이후에는 reset을 이용하지 말자!
reset은 로컬내에서만 작업할때 사용


해당 기록들이 사라졌고, 파일내용들이 바꼈음을 알수 있음.
> git log


해당 commit 아이디를 취소하고 새로운 버전으로 만듦.
> git revert  d78b479b312306de7e146b0f88cc51b23c30a874


명령어&실습7_도움명령어(메뉴얼 보기)
git 명령어
git --help
> git --help


특정 명령어
git 특정명령어 -help
> git commit -help

변경된 내용 commit(기본값)
> git commit -a

구글에서 git 명령어 관련 키워드별 검색 빈도수
mand
google results
%
commit
528,000
7.981980075
push
523,000
7.906393143
pull
506,000
7.649397572
clone
489,000
7.392402002
checkout
470,000
7.105171658
add
446,000
6.742354382
branch
439,000
6.636532676
log
388,000
5.865545964
diff
369,000
5.578315621
fetch
355,000
5.36667221
merge
354,000
5.351554823
init
343,000
5.185263572
status
286,000
4.323572541
reset
267,000
4.036342197
tag
246,000
3.718877081
rebase
203,000
3.068829461
rm
142,000
2.146668884
show
104,000
1.572208197
bisect
62,800
0.9493718726
grep
49,400
0.7467988934
mv
44,700
0.6757471768



명령어&실습8_git의 원리
- git은 파일의 이름이 달라도, 파일의 내용이 같으면, 같은 오브젝트를 바라본다!
위 사이트에서 sha-1이용한 원리를 확인할 수 있음

아래의 폴더에, hi라는 값이 저장되게됨.
objects/c2/2b5f9178342609428d6f51b2c5af4c0bde6a42

objects 폴더아래의 object는 commit, tree, blob 3가지로 구성되어있음.



+ Recent posts