git checkout

HEAD가 움직인다.

 


git reset --hard

attached 상태 : HEAD가 가리키는 branch가 움직인다.

detached 상태 : HEAD가 움직인다.

 


fast-forward

* 1f642bb (HEAD -> exp) ex4
* e7790bd ex3
*   a9640d8 (master) Merge branch 'exp'
|\
| * 0b92201 exp 1

위와 같이 exp가 master를 앞서간 상태에서 master에 exp를 merge하면

$ git checkout master; git merge exp
Already on 'master'
Updating a9640d8..1f642bb
Fast-forward
 exp.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

$ git log --oneline --all --graph
* 1f642bb (HEAD -> master, exp) ex4 
* e7790bd ex3 
*   a9640d8 Merge branch 'exp' 
|\   
| * 0b92201 exp 1

Fast-forward라는 로그와 함께 master가 exp에 있는 commit을 가리키게 된다.

새로운 commit을 생성하는 것이 아니라 master의 reference만 변경되는 것이므로 빠르게 동작하므로 fast-forward라고 한다.

 

 

$ git merge --no-ff exp
Merge made by the 'recursive' strategy.
 exp.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
 
$ git log --oneline --all --graph
*   8847542 (HEAD -> master) Merge branch 'exp'
|\
| * 1f642bb (exp) ex4
| * e7790bd ex3
|/  
*   a9640d8 Merge branch 'exp'
|\
| * 0b92201 exp 1

--no-ff 옵션을 사용하면 fast-forward를 사용하지 않고 위와 같이 master와 exp를 부모로 하는 commit을 생성한다.

 


원격저장소

github, bitbucket 등의 원격 저장소를 local pc에서도 생성이 가능하다.

 

원격 저장소 생성

 remote_repo 폴더 생성 후

$ git init --bare 
Initialized empty Git repository in C:/Development/Github/Git6/remote_repo/

로컬 저장소 생성

 local_repo 폴더 생성 후

$ git init 
Initialized empty Git repository in C:/Development/Github/Git6/local_repo/.git/

임의 파일 커밋

$ git commit -am 1
[master (root-commit) 109d6e2] 1
 1 file changed, 1 insertion(+)
 create mode 100644 work.txt

 

 

원격 저장소에 연결

$ git remote add origin ../remote_repo/

(origin은 저장소의 별칭)

 

현재 연결된 원격 저장소 리스트

$ git remote -v 
origin  ../remote_repo/ (fetch) 
origin  ../remote_repo/ (push)

 

원격 저장소가 local의 master를 따르도록 설정

$ git push --set-upstream origin master (git push -u origin master)
Enumerating objects: 3, done. 
Counting objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 213 bytes | 106.00 KiB/s, done. 
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 
To ../remote_repo/ 
 * [new branch]      master -> master 
Branch 'master' set up to track remote branch 'master' from 'origin'.

 

origin/master가 연결된 것 확인.

$ git log --oneline --all --graph
* 109d6e2 (HEAD -> master, origin/master) 1

 

로컬 저장소에 새로운 커밋 

$ git commit -am 2

$ git log --oneline --all --graph
* c772c59 (HEAD -> master) 2 
* 109d6e2 (origin/master) 1

$ git status 
On branch master 
Your branch is ahead of 'origin/master' by 1 commit. 
  (use "git push" to publish your local commits) 

nothing to commit, working tree clean

 

status로 확인시 HEAD가 origin/master(원격) 보다 앞서가고 있으므로 원격으로 push하라는 안내가 나옴.

 

원격 저장소로 push

$ git push 
Enumerating objects: 5, done. 
Counting objects: 100% (5/5), done. 
Writing objects: 100% (3/3), 246 bytes | 82.00 KiB/s, done. 
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 
To ../remote_repo/ 
   109d6e2..c772c59  master -> master

$ git log --oneline --all --graph
* c772c59 (HEAD -> master, origin/master) 2 
* 109d6e2 1

 

remote_repo에서 log 확인

/c/Development/Github/Git6/remote_repo (BARE:master) 
$ git log --oneline --all --graph
* c772c59 (HEAD -> master) 2 
* 109d6e2 1

위와 같이 sync가 맞춰져 local과 동일한 로그가 나오는 것을 확인할 수 있다.

 

새로운 remote_local2 폴더를 만들고 원격 저장소 clone.

/c/Development/Github/Git6/local_repo2    
$ git clone ../remote_repo/ . 
Cloning into '.'... 
done.



$ git log --oneline --all --graph
* c772c59 (HEAD -> master, origin/master, origin/HEAD) 2 
* 109d6e2 1

pull

git pull을 git fetch와 git merge를 합친 명령어이다.

 


cherry-pick

서로 다른 branch에서 특정 commit만 가져와서 반영하고 싶을 때,

 

$ git log --oneline --all --graph
* 2a548b5 (HEAD -> right) R4 
* 21cb3ab R3 
| * 3096289 (left) L4 
| * 0f04059 L2 
|/ 
* 5f0c939 (master) start

위의 상태에서 right R4에 left L2의 commit을 반영하고 싶은 경우,

 

$ git cherry-pick 0f04059
Auto-merging work.txt
[right bef0b4a] L2
 Date: Wed Dec 16 14:34:19 2020 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --oneline --all --graph
* bef0b4a (HEAD -> right) L2 
* 2a548b5 R4 
* 21cb3ab R3 
| * 3096289 (left) L4        
| * 0f04059 L2 
|/ 
* 5f0c939 (master) start

 

git cherry-pick 'commit id' 를 하면 L2의 Parent를 Base로 L2,R4와 3-way merge가 일어나면서 새로운 커밋이 생성된다.


 

'Git' 카테고리의 다른 글

1일차  (0) 2020.12.15

+ Recent posts