일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- yield
- 로컬 클래스
- 제네릭 와일드 카드
- 함수형 인터페이스
- annotation processor
- Switch Expressions
- 자바할래
- 바운디드 타입
- github api
- System.err
- 익명 클래스
- 상속
- docker
- throwable
- raw 타입
- 스파르타코딩클럽
- junit 5
- 제네릭 타입
- System.out
- 자바스터디
- System.in
- 프리미티브 타입
- auto.create.topics.enable
- 브릿지 메소드
- 정렬
- 합병 정렬
- 람다식
- 항해99
- 접근지시자
- Study Halle
- Today
- Total
코딩하는 털보
21.09.23 TIL 본문
오늘은 Spring 3주차 강의 듣고나서 남는 시간에 어제 보다만 git 강의를 마저 봤다.
지옥 git이 새로운 강의로 대체된 것을 이제 알아서 새로운 강의로 갈아탔다.
참고 : https://opentutorials.org/course/3841,
https://opentutorials.org/course/3842
Git Backup
용어 정리
지역 저장소 : 내 pc에서 작업하거나 버전을 생성하는 영역
원격 저장소 : 지역 저장소를 업로드해서 같은 상태를 유지하는 영역
push : 지역 저장소의 버전을 원격 저장소로 업로드하여 같은 상태로 만들기
clone : 원격 저장소로부터 버전을 복사하여 지역 저장소 생성
pull : 원격 저장소로부터 버전을 불러와서 같은 상태로 만들기
git hosting : Git의 지역 저장소 버전을 업로드할 수 있는 원격 저장소를 제공하는 서비스.
Github : 여러 git hosting 중에서 인기많은 것 중 하나이다.
Backup
내 코드가 있는 지역 저장소의 버전을 원격 저장소로 업로드할 수 있다.
Github에서 저장소 만들기 : https://www.youtube.com/watch?v=g74eKuhelrk&list=PLcDtUrBwapUOQzycPhaGUFnc-ogBOI6N_&index=24
Http 프로토콜로 원격 저장소와 연결하는 것으로 강의가 진행되는데, 올해 8월부터 http 로는 막힌것으로 알고있다.
그래서 친구가 올린 ssh로 원격 저장소와 연결하는 방법을 참고했다.
https://blog.devbong.com/20
> # 원격 저장소에 별명 붙이기 (기본적인 원격 저장소는 관습적으로 origin이라고 이름붙인다.)
> git remote add origin git@github.com:rockintuna/git_tutorial.git
> # 강의에는 없었는데 master를 main 브랜치로 바꾼다. (2020년 인종차별적 의미를 가진 용어 없애기.)
> git branch -M main
> # 원격 저장소에 최초 push하면서 현재 브랜치와 원격저장소의 main 브랜치를 연결하여 다음부터는 옵션 생략 가능.
> git push -u origin main
Clone
원격 저장소로부터 버전을 복사하여 새로운 지역 저장소를 생성한다.
> # 원격 저장소로부터 복제
> git clone git@github.com:rockintuna/git_tutorial.git
Cloning into 'git_tutorial'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
> ls git_tutorial/
README.md
pull
원격 저장소로부터 버전을 땡겨온다.
[/Users/ijeong-in/Git_repo/git_tutorial]> git pull
hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 824 bytes | 412.00 KiB/s, done.
From github.com:rockintuna/git_tutorial
10ba196..ad8bdc1 main -> origin/main
Updating 10ba196..ad8bdc1
Fast-forward
index.html | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 index.html
[/Users/ijeong-in/Git_repo/git_tutorial]> git log
commit ad8bdc160cd39f6bb3edc4bc1e7cedb41849bae2 (HEAD -> main, origin/main, origin/HEAD)
Author: Jeong-In Lee <52302236+rockintuna@users.noreply.github.com>
Date: Thu Sep 23 16:26:00 2021 +0900
Create index.html
commit 10ba196eb36261880938860932817f5ae4a5b28d
Author: rockintuna <rockintuna@naver.com>
Date: Thu Sep 23 16:01:38 2021 +0900
first commit
Git 협업
git은 여러 저장소를 연결시켜서 서로 동기화 시킬 수 있다. 이런 특징은 협업의 도구로 git을 사용할 수 있게 해준다.
public 원격 저장소는 누구나 clone할 수 있지만 허가된 사용자만 push할 수 있다. Github에서는 원격 저장소 Settings > Manage access
에서 협업에 참여할 사람을 초대할 수 있다.
push & pull
만약 다른 사람이 원격 저장소에 push한 버전을 pull하지 않은채로 새로운 버전을 원격 저장소로 push 하려고 하면 기각되면서 원격 저장소에 다른 사람이 만든 새로운 버전이 있음을 알려준다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git push
To github.com:rockintuna/git_tutorial.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:rockintuna/git_tutorial.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[/Users/ijeong-in/Git_repo/git_tutorial_2]>
pull을 하려고 할때 원격 저장소의 버전과 나의 버전이 동일한 부분을 수정하고 있다면 충돌이 발생한다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git pull
hint: Pulling without specifying how to reconcile divergent branches is
hint: discouraged. You can squelch this message by running one of the following
hint: commands sometime before your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), 226 bytes | 113.00 KiB/s, done.
From github.com:rockintuna/git_tutorial
14053fc..bef7e4a main -> origin/main
Auto-merging work.txt
CONFLICT (content): Merge conflict in work.txt
Automatic merge failed; fix conflicts and then commit the result.
[/Users/ijeong-in/Git_repo/git_tutorial_2]>
[/Users/ijeong-in/Git_repo/git_tutorial_2]> cat work.txt
1
<<<<<<< HEAD
2b
=======
2a
>>>>>>> bef7e4a845c282be015e521335b663cd3e820b96
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git status
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: work.txt
no changes added to commit (use "git add" and/or "git commit -a")
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # 충돌 해결하고 커밋/푸시
[/Users/ijeong-in/Git_repo/git_tutorial_2]> vi work.txt
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git add work.txt
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git commit
[main 8e0d21e] Merge branch 'main' of github.com:rockintuna/git_tutorial
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git push
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 524 bytes | 524.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:rockintuna/git_tutorial.git
bef7e4a..8e0d21e main -> main
최대한 작업을 빨리 끝내고 자주 push해야 충돌이 적다. 혹시나 다른 사람이 수정한 이력이 없는지 확인하기 위해 자주 pull하는 것도 중요하다.
원격 브랜치와 FETCH
위에서 협업에서 작업하는 단계는 pull -> commit -> push
라고 배웠다.
저 과정을 pull 대신 fetch -> merge FETCG_HEAD -> commit -> push
로 바꿀 수 있다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # HEAD -> main : 지역 저장소의 main 브랜치
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # origin/main : origin 원격 저장소의 main 브랜치[/Users/ijeong-in/Git_repo/git_tutorial_2]> # origin/main : 마지막으로 원격 저장소에서 가져온 버전
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git log --branches --graph --oneline
* 8e0d21e (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of github.com:rockintuna/git_tutorial
|\
| * bef7e4a work 2a
* | 3d51531 work 2b
|/
* 14053fc work 1
* ad8bdc1 Create index.html
* 10ba196 first commit
[/Users/ijeong-in/Git_repo/git_tutorial_1]> vi work.txt
[/Users/ijeong-in/Git_repo/git_tutorial_1]> git commit -am "work 3a"
[main a3c21f3] work 3a
1 file changed, 1 insertion(+)
[/Users/ijeong-in/Git_repo/git_tutorial_1]> git log --branches --graph --oneline
* a3c21f3 (HEAD -> main) work 3a
* 8e0d21e (origin/main, origin/HEAD) Merge branch 'main' of github.com:rockintuna/git_tutorial
|\
| * bef7e4a work 2a
* | 3d51531 work 2b
|/
* 14053fc work 1
* ad8bdc1 Create index.html
* 10ba196 first commit
[/Users/ijeong-in/Git_repo/git_tutorial_1]> # origin 원격 저장소의 main 브랜치보다 앞선 버전이 있으면 push 하라고 알려준다.
[/Users/ijeong-in/Git_repo/git_tutorial_1]> git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
git fetch
로컬 저장소에 있는 원격 저장소 브랜치 상태를 업데이트한다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), 230 bytes | 76.00 KiB/s, done.
From github.com:rockintuna/git_tutorial
8e0d21e..a3c21f3 main -> origin/main
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # 오잉? origin/main 브랜치가 안보인다!
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git log --branches --graph --oneline
* 8e0d21e (HEAD -> main) Merge branch 'main' of github.com:rockintuna/git_tutorial
|\
| * bef7e4a work 2a
* | 3d51531 work 2b
|/
* 14053fc work 1
* ad8bdc1 Create index.html
* 10ba196 first commit
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # origin 원격 저장소의 main 브랜치가 로컬 저장소보다 앞선 버전이 있으므로 pull 하라고 알려준다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
[/Users/ijeong-in/Git_repo/git_tutorial_2]> # 아니면 원격 저장소로부터 병합해도 된다.
[/Users/ijeong-in/Git_repo/git_tutorial_2]> git merge origin/main
Updating 8e0d21e..a3c21f3
Fast-forward
work.txt | 1 +
1 file changed, 1 insertion(+)
git fetch
는 .git/FETCH_HEAD에 원격 저장소의 가장 최근 이력을 자동으로 남긴다.git merge origin/main
대신에git merge FETCH_HEAD
를 사용하면 .git/FETCH_HEAD를 참고해서 가장 최근에 fetch한 내용을 병합한다.
다음으로 기회가 된다면 git flow를 공부해보고싶다. git flow는 협업을 통한 어플리케이션 개발에서 branch를 사용하는 일종의 전략으로 알고 있는데 이걸 공부해보면 현업에서 git을 통해 어떻게 소스코드를 관리하는지 조금은 이해할 수 있을 것 같다.