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가 일어나면서 새로운 커밋이 생성된다.