[GIT] GIT 이론정리 & learngitbranching 답 공유

2022. 5. 25. 15:39
반응형

깃에 대한 이론을 제대로 하지않고 push랑 pull만 사용 하다가 
좋은 사이트를 알게되어 이번기회에 정리를 한번 해보고자함

https://learngitbranching.js.org/ 를 통하여 깃에 이론과 실제 사용법을 유쾌하게 진행 할수있었다.

 

Learn Git Branching

An interactive Git visualization tool to educate and challenge!

learngitbranching.js.org

 

Git commit

  • 커밋은 디렉토리에있는 모든 파일에대한 스냅샷을 기록하는것. ( 가볍게 유지하려 전체를 복사하지않음)
    ex) git commit
  • Git은 커밋을 가볍게 유지하고자 하기 때문에, 변경내역("delta"라고도 함)을 저장하며 대부분의 커밋이 그 커밋 위의 부모 커밋을 가리키게됨

Git branch

  • 브랜치 SVN과 다르게 굉장히 가볍다. 이유는 커밋에 대한 참조(reference) 이기 때문
    "하나의 커밋과 그 부모 커밋들을 포함하는 작업내역이라고 생각" 그러기 때문에
    브랜치는 많이 만들어도 메모리나 디스크 공간에 부담이 되지 않는다.
    ex) git branch -f <name>
  • git branch명령어는 현재 지점에 새로운 브랜치를 만들어 놓는다.
     가장 최근 커밋을 참조하는 다른 브랜치를 생성한다.
  • 생성만 할 뿐, 이동하지는 않는다. 이동 명령어는 git checkout 브랜치명으로 할 수 있다. 

Git merge

  • Git의 합치기(merge)는 두 개의 부모(parent)를 가리키는 특별한 커밋을 만들어낸다.
    ex) git merge branch
  • 두개의 부모가 있는 커밋이라는 것은 "한 부모의 모든 작업내역과 나머지 부모의 모든 작업, 그리고 그 두 부모의 모든 부모들의 작업내역을 포함한다"라는 의미가 있다.
  • 브랜치는 커밋 위에 있는 포인터와 같고, 내가 움직여주지 않으면 움직이지 않는다.
  • 자신의 브랜치에서 새로운 커밋이 생기면 브랜치는 마지막 커밋을 참조하지만 다른 브랜치는 움직이지 않는다.

Git Rebase

  • 리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것이다.
    ex) git rebase <name>
  • 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있고 커밋 로그와 이력 또한 보기 좋게 변경된다.
  • A에서 git rebase B를 한다는 것은 A의 베이스 브랜치를 B로 만듬
    타겟지점과 공통지점까지 올라간다음 내 갈래를 타겟에 붙이는 것.
    즉 git rebase [브랜치이름]을 하면 현재 브랜치의 작업내역이 복사되어 브랜치이름 브랜치로 편입된다.
  • 만약 두 커밋이 이미 한 줄이라면 더 나중에 한 커밋 쪽으로 브랜치가 이동한다.

Git checkout

  • 커밋 트리(commit tree)에서 이동 할 때 HEAD는 커밋과 브랜치 모두 돌아다닐 수 있는 포인터이다.
    ex) git checkout <name>
  • 일반적으로 HEAD는 브랜치의 이름을 가리키고 있지만 이동이 가능다.
  • HEAD가 branch를 가리키고 있을 때는 브랜치 밑에 숨어있고 HEAD는 커밋을 직접 가리킬 수 있다.

상대 참조

  • 커밋 해시를 다 입력하지 않아도, 식별가능할 정도로만 입력해도 된다.
  • 캐럿 (^)은 한 커밋 위로 움직일 수 있다.
    ex) git HEAD^
  • 틸드(~) ~<num>은 여러 커밋 올라갈 수 있다.
    ex) git HEAD~0
  • [해시] 또는 [브랜치이름] 또는 HEAD모두 상대참조기호 앞에 올 수 있다.

Git reset & Git revert

  • git reset 는 브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식으로 변경 내용을 되돌리며 커밋이 모두 삭제가 된다.
    각자의 컴퓨터에서 작업하는 로컬 브랜치의 경우 리셋(reset)을 잘 쓸 수 있습니다만, "히스토리를 고쳐쓴다"는 점 때문에 다른 사람이 작업하는 리모트 브랜치에는 쓸 수 없다.
    ex) git reset <name>
  • git revert 는 HEAD가 속한 브랜치가 가리키고 있는 작업내역의 역 작업내역을 커밋한다.

