1. host2에서

sudo yum install git 명령어는 yum저장소에서 git을 가져오는데 yum저장소의 git은 구버전이다.
따라서, 새 버전을 받기 위해 wandisco주소에 접근한다.

실습을 위해 로컬2에 디렉토리를 clone하고 로컬2와 서버 HEAD 위치를 확인한다.

sudo yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-1.noarch.rpm
sudo yum remove git
sudo yum install git
git --version
cd git
git clone https://github.com/omelase/bitcamp-ncp
cd bitcamp-ncp
git log --oneline --graph --all (로컬2_main HEAD -> 11, 서버_main HEAD -> 11)
cat a.txt

2. host1에서

a파일을 생성한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

nano a.txt
git add .
git commit -m "12"
git log --oneline --graph --all (로컬1_main HEAD -> 12, 서버_main HEAD ->11)
git push
git log --oneline --graph --all (로컬1_main HEAD -> 12, 서버_main HEAD ->12)

3. host2에서

pull한다. (서버와 로컬2 HEAD 위치가 업데이트)

git pull
git log --oneline --graph --all (로컬2_main HEAD -> 12, 서버_main HEAD ->12)

4. host1에서

a파일을 변경한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

nano a.txt
git add .
git commit -m "13"
git push
git log --oneline --graph --all (로컬1_main HEAD -> 13, 서버_main HEAD ->13)

5. host2에서

fetch한다. (서버 HEAD 위치가 업데이트)

merge한다. (로컬2 HEAD 위치가 업데이트)

git fetch : 서버에서 받아오는 것만
git log --oneline --graph --all (로컬2_main HEAD -> 12, 서버_main HEAD ->13)
git merge : Fast-forward란? 로컬의 이전 버전이 서버의 버전 순서와 같은 경우 합치기 쉬움. 그대로 이어 붙이고 HEAD를 마지막 버전으로 이동시키면 됨. fetch 후 단순 merge하면 됨.
git log --oneline --graph --all (로컬2_main HEAD -> 13, 서버_main HEAD ->13)

6. host1에서

a파일을 변경한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

a파일을 변경한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

a파일을 변경한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

nano a.txt
git add .
git commit -m "14"
git push
git log --oneline --graph --all (로컬1_main HEAD -> 14, 서버_main HEAD ->14)
nano a.txt
git add .
git commit -m "15"
git push
git log --oneline --graph --all (로컬1_main HEAD -> 15, 서버_main HEAD ->15)
nano a.txt
git add .
git commit -m "16"
git push
git log --oneline --graph --all (로컬1_main HEAD -> 16, 서버_main HEAD ->16)

7. host2에서

fetch한다. (서버 HEAD 위치가 업데이트)

merge한다. (로컬2 HEAD 위치가 업데이트)

git fetch
git log --oneline --graph --all (로컬2_main HEAD -> 13, 서버_main HEAD ->16)
git merge
git log --oneline --graph --all (로컬2_main HEAD -> 16, 서버_main HEAD ->16)

8. host1에서

b파일을 생성한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

b파일을 변경한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

nano b.txt
git add .
git commit -m "17"
nano b.txt
git add .
git commit -m "18"
(팀프로젝트할 땐 버그없는 기능 개발할 때마다 커밋하고 집갈때만 푸시하면 됨)
git log --oneline --graph --all (로컬1_main HEAD -> 18, 서버_main HEAD ->16)
git push
git log --oneline --graph --all (로컬1_main HEAD -> 18, 서버_main HEAD ->18)

9. host2에서

로컬2에서 edit을 쉽게 하기 위해 nano를 설치한다.

a파일을 변경한다.

commit한다. (로컬2 HEAD 위치가 업데이트)

a파일을 변경한다.

commit한다. (로컬2 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 구버전이므로 충돌)

fetch한다. (서버 HEAD 위치가 업데이트)

merge한다. (로컬2 HEAD 위치가 신버전이므로 충돌)

