이 글은 Git 마스터 과정에서 배운 것을 정리한 내용입니다.
fast-forward 같은 경우는 master branch에서 새로운 branch가 생성된 이후에 master branch의 변동사항이 없다면, merge를 할 때, 단순히 master branch가 가리키고 있는 포인터를 새로운 branch(featureA)로 옮기면 된다. 그리고 branch를 삭제하면 된다.
fast-forward 단점 - 히스토리에 merge가 되었다는 사실이 남지 않는다.
[fast-forward merge 하는 경우] - merge하는 동시에 이전 feature-A가 사라지게 된다.
=> 깔끔한 merge (history에 남지 않기 때문)
git merge featureA #merges featureA branch into the current one
# 현재 위치인 master가 featureA로 merge되면서 이동된다.
# featureA로 merge 했다면 더이상 feature-A의 branch가 필요없기 때문에
# 해당 branch를 삭제한다. => git branch -d feature-A
---
[fast-forward merge 하기 싫은 경우] -> --no-ff 옵션을 사용한다.
git merge --no-ff featureA #creates a merge commit
---
[fast-forward merge 불가능한 경우] => Three-way merge를 이용해야 한다.
- master branch와 파생된 feature-A branch의 변동사항을 모두 합해서
- merge commit을 만든 다음에 master branch에 commit을 해야한다.
=> fast-forward가 불가능한 상황에서 git merge feature-A 를 하게 될 때,
따로 merge commit이 만들어진다. => 해당 commit을 종료하고 git hist를 통해
새로운 merge commit이 만들어진 것을 볼 수 있다.
---
git merge --squash featureA #suqash merge, only one commit
git merge --continue
git merge --abort # merge하는 것을 취소하고 싶을 때
git mergetool #opens merge tool
예) feature → master에 merge를 할때, conflict이 발생했다.
merge를 했을 때, conflict상황이 발생했다면 다음과 같은 상황이 발생한다.
open main.txt 입력 → 수동적으로 둘 중 하나만 남기고 나머지는 지운다
“Oh.. Here!! From master branch!” 만 남기고 지우거나 둘다 남겨도 된다.
단, 새로운 메세지를 추가해서는 절대 안된다 → 현직 개발자들도 실수를 종종 한다.
git status에 보시면 “git add
git add main.txt → git status를 하면 수정이 되었고, merge을 이어서 계속하면 → git merge --continue
입력하면 아래와 같이 merge가 성공적으로 되는 것을 볼 수 있다.
git merge --continue
이것은 fast-forward merge가 아니기 때문에, merge commit이 만들어진다. 타이틀을 입력한 다음에, 파일을 끄면 merge가 완성되는 것을 볼 수 있다.git config –global -e 입력 → 다음 4줄을 맨 밑에 추가해준다.
다음 4줄을 추가해주고 닫아준다.
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait $MERGED
git merge feature
(conflict 발생한지 확인 후) → git mergetool
입력한다.
다음 과 같은 4가지 옵션중에 한가지를 고르면 된다. → A선택, B선택, 둘다선택, 두개 비교 (예시 - Accept Current Chage = A선택)
git status
로 확인한다.그러면 git status 에서 main.txt.orig (오리지널 파일)보이는데, 이것은 이전에 merge conflict이 발생하였을 때, 내용이 포함된 것을 볼 수 있다.
이것을 끈다고 하면, git config --global mergetool.keepBackup false
입력한다.
또는 git config --global -e
→ edit 창에 들어가서 [merge] 밑에 다음과 같이 추가해줘도 된다. ⇒ 기존 4줄 밑에 추가한다.
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait $MERGED
[mergetool]
keepBackup = false
git merge --abort
: merge 취소
git clean -fd
: false적으로 directory에 있는 것들을 정리한다. (“Removing main.txt.orig” 라는 메세지가 나오는 것을 볼 수 있다)
다시 처음부터 merge를 한다. git merge feature → git mergetool (수정하고) → git status를 확인해보면, main.txt.orig이 생기지 않는 것을 볼 수 있다.
마지막으로 merge --continue
입력 (→ commit 메세지 저장후 종료) → merge 완료
DS_STORE 파일이란 Desktop Services Store의 약자로, 애플에서 정의한 파일 포맷이다.
애플의 맥 OS X 시스템이 finder로 폴더에 접근할 때 자동으로 생기는 파일로써, 해당 폴더에 대한 메타데이터를 저장하는 파일이다.
윈도우의 thumb.db 파일과 비슷하다.
분석해보면 해당 디렉토리 크기, 아이콘의 위치, 폴더의 배경에 대한 정보들을 얻을 수 있다.
맥 OS 환경에서만 생성 및 사용되지만, 파일을 공유하는 과정에서 이 파일도 같이 공유되는 경우가 있다.
DS_store 파일은 프로젝트와 관련없는 파일이며, git status를 사용했을 때 발견되는 파일이니, github로 넘기지말고 삭제해도 된다.
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
만약, 앞으로도 .DS_Store 파일을 업로드하지 않을거라면,
저장소 상위 디렉토리에 .gitignore 파일 생성 및 .DS_Store 파일 추가
echo .DS_Store >> .gitignore
git add --all
git commit -m '.DS_Store removed'
git push origin main
이 글은 Git 공식 문서를 통해 배운 것을 정리한 내용입니다.
개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 생기거나 팀 프로젝트에서 개인이 독립적으로 개발을 진행할 때 필요한 것이 브랜치
다.
Git은 브랜치를 만들어 작업하고 나중에 Merge 하는 방법을 권장한다.
Git의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것이다.
기본적으로 Git은 master
(현재는 main
)을 만든다.
처음 커밋하면 이 master
브랜치가 생성된 커밋을 가리킨다. 이후 커밋을 만들면 master
브랜치는 자동으로 가장 마지막 커밋을 가리킨다.
브랜치를 하나 새로 만들면 어떻게 될까?
git branch
명령어로 testing
브랜치를 만든다.
$ git branch testing
HEAD
라는 특수한 포인터가 있는데, 이 포인터는 지금 작업하는 로컬 브랜치를 가리킨다.브랜치를 새로 만들었지만, 아직 Git은 master
브랜치를 가리키고 있다.
git log
명령에 --decorate
옵션을 사용하면 쉽게 브랜치가 어떤 커밋을 가리키는지 확인할 수 있다.
git log --oneline --decorate
f30ab (HEAD -> master, testing) add feature #32 - ability to add new formats to the central interface
34ac2 Fixed bug #1328 - stack overflow under certain conditions
98ca9 The initial commit of my project
f30ab (HEAD -> master, testing)
통해 master
브랜치를 가리키고 있는 것을 확인할 수 있다.git checkout
명령으로 현재 브랜치에서 다른 브랜치로 이동할 수 있다.
현재 master
브랜치에서 새로 만든 testing
브랜치로 이동하는 명령어는 다음과 같다.
git checkout testing
이렇게 하면 HEAD는 testing
브랜치를 가리키는 것을 확인 할 수 있다.
만약 다시 master
브랜치로 이동하고 싶으면, git checkout
명령을 사용하면 된다.
현재 브랜치가 가리키고 있는 히스토리가 무엇이고, 어떻게 갈라져 나왔는지 확인하려면 git log
명령를 입력하면 된다.
git log --oneline --decorate --graph --all
입력하면 히스토리를 출력한다.
git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
아래의 글은 Git 마스터 과정에서 배운 것을 정리한 내용입니다.
git hist
를 통해 branch에 대한 현재 상태를 확인할 수 있다.
checkout
을 하게 되면 원하는 버전으로 갈 수 있고, 원하는 branch로도 이동이 가능하다.
내가 원하는 branch로 이동하고 싶다면 checkout
, switch
둘 중 하나 선택해서 하면 된다.
git branch testing #create a new branch called testing
# 새로운 "testing"이라는 branch를 만든다.
git checkout testing #switches to testing branch
# testing branch로 이동하게 된다.
git checkout [hashcode]
# checkout 뒤에 hashcode를 입력하게 되면 해당 commit으로 이동하게 된다.
# 그리고 git hist를 통해 확인하면, (HEAD)가 최신 commit이 아니라,
# 방금 checkout한 commit을 가리키게 된다.
git switch testing #same as the above
# 다른 branch 로 이동할 때 switch를 사용한다.
git checkout -b testing #create and switch to testing
# 새로운 branch를 만들고 나서 동시에 새로운 branch에 이동이 된다.
# 밑의 git switch -C testing 과 같은 의미이다.
git switch -C testing #same as the above
# 새로운 branch를 만들고 나서 동시에 새로운 branch에 이동이 된다.
# ex) git switch -C new-branch : new-branch로 만들고 나서, new-branch로 이동하게 된다.
git branch #simple listing of all branches
#내 컴퓨터안의 branch들을 보여준다.
git branch -r #sees the remote branches
git branch --all #list including remote branches
# 서버에 있는 branch들의 모든 정보를 보여준다. Gitbub와 같은 서버
git branch -v #sees the last commit on each branch
# 간단하게 최신 commit들을 확인할 수 있다.
git branch --merged #sees merged branches
# 현재 merged된 branch들을 확인할 수 있다.
git branch --no-merged #sees not merged branches
# master branch에서 merge되지 않은, 즉 master branch에서 파생된
# 다른 변경사항, 다른 commit 있는 것을 보여준다.
git branch -d testing #deletes the branch
# testing이라는 branch를 삭제할 때 옵션 -d를 쓰면 된다.
git push origin --delete testing
# 원격에 있는 곳에도 삭제를 원할 시 사용한다.
git branch --move wrong correct #rename
# 이름을 correct로 변경하고 싶을 때
git push --set-upstream origin correct #push new name
# 원격에 업데이트 하고 싶을 때
# 원격에 correct라는 이름으로 업데이트 하고 싶을 때
git log branch1..branch2 #all the commits between branch1 and branch2
# branch1와 branch2 사이 commit을 확인하고 싶을 때 git log를 사용한다.
git diff branch1..branch2 #all the changes between branch1 and branch2
# 마찬가지로 코드를 확인하고 싶을 때 git diff를 사용한다.
# 로컬 Git 저장소 브랜치의 이름을 변경(수정)하는 방법
git branch -m [Old_branch] [New_branch]
# git branch의 m 옵션을 사용하면 브랜치의 이름을 변경할 수 있다.
# [Old_branch]에는 이름을 변경하고 싶은 브랜치를 지정하고,
# [New_branch]에는 새로운 브랜치 이름을 지정한다.
# GitHub 저장소 브랜치 이름을 변경(수정)하는 방법
git push origin [New_branch]
# 1. 로컬에서 변경한 [New_branch] 이름을 GitHub에 반영한다.
git push origin --delete [Old_branch]
# 2. 기존 origin에 있는 [Old_branch]를 삭제한다.
git push origin :[Old_branch] [New_branch]
# 1+2. 브랜치의 생성과 삭제를 한 번에 할 수 있다.
# [Old_branch]를 삭제하고, [New_branch]를 생성하는 방법이다.
아래의 글은 Git 공식 문서를 통해 배운 것을 정리한 내용입니다.
로컬 디렉토리 하나를 선택해서 Git 레포지토리를 적용하는 방법.
다른 어딘가에서 Git 저장소를 Clone 하는 방법.
우선 기존 프로젝트를 Git으로 관리하고 싶은 경우 해당 프로젝트가 있는 디렉토리로 이동하고 명령어를 입력한다.
Mac 기준 명령어는 다음과 같다.
cd /Users/user/my_project
git init
git init
명령은 .git
이라는 하위 디렉토리를 만든다는 의미이다.
Git이 파일을 관리하게 하려면 레포지토리에 파일을 추가하고 커밋해야 한다.
git add
: 파일을 추가하는 명령어 / git commit
: 커밋하는 명령어
git add " 파일이름 "
git commit -m " 커밋 메시지 "
기존 혹은 다른 프로젝트에서 Git 레포지토리를 복사하고 싶을 때 git clone
명령을 사용한다.
해당 명령어를 실행하면 프로젝트 히스토리를 전부 받아온다.
git clone <url>
명령으로 저장소를 Clone 한다.
devfancy.github.io에 있는 소스코드를 Clone하려면 아래와 같이 실행한다.
https://github.com/devfancy/devfancy.github.io.git
jun-yong
)으로 Clone 하고 싶을 경우 아래와 같이 입력하면 된다.https://github.com/devfancy/devfancy.github.io.git jun-yong
아래의 글은 Git 마스터 과정에서 배운 것을 정리한 내용입니다.
git init #initialise git -> git이 초기화됨.
rm -rf .git #delete .git
git status #full status
git status -s #short status -> 간편하게 확인하고 싶을 때
git과 github에 올리고 싶지 않은 파일들 → .gitignore 파일에 추가할 수 있다.
예) echo *.log > .gitignore ⇒ *.log라는 파일은 .gitignore
에 속해진다.
git add a.txt #stage a.txt file
git add a.txt b.txt #stage a.txt, b.txt files
git add *.txt #stage all files ends with .txt
git add * #stage all files except deleted files and files that begin with a dot
git add . #stage everything
git status
명령어를 통해 Staging area에 포함이 되는 것을 볼 수 있다.Removing files
rm file.txt #delete file
git add file.txt #add to staging area
# git add 를 통해 해당 파일을 staging area로 이동한다.
git rm file.txt # removes file from working directory and staging area
git rm --cached file.txt #removes from staging area only
git clean -fd #removes all untracked files
Moving files
git mv from.txt to.txt
git mv from.text /logs/from.text
git status #full status
git status -s #short status
git diff #changes in working directory
git diff --staged #changes in staging area
git diff --cached #same as --staged
버전을 만들때 쓰는 명령어다.
Staging area에 있는 변경사항을 Git repository에 옮겨주는 역할이다.
git commit #commit stagged files
git commit -m "Commit message"
# commit stagged files with commit message
git commit -am "Commit message" #commit all files with commit message
See history
git log #list of commits -> 누가, 언제, 추가한 내용을 보여준다.
git log --patch #shows the difference introduced in each commit
git log -p #same as --patch
git log --state #abbreviated states for each commit
git log --oneline #oneline -> 간편하게 한줄로 확인(제목)
git log --oneline --reverse #oneline, from the oldest to the newest -> 오래된 것부터 순서대로 확인한다.
Filtering
git log -2 #shows only the last n commits -> n번까지 출력할 것인지 예시에서는 2줄까지 출력한다.
git log --author="fancy"
git log --before="2022-01-01"
git log --after="one week ago"
git log --grep="message" #finds in commit messages -> message가 포함된 commit을 찾는다.
git log -S="code" #finds in the code
git log file.txt #logs only for file.txt
# 조금 더 자세히 보고 싶다면
git log -p file.txt
# 간단하게 보고 싶다면
git log -s file.txt
History of a file
git log file.txt #history of file.txt
git log --state file.txt #shows statistics
git log --patch file.txt #show the changes
git log -p # 위에 있는 git log --patch file.txt와 같은 명령어이다.
HEAD
git log HEAD
git log HEAD~1 # HEAD 바로 이전 첫번째 꺼를 보고 싶다면 => HEAD~1, HEAD이전 몇번째를 보고 싶다면 => HEAD~n
Viewing a commit
git show HEAD #shows the last commit
git show hash #shows the given commit
git show hash:file.txt
ex) 만약에 commit에 여러가지 파일들이 들어있다면, 그 중에서 user_repository.txt만 보고 싶다면
-> git show hash:user_repository.txt
Comparing
git diff hash1 hash2 #all changes between two commits
ex) git diff 5e27f5819e 0e0fe985e022 => 두가지 해쉬코드값을 보고 두 파일을 비교한다.
git diff hash1 hash2 file.txt #changes to file.txt only
이 글은 Git 공식 문서를 통해 배운 것을 정리한 내용입니다.
버전 관리 시스템
은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다.
버전 관리 종류에는 로컬 버전 관리, 중앙집중식 버전 관리(CVCS), 분산 버전 관리 시스템이 있다.