Git cherry-pick

  • 현재 위치(HEAD) 아래에 있는 일련의 커밋들에대한 복사본을 만들겠다는 것을 간단히 줄인 말.
  • 다른 갈래의 커밋 중 필요한 커밋만 골라서 가져온다.
    ex) git cherry-pick <Commit1> <Commit2> <...>
  • git cherry-pick은 HEAD를 기준으로 적용된다.
  • 체리-픽은 여러분이 원하는 커밋이 무엇인지 알때(각각의 해시값도) 아주 유용합니다

Git Interective Rebase

  • 체리-픽은 원하는 커밋이 뭔지 알아야 하는데, 모를 때는 이 기능으로 검토할 수 있다.
  • 위치 다음 커밋부터 배치를 조작해서 갈아끼울 수 있다.
    ex) git rebase -i <name>

Git tag

  • branch는 유동적인 것인데 이때 history에서 중요한 지점들에 영구적으로 표시 하는 방법. 
    주로 merge 나 릴리즈때 사용
  • tag는 닻 같은 역할을 한다. 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다.
    ex) git tag <태그> <name>

Git Describe

  • 커밋 트리에서 태그가 훌륭한 "닻"역할을 하기 때문에, git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지  *describe(묘사)*해주는 명령어
    ex) git describe <ref>
  • ref 에는 commit을 의미하는 그 어떤것이던 쓸 수 있지만 ref를 특정 지어주지 않으면
    git은 그냥 지금 체크아웃된곳을 사용함
  • 결과 : <tag>_<numCommits>_g<hash>
  • tag는 가장 가까운 부모커밋, numCommits는 그커밋과의 거리, hash는 묘사하고 있는 커밋의 해시이다.
  • 즉 정리하자면, git describe A는 A이 가장 가까운 이정표(milestone, 곧 tag)로부터 얼마나 떨어져있고, A의 해시값은 무엇인지를 나타낸다.
  • 만약 git describe 해시값을 주었을 때는 마지막에 나오는 해시값이 그대로 나오게 된다.
  • milestone 자체를 descirbe 해달라고 하면 tag가 나온다.

Git Clone

  • git clone 명령어로 원격에서 로컬로 복사해올 수 있다.

Git remote

  • Git clone 진행시 로컬 저장소에 원격브랜치가 생성됨
  • origin/main이라면 origin은 원격저장소 이름 main은 그 브랜치의 이름이다.
    ex) git remote origin/main
  • git checkout origin/main으로 원격브랜치를 checkout하더라도, 그 상태에서 커밋으로 함께 움직일 수 없다. 커밋하면 분리된 HEAD만 움직인다. origin/main은 원격 저장소가 갱신될때만 갱신된다.
  • 원격 브랜치는 체크 아웃을 하게 되면 분리된 HEAD 모드로 가게되는 특별한 속성이 있다.

Git Fetch

  • Git Fetch는 원격 저장소에는 있지만 로컬에는 없는 커밋들을 다운로드 받고, 로컬저장소의 원격 브랜치를 업데이트한다. 즉, 로컬의 원격브랜치를 실제 원격 저장소의 상태와 동기화한다 (예를들어, origin/main)
    ex) git fetch <name>;
  • git fetch는 인터넷을 통해 접근한다.
  • 로컬 저장소의 상태는 바뀌지 않음
    앞의 과정에 필요한 데이터를 다운로드는 하지만, 실제로 로컬 파일들이나 브랜치를 변경하지는 않는다.
  • 원격 저장소에 브랜치가 여러 개 있으면 로컬에있는 원격 브랜치가 전부 업데이트된다.

Git Pull

  • 작업을 업데이트해서 변경들을 반영.
  • 원격 저장소의 변경을 fetch하고 그이후에 merge하는 작업의 과정이 워낙 자주있는 일이라서 git은 이 두가지를 한번에 하는 명령
  • 원격 저장소에서 로컬 저장소로 소스를 가져오는 명령어로는 pull fetch가 있습니다. fetch와 pull의 차이는 가져온 소소를 merge 하느냐 안하느냐의 차이
    ex) git pull origin main 
    ex)  변경점확인 - git diff HEAD origin/main

Git fakeTeamwork

  • 원격 저장소에서 일어난 변경들을 로컬로 가지고옴
  • 동료 / 친구 / 협력자등에 의해 특정 브랜치나 여러개의 커밋이 갱신

