티스토리 뷰
이 블로그에서는 크게 파일을 커밋하는 방법에서 브랜치 만들기 및 병합 개념까지 다룬다.
그리고 이 블로그 내용은 코딩애플분의 강의를 참고하였다.
https://codingapple.com/unit/git-add-commit/?id=37473
https://codingapple.com/unit/git-3-branch-and-switch/?id=37473
------------------------------------------------------------------------------------
🟩 작업 폴더 파일들 상태 관리하기(git init)
작업폴더에 있는 파일의 상태를 관리하고자 한다면,
해당 작업 폴더에서 git init을 입력한다.
그러면 git이 해당 폴더에서 일어나는 일들(파일 생성, 코드 작성 등)을 추적하기 시작한다.
🟩 현재 파일의 상태 기록하기 (git add, git commit)
그러면 이제 이 git을 이용해서 현재 파일의 상태를 기록해보자.
git add <파일명>
git commit -m '메시지'
이 명령어를 순서대로 입력한다면 해당 파일의 현재 내용을 어딘가에 기록을 해준다.
즉, 시간에 따라서 버전관리를 할 수 있는 것이다.
이제 git 용어를 통해서 이 두 명령어가 어떤 기능을 하는지 좀 더 자세히 설명해보자.
🟩 용어정리(staging area, repository)

새로운 용어인 staging area, repository를 설명해보도록하자.
1. staging area는 commit하기 전에 commit할 파일들을 골라놓는 곳이다.
우리는 이 작업을 git add 명령어로 한 것이다.
또 git add를 통해서 commit할 파일들을 골라서 staging area에 넣는 행위를 staging이라고 한다.
즉 간단하게 말해서, 우리는 git add를 통해서 staging을 하는 것이다.
2. repository는 commit된 파일의 버전들을 모아놓는 곳이다.
참고로 repository에 파일들이 어떻게 저장되어 있는지 알아보려면 작업폴더에 숨겨져 있는 .git 폴더를 열어보면 된다고 한다.
마지막으로
지금 변경된 파일, 스테이징된 파일 등등 현재 작업 폴더와 staging area의 상태를 보여주는 git status 명령어,
commit 기록을 한 눈에 파악하고 싶을 때 사용하는 git log 명령어,
스테이징된 파일을 취소하고 싶을 때 사용하는 git restore 등등의 명령어도 있다는 점 정도 알아두자.
git log --all --oneline
(많이 쓸거 같아서 적어둠)
🟩 브랜치 만들기, 브랜치 이동(switch)
상황을 가정해보자.
우리가 쇼핑몰을 만들고 있는데, 쿠폰 기능과 같은 새로운 기능이 필요하다.
하지만, 원래 있던 소스코드를 직접 수정하고 커밋하는 방식으로 할 수도 있겠지만, 혹시나 잘못해서 프로그램이 망가질 수도 있을 것이다.
따라서, 위험하고 복잡할 것 같아서 원래있던 소스코드를 직접 수정하는게 아니라,
프로젝트 사본을 만들고, 이곳에 먼저 개발을 해보는 방법도 있다.
이때 우리는 브랜치를 하나 만들어서 개발해볼 수 있다.
git branch <브랜치명>
그리고 이렇게 만든 브랜치로 이동하려고 한다면, git swtich 명령어를 사용하면 된다.
git switch <브랜치명>
아래는 test라는 브랜치로 만들고, test 브랜치로 이동하는 예시이다.
*기존 브랜치(master) --> test 브랜치

각각 브랜치에서 작업한 내용은 서로 영향이 없다.
즉, test브랜치에서 작업한 내용은 master브랜치에 전혀 영향을 끼치지 않는다.
🟩 브랜치 병합(merge)
만약 main(또는 master)브랜치 외의 다른 브랜치에서 작업한 코드가 잘 작동하고 마음에 든다면,
우리는 해당 브랜치에 있는 코드를 원본 코드가 있는 main(또는 master) 브랜치에 합치면 된다.
브랜치를 합치는 것을 전문용어로 merge(병합)이라고 한다.
즉, merget하고 싶다면,
1. (원본 코드가 있는 브랜치인) main(또는 master) 브랜치로 다시 이동하고,
2. git merge <브랜치명> 입력하면 합쳐집니다.
명령어는 다음과 같다.
git switch main
git merge <병합하고자하는 브랜치명>
하지만! 이때 병합할 때 발생할 수 있는 충돌 문제에 대해서 이야기 해보고자한다.
🟩 병합시 일어나는 CONFLICT
원본 코드가 있는 master 브랜치와 git branch명령어를 통해 만든 test브랜치가 있다고 하자.
master 브랜치에 있는 같은 코드에 같은 줄을 수정하고 커밋했다.
그리고 test브랜치에서 master 브랜치에서 수정했던 같은 코드의 같은 줄을 또 수정하고 커밋했다.
그리고 난후, master브랜치로 이동하여 git merge test명령어를 입력한다.
이러한 경우 CONFLICT가 일어난다.
즉,

같은 조상 파일에서 같은 줄을 다르게 수정하였을때 발생한다.
(이해를 돕기 위해 조상이라고 말했다.)
이해를 돕기 위해 실제 예시를 살펴보자. (출력 문자열의 의미는 굳이 신경 쓰지말기. 그냥 막 넣은거다.)
Main.java 파일을 master브랜치에서 다음과 같이 생성하였다.
public class Main {
public static void main(String[] args) {
System.out.printIn("In master branch");
}
}
이후,
master 브랜치에서 아래와 같이 수정하였다. (커밋)
public class Main {
public static void main(String[] args) {
System.out.printIn("In mastermaseter branch");
}
}
이후, test 브랜치를 만든 후, 똑같이 Main.java 파일의 같은 줄을 아래와 같이 수정하였다. (커밋)
public class Main {
public static void main(String[] args) {
System.out.printIn("In testtestx2 branch");
}
}
그리고 master 브랜치에서 git merged test 명령어를 입력하면?? 아래와 같은 화면을 볼 수 있다.


충돌이 일어났다는 의미이다.
이 경우,
<<<< / >>>> / ==== 이런 쓸데없는 것들은 다 지우고 원하는 코드만 남기면 된다.
(인텔리제이 및 VScode의 경우 Resolve conflicts와 같은 버튼들을 제공해준다. (사실 VScode도 Resolve conflicts와 같은 버튼을 제공해주는 지는 모르겟지만, 비슷한 기능을 제공하긴한다.)
아무튼 그렇게 남기고자하는 코드를 선택했다면,
커밋을 해줌으로써 마무리지어준다.
협업 시, 이 branch는 매우 유용하게 사용된다고 한다.
End.
