본문 바로가기

Study/GitHub

Git | reset, branch, merge, stash

1. Git reset

reset을 통해 commit취소하여 과거로 돌아갈 수 있다.

 

간단하게 리뷰하여 작성하자면,

과거의 commit으로 돌아가기위해 reset과 revert를 사용할 수 있고 둘의 사용법은 약간의 차이가 있다.

 

 

1) git reset

(우선 reset을 하며 기록이 날아가는 사고를 방지하기 위해 .git폴더를 카피한 후에 진행하는 편이 안전할 것으로 보인다.)

 

git log로 로그를 봤을 때, 

commit message 3 이후의 log, 즉 4와 5에 해당하는 로그를 삭제하고자 한다면

git reset [3의 해시코드] --hard

를 통해

commit message 4, 5에 해당하는 log를 지울 수 있다.

 

참고할 사항은 

git은 웬만하면 버전정보를 삭제하지 않는다.

그래서 실제로는 남아있지만 우리눈에 보이지 않을 뿐, 필요하면 복구할 수 있다.

 

그리고 또 하나 중요한 점,

저장소의 버전들을 공유한 이 후에는 절대 reset을 하면 안된다.

공유하기 전, 로컬에 있는 로그만 reset을 해야 한다.

 

 

2) git revert

revert는 reset과 비슷한 효용을 가지지만,

원하는 타겟 커밋을 취소하면서 새로운 커밋을 생성하는 차이점이 있다.

 

현재는 reset과 revert가 있다는 것 정도로 이해를 하고 넘어가기로 하자.

 

 

 

2. Git branch

1) branch 생성