버전이름을 적는다. (로컬2 HEAD 위치가 병합)

push한다. (서버 HEAD 위치가 업데이트)

sudo yum install nano -y
nano a.txt
git add .
git commit -m "19"
nano a.txt
git add .
git commit -m "20"
git push (거부당함)
git log --oneline --graph --all (로컬2_main HEAD -> 20, 서버_main HEAD ->16)
git fetch
git log --oneline --graph --all (로컬2_main HEAD -> 20, 서버_main HEAD ->18)
git merge (충돌일어나므로 왜 머지하는지 사유서 적어야함. esc누르고 dd로 다 지움. esc누르고 a로 insert모드. 21작성하고 :wq로 저장후 끝내기)
(겹치는 파일없으면 머지됨)
git log --oneline --graph --all (로컬2_main HEAD -> 21, 서버_main HEAD ->18)
git push
git log --oneline --graph --all (로컬2_main HEAD -> 21, 서버_main HEAD ->21)

10. 윈도우에서

소스트리는 커밋이력을 라인화하여 한 눈에 볼 수 있는 어플리케이션이다.

clone하여 리포지토리 다운한다.

pull한다. (서버와 로컬3 HEAD 위치가 업데이트)

git client 검색 후 소스트리 다운
git clone https://github.com/omelase/bitcamp-ncp
cd bitcamp-ncp
git pull
소스트리 확인
(팀프로젝트할 땐 메인 브랜치 사용x, 따로 브랜치만든 후 커밋)

11. host1에서

pull한다. (서버와 로컬1 HEAD 위치가 업데이트)

a파일을 변경한다.

push한다. (서버 HEAD 위치 업데이트 버전없음)

commit한다. (로컬1 HEAD 위치가 업데이트)

push한다. (서버 HEAD 위치가 업데이트)

git pull
git log --oneline --graph --all (로컬1_main HEAD -> 21, 서버_main HEAD -> 21)
nano a.txt ("host1=>xxx" 작성)
git push (로컬1에 커밋 안 됐으므로 업데이트할 것 없음)
git add .
git commit -m "22"
git push
git log --oneline --graph --all (로컬1_main HEAD -> 22, 서버_main HEAD -> 22)

12. host2에서

a파일을 변경한다.

pull한다. (서버 HEAD 위치가 업데이트, 로컬2 HEAD 위치가 신버전이므로 업데이트 보류)

commit한다. (로컬2 HEAD 위치가 업데이트)

merge한다. (로컬2 HEAD 위치가 신버전이지만 파일만 병합)

a파일을 변경한다.

commit한다. (로컬2 HEAD 위치가 업데이트)

nano a.txt ("host2=>yyy" 작성)
git log --oneline --graph --all (로컬2_main HEAD -> 21, 서버_main HEAD -> 21)
git pull (error : 너의 로컬 내 a.txt이 변경중에 있다. 커밋하거나 취소해라)
git log --oneline --graph --all (로컬2_main HEAD -> 21, 서버_main HEAD -> 22)
git add
git commit -m "23"
git log --oneline --graph --all (로컬2_main HEAD -> 23, 서버_main HEAD -> 22)
git merge
git log --oneline --graph --all (로컬2_main HEAD -> 23, 서버_main HEAD -> 22)
cat a.txt ("host2=>yyy", "host1=>xxx" 둘 다 기록됨. 특수문자 지우는 건 유저가 직접 편집해야함. 현재 편집 중인 게 있을 때는 git pull 안 됨.)
nano a.txt
git add
git commit -m "24"
git log --oneline --graph --all (로컬2_main HEAD -> 24, 서버_main HEAD -> 22)
git push

13. host1에서

pull한다. (서버와 로컬1 HEAD 위치가 업데이트)

git pull
git log --oneline --graph --all (로컬1_main HEAD -> 24, 서버_main HEAD -> 24)

14. 윈도우에서

pull한다. (서버와 로컬3 HEAD 위치가 업데이트)

git pull
소스트리 확인

