본문 바로가기
Java/Git

git) branch

by 박채니 2022. 6. 14.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


branch 생성하는 이유

- 여러 작업을 각 branch별로 생성할 수 있음

- 완성본만 갖고 있는 master와 버그를 수정하는 bugfix, 새로운 기능을 만드는 feature 등으로 나눠서 작업을 할 수 있으며, 만일 feature가 망해서 필요없어진다면, 그냥 branch를 삭제해버리면 됨

하지만 하나의 branch에서 작업했다면 feature내용만 삭제해버리기엔 번거로움이 많음

 

branch 확인하기

Git Repositores - Local

 

branch 생성하기

프로젝트 우클릭 - Team - Switch To - New Branch

animal branch가 잘 추가된 것을 확인할 수 있으며, Check out new branch에 체크를 한 후 Finish 하였기 때문에 현재 작업 중인 branch가 animal로 옮겨졌습니다.

따라서 animal에 체크 표시가 되어있고, 프로젝트 옆에 branch도 animal로 변경되었을 겁니다.

 

animal branch에서 Dog 클래스 추가

animal branch와 현재 작업 중인 HEAD가 표시되는 것을 확인할 수 있습니다.

 

다시 master branch로 check out 해보겠습니다.

프로젝트 우클릭 - Team - Switch To - master 클릭

혹은 Git Repositories - check out할 branch 더블클릭

master에서는 animal의 작업 내용을 확인할 수 없는 것을 확인할 수 있습니다.

 

다시 animal branch로 check out

bark() 메소드 추가하기

public class Dog {
	public void bark() {
		System.out.println("멍멍!");
	}
}

 

HelloGit에서 bark() 메소드 호출

package com.kh.git;

import com.kh.git.animal.Dog;

public class HelloGit {
	public static void main(String[] args) {
		System.out.println("HelloGit!!");
		
		// Dog 기능 추가
		Dog dog = new Dog();
		dog.bark();
	}
}

@콘솔출력값
HelloGit!!
멍멍!

 

해당 작업내용 관련 버전 생성하기

history 상에서 animal이 master보다 2단계 더 앞서있고, 반대로 master는 animal보다 2단계 더 뒤쳐져있다는 것을 알 수 있습니다.

 

또한 각각의 버전 상에도 parent와 child의 관계를 갖고 있습니다.

id 76bfd42의 parent는 c9ce~로 시작하는 버전이고, 이를 클릭하면 c9c2ead 버전으로 이동합니다.

각각의 버전을 1개 이상의 parent와 child를 가질 수 있습니다. 


merge

 

fast-forward-merge

- 병합하고자 하는 branch가 나를 온전히 포함하고 있을 때 일어남

- Never conflict

현재 history를 확인하면 master에 이어서 animal branch를 생성하여 작업을 이어간 후 완료하였습니다.

즉, animal의 기능을 master에게 주고 싶은 것이고, 이 때 master가 animal을 merge합니다.

병합된 버전을 하나 생성할 수도 있겠지만, 현재 상황에선 animal이 master을 온전히 포함하고 있으므로 버전을 생성하지 않고 그대로 animal을 흡수하게 됩니다. (fast-forward-merge)

이런식으로 merge!

 

병합을 위해 master로 check out 한 후 merge해줍니다.

프로젝트 우클릭 - Team - Merge

merge하고 싶은 branch를 선택 후 Merge!

Fast-forward 방식으로 Merge된 것을 확인할 수 있으며, history 상에도 버전이 생성되지 않고 master가 빨리감기하여 병합하였습니다.

이제 master branch에서도 animal에서 작업한 내용을 확인할 수 있습니다.

 

@실습 - animal branch에 Cat 기능 추가한 후 merge하기

package com.kh.git.animal;

public class Cat {
	public void miao() {
		System.out.println("야옹~");
	}
}

 

package com.kh.git;

import com.kh.git.animal.Cat;
import com.kh.git.animal.Dog;

public class HelloGit {
	public static void main(String[] args) {
		System.out.println("HelloGit!!");
		
		// Dog 기능 추가
		Dog dog = new Dog();
		dog.bark();
		
		// Cat 기능 추가
		Cat cat = new Cat();
		cat.miao();
	}
}

@콘솔출력값
HelloGit!!
멍멍!
야옹~

 

non-fast-forward merge

- conflict 날 수도 있음!

 

animal branch에서 Dog에 기능 추가하기

public class Dog {
	private String name;
	
	public void bark() {
		System.out.println("멍멍!");
	}
}

 

New branch bugfix 생성 (master에서 - master로 체크아웃 필요!)

 

bugfix에서 bark()메소드에 왈왈! 추가

public class Dog {
	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

 

bugfix에서 추가한 왈왈! merge하기

bugfix가 master를 온전히 포함하고 있었기 때문에 Fast-forward merge가 되었습니다.

 

이번엔 master가 animal을 merge해볼건데, master는 이미 bugfix로 merge가 되었으므로 animal은 master를 온전히 포함하고 있지 않습니다.

따라서 animal을 merge한 버전을 하나 생성해줄 것 같습니다.

package com.kh.git.animal;

public class Dog {
	private String name;
	
	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

 

bugfix, animal에서 master marge

 


conflict

- 같은 파일, 같은 위치를 수정한 경우 반드시 conflict 발생

(같은 위치는 라인 넘버가 아닌 기존에 있던 코드 대비 위치를 따짐)

 

animal branch에서 필드 추가

package com.kh.git.animal;

public class Dog {
	private String name;
	private String breed;	// animal branch에서 추가
	
	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

 

master branch에서 필드 추가

package com.kh.git.animal;

public class Dog {
	private String name;
	private String[] colors;	// master branch에서 추가
	
	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

 

master에서 animal merge

package com.kh.git.animal;

public class Dog {
	private String name;
<<<<<<< HEAD
	private String[] colors;	// master branch에서 추가
=======
	private String breed;	// animal branch에서 추가
>>>>>>> refs/heads/animal
	
	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

같은 위치를 수정하였기 때문에 conflict가 발생하였고, merge된 버전이 생성되지 않았습니다.

conflict 시 수동 commit 버전으로 변경되며, 이를 해결 후 직접 commit 해줘야 합니다.

 

또한, 코드 상에 conflict 메세지가 표시 되는데, 

HEAD(현재 작업중인 branch)에서는 private String[] colors인데

========

refs/heads/animal에서는 private String breed이야 이 중 뭐를 marge해야 되는거야? 라고 하는 겁니다.

 

상황에 따라 코드를 수정한 후(conflict 메세지 삭제 필수!) 수동으로 commit을 해주면 됩니다.

저는 두 코드 모두 사용한다고 가정해보겠습니다.

package com.kh.git.animal;

public class Dog {
	private String name;
	private String[] colors;	// master branch에서 추가
	private String breed;	// animal branch에서 추가

	public void bark() {
		System.out.println("멍멍!");
		System.out.println("왈왈!");
	}
}

merge가 잘 된 것을 확인할 수 있습니다.

 

지금까지 local_repository에서 관리하였고, 이를 github 원격저장소 remote_repository에 push해볼겁니다.

 

 

'Java > Git' 카테고리의 다른 글

git) push와 fetch(pull)  (0) 2022.06.14
git) 버전 생성 및 관리  (0) 2022.06.14
git) 이클립스 환경설정  (0) 2022.06.14