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