git commit -m "commit message"
*/에디터 창을 열지않고 commit message를 작성할 수 있다./*
git commit -a
*/자동 add 후 commit이 진행된다. 이 때, 한 번도 add가 되지 않은 파일은 자동 add가 되지 않는다./*

 

특별한 기능 추가할때 원래 소스코드를 해치지 않으면서 기능 추가하거나,

테스트로 개발을 진행하고 삭제할 수 도 있게 되는 경우이거나.

테스트를 진행하면서 서버에 올리게 되어 메인을 해치면 안되는 경우 등등

위의 예시들 처럼 분기를 나누어서 버전관리를 진행할 때, branch를 사용하게 된다.

 

git branch

를 터미널에 입력하게 되면 

branch 목록과 함께 *가 붙어있는 현재 branch의 위치 또한 알 수 있다.

 

git branch [생성할 branch name]
*/새로운 branch 생성, 생성한 branch는 속해있는 branch를 그대로 복사하여 가진다./*

git checkout [branch name]
*/해당 branch로 이동/*

일례로 master 브랜치에서 exp라는 브랜치를 생성한 후 exp에 checkout하여 들어간다.

이때,  ls- al을 해보면 master와 동일한 것을 확인 할 수 있다.

 

현재 위치인 exp에서 파일을 수정하고 커밋하면 exp에는 적용되고 master에는 적용되지 않는다.

 

 

2) branch 정보확인

git log --branches --decorate
*/저장소에 있는 모든 branch를 확인 할 수 있다/*

위 명령어를 통해 branch들의 위치와 상태, 차이를 확인할 수 있다.

 

위 그림을 보면 (master)와 (HEAD -> exp)를 확인 할 수 있다.

 

(branch name) 은 해당 라인이 해당 브랜치의 최신 커밋 상태라는 것을 알려주고,

(HEAD -> branch name)은 해당 브랜치의 최신 커밋 상태와 함께 현재 checkout되어 있는 브랜치를 알려준다.

 

 

위 차이점들을 조금 더 고도화 하여 log로 볼 수 도 있다.

git log --branches --decorate --graph
*/나누어진 분기들을 그래프화하여 표시한다/*

 

graph를 통해 위 그림처럼 공통의 commit을 볼 수 있고,  분기가 나누어지는 시점과 branch의 커밋 상태까지 확인 할 수 있다.

 

git log --branches --decorate --graph --oneline

위 명령어를 통해 아래 그림처럼 조금 더 간결하게 확인하는 방법도 있다.

 

 

그리고 버전과 버전사이의 차이점을 보고자 할 때

git log [branch A] ..[branch B]

를 통해 차이를 볼 수 있는데, A에는 없고 B에는 있는 것을 log로 나타낸다.

 

예를 들어 git log master ..exp 는 master에 없고 exp에 있는것 보여주고

git log -p exp ..master 는  exp에 없고 master에 있는것 보여주며,  -p 소스코드의 차이까지 볼 수 있다.

 

 

 

또한 diff를 통해 각 브랜치들의 현재 상태를 비교할 수 있다.

git diff [branch A]..[branch B]

 

각 파일별로  b 브랜치에만 있는 코드는 +초록색으로

a 브랜치에만 에만 있는 코드는 -빨간색으로 나타나 소스코드의 차이를 알 수 있다.

 

 

+추가

git checkout -b [branch명]
*/-b로 브랜치를 만들면서 checkout까지 함께 된다./*

 

 

 

 

3. Git merge 

merge를 통해 branch를 병합할 수 있다.

 

merge를 위해서는 merge할 branch로 checkout한 후, 병합할 branch를 선택해 merge를 진행한다.

git merge [병합될 branch name]

 

일례로 exp의 변경사항만 master로 병합하고자 한다면, master 브랜치로 checkout한 후

git merge exp 명령어를 입력한다.

이 때, 명령어 입력과 동시에 에디터가 열리며 commit message 자동 작성된 것을 확인 할 수 있다.

 

git log --branches --decorate --graph
*/나누어진 분기들을 그래프화하여 표시한다/*

위 명령어로 그래프를 비교하여 보게되면 

그림과 같이 같은 commit에서 시작한 branches들과 분기점, master에 exp branch가 merge된 것까지 확인 할 수 있다.

 

 

위와 동일한 방법으로 

exp 분기로 checkout하고 git merge master를 진행하게되면, 두 분기가 완전히 같아진 상태가 된다.

 

 

추가로 불필요해진 분기는 -d명령어를 통해 삭제하여 정돈할 수 있다.

git branch -d [branch name]
*/-d 명령어를 통해 언급한 브랜치가 삭제된다/*

 

 

 

4. branch 수련

공식홈페이지 docs중 git branching - basic branching and merging를  참고하여 강의를 진행한다.

 

사실 이 부분은 자세하게 이해가 되지 않아서 전반적으로 강의를 들은 후 원리 수업과 함께 다시 들으면 좋을 것 같다.

https://www.youtube.com/watch?v=k8fsn335YLQ&list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk&index=24 

 

 

 

5. Git stash

branch에서 작업하던 내용이 끝나기 전에 타branch로 checkout해야할 경우,

현재 branch의 작업을 깔끔하게 만들고 다른 branch로 이동할 수 있는데, 이 작업을 stash를 통해 할 수 있다.

 

즉, stash를 통해 작업 내용을 숨겨놓을 수 있다.

 

 

stash의 기능을 이용하지 않았을 때,

a브랜치에서 수정했던 파일이 b브랜치로 checkout하여 status에도 modified file로 분류된다.

branch 이동과 관계없이 수정 파일이 추적되는 것이다. 

 

git stash

명령을 통해, working directory와 index가 현재 branch(head)에 저장되었다는 것을 확인할 수 있다.

 

stash로 작업내용을 숨긴 다음 status를 확인해보면 

작업내용이 잘 숨겨진 것을 확인할 수 있다.

 

때문에 다른 branch로 checkout해도 작업물이 추적되지 않으며, 타 branch에서 작업을 완료하고 돌아와 숨긴 작업물을 복구하여 다시 작업을 진행 할 수 있다.

 

git stash apply
*/숨긴 작업물 복구/*
git stash list
*/stash list확인, 최신 stash가 {0}번째 stash (stack구조)/*
git stash drop
*/{0}번째 stash 삭제/*

git stash apply; git stash drop;  
== git stash pop
*/최근 작업물 불러오기 및 list에서 제거/*

 

앞서 설명한 대로 수정되는 작업물은 branch를 이동해도 추적되는 것을 확인 할 수 있다.

이를 통해 stash는 버전 관리 중인 파일에만 적용할 수 있고 untracked file에는 적용되지 않는 것을 알 수 있다. 

 

 

 

 

6. Git branch 충돌해결

merge 과정에서 파일 내용 서로다를 경우 충돌일어날 수 있다.

 

merge할 때 두 파일이 다르면 자동으로 합쳐지게 되고, 두 파일이 같더라도 다른 부분을 수정한 후 merge하는 것 까진 자동 병합이 가능하다.

 

 

그러나 두 파일이 같고, 수정하는 부분까지 같다면

conflict로 unmerge되는 것을 확인 할 수 있다.

 

 

vim에디터로 해당 파일을 열어 확인해보면,

<<<<<<< HEAD (현브랜치)
소스코드
=======
소스코드
>>>>>>> 타브랜치

의 형식을 확인할 수 있다.

 

에디터 내에서 구분자와 표시기호등을 없애고 소스코드를 적절하게 수정하여 add와 commit까지 알맞게 진행을 하면,

commit message와 함께 confilcts 내역까지 확인 할 수 있다.

 

 

 

 

 

 

 

 

+ git [명령어] --help

--help 혹은 -h 를 통해 해당 명령어의 기능을 살펴볼 수 있다.

추가적으로 궁금한 부분이나, 알고 싶은 부분은 help를 적극 이용하도록 한다.

 

 

 

모든 출처는 생활코딩 지옥에서 온 Git

'Study > GitHub' 카테고리의 다른 글

GitHub | 여러계정 이용하기  (0) 2022.03.27
GitHub | 원격저장소와 동기화  (0) 2022.03.27
Git | add, commit, log & diff  (2) 2022.03.05
Git | init  (0) 2022.03.04
GitHub 블로그 만들기  (0) 2022.03.03