Published 2022. 8. 20. 16:18
반응형
  • 간단한 예제를 통해 Git의 기능들에 대해 정리
  • 아래와 같은 기능이 개발되어 있고 Github에 이 프로젝트를 올려둔 상황
  • (Github에 Repository 생성 및 프로젝트 업로드 : https://chb2005.tistory.com/18)

  • 여기에 기능들을 추가해가며 Git의 기능들에 대해 정리

프로젝트 다운받기

clone

  • clone은 Github에 올라가있는 프로젝트를 내 로컬에 그대로 가져오는 기능
  • 여러 사람들과의 협업, 로컬 프로젝트가 날아가는 상황 등에 필요한 기능
  1. 일단 로컬에서 프로젝트를 삭제
  2. Terminal(cmd)에서 프로젝트를 clone 받고 싶은 로컬 디렉토리로 이동
    • ex) Documents/DevStudy/Spring Boot
    • cd "Documents/DevStudy/Spring Boot"
  3. 아래 명령어 입력
git clone [깃허브 레포지토리 주소]
  • clone 완료
  • clone 후 버전 맞춰주는 작업을 잊지 말자

수정한 프로젝트 업로드

status

  • 로컬 환경에서 작업을 하면 코드에 변경 사항이 생김
  • 로컬 프로젝트 코드와 Github에 올라간 프로젝트 코드가 서로 달라짐
  • status 기능을 사용하면 어느 파일의 코드가 달라졌는지 확인할 수 있음

  • 로컬에서 다음과 같이 기능을 추가했다고 가정해보자
  • IntelliJ의 터미널에 아래 명령어를 입력
    • Terminal이나 cm에서 해도 상관 없음
git status

  • status 명령어를 사용했을 때 위와 같이 수정된 파일들이 표시됨
  • 수정 뿐 아닌 추가, 삭제 된 파일, 디렉토리들도 모두 표시됨

add

  • status를 통해 변경된 파일들을 확인했음
  • 이제 파일들을 add 명령어를 통해 스테이지에 올려줌
git add src/main/java/com/study/gitpractice/controller/HomeController.java
git add src/main/resources/templates/home.html
  • 위와 같이 변경된 파일을 하나씩 add 해줄 수 있음
    • status로 출력된 주소 복붙
git add .
  • 모든 변경된 파일들을 한번에 add 하기 위해선 git add .

commit

  • add 명령으로 스테이지에 변경된 파일들을 올려준 후 commit 진행
  • commit을 통해 이 시점까지의 add된 파일들을 저장해 줌
  • 이 때 commit message를 남겨 어떤 기능이 추가, 변경, 삭제 되었는지 남겨줄 수 있음
git commit -m "더하기 연산 결과 저장 및 출력"

remote

  • remote 명령으로 github repository와 연결
  • 클론 받은 프로젝트 혹은 한 번이라도 연결했던 프로젝트에선 따로 안해줘도 됨
git remote add origin https://github.com/Changbum97/git-practice.git

push

  • 마지막으로 push 명령을 통해 연결된 github에 현재까지의 commit 업로드
  • commit을 업로드 한다는 것은 commit을 통해 저장한 (스테이지에 올라간) 파일들의 변경 내용을 업로드 한다는 의미
git push origin master
  • master이 아닌 다른 branch에 올려주고 싶다면 master 대신 다른 브랜치명을 써주면 됨
  • 아래와 같이 확인 가능

브랜치 기능

  • 만약 이 프로젝트가 실제로 서버에서 운영중인 프로젝트라고 생각해보자
  • 추가 기능을 개발하고 여러명의 개발자가 master 브랜치(운영되는 브랜치)에 바로바로 push한다면 여러가지 문제가 생길 수 있음
  • 이를 방지하기 위해 보통 develop 와 같은 브랜치들을 만들고 거기에 추가 기능을 모아놓음
  • develop 브랜치를 통해 추가 기능들을 테스트해보고 한번에 master 브랜치에 적용시킴

branch

  • branch 명령어를 통해 브랜치의 상태와 현재 어느 브랜치에서 있는지 확인 가능
git branch

  • 아직은 master 브랜치 밖에 없고 현재 master 브랜치에 있음
  • develop 브랜치를 만들어보자
git branch develop

  • develop 브랜치가 생긴 것을 확인할 수 있음

checkout

  • 이제 develop 브랜치로 이동해 보자
git checkout develop