sourcetree

15. host1에서

새 브랜치를 생성한다.

새 브랜치를 삭제한다.

새 브랜치를 생성한다.

새 브랜치로 로컬1 HEAD 위치를 변경한다.

c파일을 생성한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

b파일을 변경한다.

a파일을 삭제한다.

commit한다. (로컬1 HEAD 위치가 업데이트)

메인 브랜치로 로컬1 HEAD 위치를 변경한다.

두 브랜치를 병합한다. (로컬1 HEAD 위치가 업데이트)

새 브랜치를 삭제한다.

push한다. (서버 HEAD 위치가 업데이트)

git branch b1 (b1이라는 이름의 브랜치 생성)
git branch (*붙어있는 브랜치가 작업 중인 브랜치)
git log --oneline --graph --all (HEAD가 가리키는 브랜치가 작업 중인 브랜치)
git branch -d b1 (b1 브랜치 삭제)
git branch  b1
git checkout b1 (HEAD가 b1을 가리키도록 옮김. 기존 브랜치의 작업 디렉토리를 없애버리고 b1 브랜치의 최신 버전 작업 디렉토리 새로 꺼냄(24버전상태))

(결국 checkout은 작업디렉토리를 교체하는 것)

nano c.txt
git add .
git commit -m "25"
git log --oneline --graph --all (로컬1_b1 HEAD -> 25, 로컬1_main HEAD, 서버_main HEAD -> 24)
nano b.txt
rm a.txt
git add
git commit -m "26"
git log --oneline --graph --all (로컬1_b1 HEAD -> 26, 로컬1_main HEAD, 서버_main HEAD -> 24)
git checkout main
git log --oneline --graph --all (로컬1_main HEAD -> 24, 서버_main HEAD -> 24)
git merge b1 (현재 브랜치(main)에 다른 브랜치(b1)의 커밋 내용을 합침)
git log --oneline --graph --all (로컬1_main HEAD, 로컬1_b1 HEAD -> 26, 서버_main HEAD -> 24)
git branch -d b1

(branch merge 후엔 해당 branch 꼭 삭제할 것!)

git log --oneline --graph --all (로컬1_main HEAD -> 26, 서버_main HEAD -> 24)
git push
git log --oneline --graph --all (로컬1_main HEAD -> 26, 서버_main HEAD -> 26)

16. host2에서

새 브랜치를 생성한다.

새 브랜치로 로컬2 HEAD 위치를 변경한다.

x파일을 생성한다.

commit한다. (로컬2 HEAD 위치가 업데이트)

x파일을 변경한다.

commit한다. (로컬2 HEAD 위치가 업데이트)

메인 브랜치로 로컬2 HEAD 위치를 변경한다.

두 브랜치를 병합한다. (로컬2 HEAD 위치가 업데이트)

pull한다. (서버 HEAD 위치가 업데이트)

git log --oneline --graph --all (로컬2_main HEAD -> 24, 서버_main HEAD -> 24)
git branch x1
git checkout x1
nano x.txt
git add .
git commit -m "41"
nano x.txt
git add .
git commit -m "42"
git checkout main
git merge x1
git log --oneline --graph --all (로컬2_main HEAD, 로컬2_x1 HEAD -> 42, 서버_main HEAD -> 24)
git pull ("merge" 작성)
git log --oneline --graph --all (로컬2_main HEAD -> merge, 로컬2_x1 HEAD -> 42, 서버_main HEAD -> 26)

17. 윈도우에서

pull한다. (서버와 로컬3 HEAD 위치가 업데이트)

소스트리에서 pull해서 확인

18. host1에서

pull한다. (서버와 로컬1 HEAD 위치가 업데이트)

git pull
git log --oneline --graph --all (로컬1_main HEAD, 서버_main HEAD -> merge)
git ls-remote : 로컬과 서버의 헤드가 가리키는 버전의 해시코드보여줌
git branch -vv : 브랜치의 버전 정보보여줌