Git Push

  • 공유된 작업을 내려받는것의 반대는 작업을 업로드해 공유
  • 변경을 정한 원격저장소에 업로드하고 그 원격 저장소가 여러분의 새 커밋들을 합치고 갱신
  • push 진행시 작업을 "공개"하는 과정 이라 생각.

 

learngitbranching 정답

 

필자가 풀어본것으로써 좀더 올바른 답이있을수 있으니 참고만 하면 좋을듯함.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
 
1.1 Introduction to Git Commits
 
git commit;
git commit;
 
1.2 Branching in Git
 
git branch bugFix; 
git checkout bugFix;
 
 
1.3 Merging in Git
 
git branch bugFix; 
git checkout bugFix; 
git commit; 
git checkout main; 
git commit; 
git merge bugFix;
 
 
1.4  Rebase Introduction
 
git branch bugFix; 
git checkout bugFix; 
git commit; 
git checkout main; 
git commit; 
git checkout bugFix; 
git rebase main;
 
 
2.1 Detach yo’ HEAD
 
git checkout bugfix^;
 
2.2 Relative Refs (^)
 
git checkout C4^;
 
2.3 Relative Refs #2 (~)
 
git checkout C0; git branch -f bugFix HEAD~0; git checkout C6; git branch -f main HEAD~0; git checkout C1
git checkout bugFix; git branch -f bugFix HEAD~3; git checkout C6; git branch -f main HEAD~0; git checkout C1;
 
2.4 Reversing Changes in Git
 
git reset HEAD~1; git checkout pushed; git revert pushed;
git reset HEAD^; git checkout pushed; git revert pushed;
 
3.1 Cherry-pick Intro
 
git cherry-pick C3 C4 C7;
 
3.2 Interactive Rebase Intro
 
git rebase -i HEAD~4
 
4.1 Grabbing Just 1 Commit
 
git rebase -i main;
git checkout C4';
git branch -f main
 
4.2 Juggling Commits
 
git rebase -i  main;
git rebase -i C3';
git rebase -i C1;
git checkout C3''; git branch -f main HEAD~0;
 
4.3 Juggling Commits #2
 
git checkout C1;
git cherry-pick C2;
git checkout C1;
git cherry-pick C2 C3;
git branch -f main HEAD~0;
 
4.4 Git Tags
 
git tag v0 C1; 
git checkout C2; 
git tag v1;
 
4.5 Git Describe
 
git commit
 
5.1 Rebasing over 9000 times
 
git checkout bugFix;
git describe main;
git describe side;
git describe bugFix;
git commit;
 
5.2 Multiple Parents
 
git branch bugWork master~^2~
 
5.3 Branch Spaghetti
 
git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2
 
 
1.1 Clone Intro
 
git clone
 
1.2 Remote Branches
 
git commit; 
git checkout o/main; 
git commit;
 
1.3 Git Fetchin’
 
git fetch
 
1.4 Git Pullin’
 
git pull
 
1.5 Fakeing Teamwork
 
git clone; 
git fakeTeamwork main 2;
 git commit; git pull;
 
1.6 Git Pushin’
 
git commit;
git commit;
git push;
 
1.7 Diverged History
 
git clone; 
git fakeTeamwork main 1; 
git commit; git pull --rebase; git push
 
 
1.8 Locked branch Master
 
git bransh -f feature;
git reset --hard o/main;
git push origin feature;
git checkout feature;
 
 
2.1 Push Master!
 
git rebase side1 side2;
 git rebase side2 side3;
 git rebase side3 main;
 git pull --rebase;
 git push;
 
2.2 Merging with remotes
 
git checkout main; 
git pull;
git merge side1;
git merge side2;
git merge side3;
push;
 
 
2.3 Remoting Tracking
 
git checkout -b side o/main;
git commit;
git pull --rebase;
git push;
 
2.4 Git push arguments
 
git push origin main
git push origin foo
 
2.5 Git push arguments — Expanded!
 
git push origin main~1:foo
git push origin foo:main
 
2.6 Fetch arguments
 
git fetch origin main~1:foo
git fetch origin foo:main
git checkout foo
git merge main
 
2.7 Source of nothing
 
git push origin :foo
git fetch origin :bar
 
2.8 Pull arguments
 
git pull origin bar:foo
git pull origin main:side
cs
반응형

BELATED ARTICLES

more