branch 생성 + checkout 한번에

  • develop2 브랜치 생성 후 바로 checkout까지 할 수 있는 명령어
git checkout -b develop2

IntelliJ로 branch 관리

  • 아래와 같이 IntelliJ 화면 우측 하단에 branch를 클릭해 생성 및 이동 가능

새로운 branch push

  • 로컬 프로젝트에서는 develop 브랜치를 생성해 줬지만 Github에는 아직 master 브랜치 밖에 없음
  • develop 브랜치를 Github에 push 하기 위해서는 아래의 명령어 입력
git push origin develop
  • 이제 Github Repository에 가보면 아래와 같이 develop 브랜치도 생긴 것을 확인할 수 있음

브랜치 분리, 합치기(merge)

  • 이제 이 프로젝트에 사칙 연산 기능과 기록 삭제 기능을 추가해야 한다고 가정해보자
  • 먼저 develop 브랜치에서 개발이 되야 되기 때문에 checkout으로 develop 브랜치로 이동
  • 그 다음 develop 브랜치에서도 직접 개발하지 않고 develop 브랜치에서 feature/four-operation 브랜치를 분기시킴
git checkout -b feature/four-operation develop
  • 이제 feature/four-operation 브랜치에서 사칙 연산 기능을 개발

  • 개발 완료
  • add, commit, push로 변경 사항들을 feature/four-operation 브랜치에 push
git push origin feature/four-operation
  • 이제 다음 기능인 기록 삭제 기능을 개발해보자
  • develop 브랜치로 다시 checkout 해보면 사칙 연산 기능 구현 코드들이 사라져있음
  • 이 상태에서 다시 feature/clear-history 브랜치 분기 후 작업 진행
git checkout -b feature/clear-history develop

  • 개발 완료
  • add, commit, push로 변경 사항들을 feature/clear-history 브랜치에 push
  • 이제 Github에 가보면 아래와 같이 알림이 떠있음

  • 사칙 연산 기능부터 확인해 봄

  • base(합쳐질 branch)가 develop인지 반드시 확인
  • 협업 진행 시 Reviewers에 코드 리뷰를 해 줄 사람을 지정하기도 해서 코드 리뷰 통과 시 적용시키기도 하는데 일단은 Reviewers 없이 진행

  • 위와 같이 추가된 코드들은 초록색 삭제된 코드들은 빨간색으로 표시됨
  • 이 변경사항들을 모두 확인 후 통과시키고 싶으면 Pull Request 버튼 클릭

  • 이제 프로젝트의 Pull Requests 탭에 들어가보면 위와 같이 Merge를 할 수 있는 페이지가 나옴
  • 보통 여기서 코드 리뷰를 진행한다는데 일단 바로 Merge 진행
  • 기록 삭제도 같은 순서로 진행
  • 이제 두 기능이 모두 develop 브랜치로 합쳐진 것을 확인할 수 있음
  • develop 브랜치의 HomeController 코드
@Controller
public class HomeController {

    List<Numbers> histories = new ArrayList<>();

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("numbers", new Numbers());

        List<String> operations = new ArrayList<>();
        operations.add("+");
        operations.add("-");
        operations.add("*");
        operations.add("/");
        model.addAttribute("operations", operations);

        return "home";
    }

    // 사칙연산 기능 추가
    @PostMapping("/")
    public String add(@ModelAttribute Numbers numbers, Model model) {

        if(numbers.getOp().equals("+")) {
            numbers.setAnswer(numbers.getX() + numbers.getY());
        } else if(numbers.getOp().equals("-")) {
            numbers.setAnswer(numbers.getX() - numbers.getY());
        } else if(numbers.getOp().equals("*")) {
            numbers.setAnswer(numbers.getX() * numbers.getY());
        } else {
            numbers.setAnswer(numbers.getX() / numbers.getY());
        }

        histories.add(numbers);
        model.addAttribute("numbers", numbers);
        model.addAttribute("histories", histories);

        List<String> operations = new ArrayList<>();
        operations.add("+");
        operations.add("-");
        operations.add("*");
        operations.add("/");
        model.addAttribute("operations", operations);

        return "home";
    }

    // 기록 삭제 기능 추가
    @GetMapping("/clear-history")
    public String clearHistories(Model model) {
        histories.clear();
        model.addAttribute("numbers", new Numbers());
        return "redirect:/";
    }
}
  • 이런 식으로 develop 브랜치에서 기능별로 다시 브랜치를 파서 작업 진행 후 develop 브랜치로 merge
  • 나중에 이런 기능들을 모은 develop 브랜치를 한 번에 master 브랜치로 올림

