Git

깃으로 협업하기 - 실습편

Minny27 2023. 6. 9. 12:00

준비물: Xcode, Terminal

Git Clone은 생략하겠습니다.

※ 우리팀 룰:

  1. develop 브랜치에 작업을 최신화한다(쌓는다)
  2. 배포(스토어에 버전 업데이트)할 때 main에 쌓아서 배포한다.

(편의상 develop을 dev라고 하겠습니다.)

항상 현재 브랜치를 dev로 최신화(pull, merge)를 하고 작업을 시작합니다.(다른 개발자의 작업이 dev에 merge됐을 수 있음)

터미널에서 작업 할 때, 항상 .git 파일이 포함되어 있는 경로로 이동해서 깃 명령어를 수행합니다.

전체 과정은 다음과 같습니다.

# develop으로 head 옮기기
git checkout develop

# devlop에서 will이라는 브랜치 생성
git checkout -b will

# 완료된 작업 임시저장
git stash

# develop으로 head 옮기기
git checkout develop

# develop 최신화
git pull

# will로 head 옮기기
git checkout will

# will을 develop으로 최신화하기(merge)
git merge develop

# 임시저장한 작업 불러오기
git stash apply stash@\{0\}

# 충돌 수정 후, add commit push

(각각의 명령어는 추후에 순서대로 설명하겠습니다.)

1. 브랜치 생성하기

항상 브랜치를 생성할 때는 현재 head가 어느 브랜치에 위치하고 있는지 확인합니다.

# 깃 생성
git branch will

# 깃 체크아웃
git checkout will

# 깃 생성 후 체크아웃
git checkout -b will

dev에서 will이라는 브랜치를 생성 후 체크아웃

이러면 dev의 코드기반으로 분기가 나눠집니다.

현재 dev 브랜치의 코드가 다음과 같다고 가정하겠습니다.

class ViewController: UIViewController {

    let textLabel: UILabel = {
        let label = UILabel()
        label.text = "Hello World!"
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        setupUI()
    }

    private func setupUI() {
        view.addSubview(textLabel)

        NSLayoutConstraint.activate([
            textLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            textLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
}

그런데 다른 개발자가 textLabel에 텍스트를 “plus person gogo”로 변경하고 텍스트 색깔을 blue로 변경했고, 이를 develop에 머지했다고 가정하겠습니다.

그리고 나(will)은 textLabel의 텍스트를 “Will Nice!”로 수정했다고 가정하겠습니다.

현재 dev 브랜치

class ViewController: UIViewController {

    let textLabel: UILabel = {
        let label = UILabel()
        **label.text = "plus person gogo"**
        **label.textColor = .blue**
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

        { ... }
}

현재 will 브랜치

class ViewController: UIViewController {

    let textLabel: UILabel = {
        let label = UILabel()
        **label.text = "Will Nice!"**
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

        { ... }
}

2. 모든 작업이 완료되면, 자신의 작업을 임시저장(stash)합니다.

git stash

git stash list 를 입력하면 다음과 같은 리스트가 생깁니다.

3. dev 브랜치 최신화

git checkout develop
git pull

하지만 다음과 같이 git pull을 수행했을 때, 에러가 발생할 수 있음

기본적으로 우리가 merge하는 방식으로 merge를 하고 싶을 때는

git config pull.rebase false 로 pull받으면 됩니다.

4. will 브랜치를 dev 브랜치로 최신화(merge)

git checkout will
git merge develop

만약 stash하는 것을 까먹었다면 충돌 수정 후, add commit push

5. 임시 저장한 작업 불러오기

git stash apply stash@\{0\}

git stash list 로 먼저 검색 후, 해당 인덱스를 넣어 주면 됨.

6. 충돌 수정

임시 저장한 작업을 불러오면, 프로젝트에서 다음과 같은 에러가 발생함

여기서 Updated upstream으로 감싸져 있는 코드는 최신화된 dev의 코드이고

Stashed changes로 감싸져 있는 코드는 임시 저장한 작업(will)을 불러온 코드입니다.

이 때, 자신이 수정한 코드로 바로 수정을 할 수도 있지만, 만약 정해진 게 없다면 팀원들과 상의 후, 수정 사항을 add commit push하면 됩니다.

제가(will) 수정한 파일을 적용해서 push하겠습니다.

7. 수정 사항 반영

만약 push를 했는데 다음과 같은 에러가 발생할 수 있습니다.

이 경우는 원격 저장소에 해당 브랜치가 없다는 의미이므로 위의 내용에서 사용하라는 명령어를 그대로 입력합니다.

git push --set-upstream origin develop

수정 작업을 push 하고 Github에 가보면 다음과 같이 나타납니다.

여기서 Compare & pull request를 클릭하면 PR을 남길 수 있습니다.