merge

  • 위의 과정을 진행하면 원격에서의 Merge는 끝났음
  • 하지만 로컬의 develop 브랜치에 가보면 기능들이 추가되어 있지 않음
  • 이런 상황에서는 merge 되어있는 원격의 develop 브랜치를 pull 받거나 로컬에서 develop 브랜치로 merge 하는 방법이 있음
  • 로컬의 develop 브랜치로 merge를 해보자
git checkout develop
git merge feature/four-operation
git merge feature/clear-history
  • develop 브랜치로 이동 후 두개의 추가 기능을 merge 하는 코드
  • 두 브랜치를 mege한 후 develop 브랜치의 코드를 확인해 보면 두 기능의 코드들의 변경 부분이 모두 적용된 것을 확인 할 수 있음

Branch 삭제

  • 이제 feature/four-operation, feature/clear-history 브랜치는 필요 없어졌으므로 로컬, 원격에서 모두 삭제해줘도 됨
  1. 로컬 branch 삭제
git branch -d feature/four-operation
git branch -d feature/clear-history
  1. 원격 branch 삭제
  • Github에서 아래 표시한 View all branches 클릭

  • merge 완료된 branches 삭제

  • 다시 github 레포지토리로 가서 확인해보면 브랜치들이 지워진 것을 확인할 수 있음

원격의 수정사항 받아오기

  • 처음 원격의 프로젝트를 받아올 때는 clone을 사용했었음
  • 내 로컬에 프로젝트가 이미 받아져 있는데 수정사항만 따로 받아보고 싶다면 프로젝트를 지웠다가 clone을 해도 되긴 하지만 비효율적임
  • 이런 상황에서는 pull이나 fetch 기능 사용 가능
  • 원격의 프로젝트가 내가 아닌 다른 사람에 의해 수정되었고 내가 이 수정사항을 받아와야 되는 경우나 서버에 올린 코드를 수정해야 되는 경우 등에서 pull이나 fetch를 사용

pull

  • 아직은 로컬 프로젝트와 원격 프로젝트의 master 브랜치에는 추가 기능들이 반영되지 않았음
  • 먼저 원격 프로젝트의 master 브랜치에 develop 브랜치의 변경 사항들을 merge 시킴
  • 이제는 로컬 프로젝트의 master 브랜치에만 추가 기능들이 반영되지 않은 상황
  • 원격 프로젝트의 master 브랜치를 로컬 프로젝트의 master 브랜치에서 pull 받는다면 추가 기능들이 반영될 것임
  • 로컬의 master 브랜치로 checkout 후 실행해야 됨
git pull origin master
  • 이제 로컬의 master 브랜치에도 추가 기능들이 반영된 것을 확인할 수 있음

fetch

  • pull = fetch + merge
  • 위에서 해봤듯이 pull 명령어를 사용하면 변경 사항들이 바로 로컬의 브랜치에 적용됨
  • fetch 명령은 로컬로 변경 사항들을 가져오기는 하지만 바로 merge 시키지 않고 개발자가 변경 사항들을 직접 확인하고 merge 할 수 있게끔 해주는 기능
  • fetch 기능을 사용해보기 위해 먼저 방금 받은 pull을 취소해봄
git reset --hard ORIG_HEAD
  • 이제 다시 pull 받기 전의 master 브랜치로 돌아옴
  • 여기서 원격의 master 브랜치를 fetch 해보자
git fetch origin master
  • master 브랜치의 코드에는 아무 변화가 없고 터미널에는 아래와 같이 출력됨

diff

  • diff 명령어를 통해 로컬의 master 브랜치와 FETCH_HEAD를 비교해보자
git diff master FETCH_HEAD
  • 아래와 같은 결과가 출력되는데 현재 master 브랜치와 비교했을 때 추가되는 코드는 초록색, 삭제되는 코드는 빨간색으로 출력됨
  • 이 결과를 보면서 어느 부분이 달라졌는지 확인 가능

  • 'q'를 눌러 diff 출력 화면에서 나갈 수 있음

merge

  • 이 변경 사항들을 로컬 master 브랜치에 적용하고 싶다면 merge 명령어 실행
git merge master FETCH_HEAD
  • 이제 다시 master 브랜치의 코드에 변경 사항들이 적용된 것을 확인할 수 있음
반응형

↓ 클릭시 이동

복사했습니다!