반응형

Hello!

 

여러 개발자와 함께 개발을 하다보면, 어떤 경우에는 같은 위치의 코드를 동시에 수정하게 되고 이를 같은 브랜치로 반영할 때에 충돌이 발생하게 됩니다. 이럴 때에는 해당 코드의 충돌을 수정해줘야 성공적으로 push 또는 merge를 할 수 있는데요. 한번 해당 상황을 만들어 sourcetree에서는 어떻게 충돌을 해결할 수 있는지 살펴보겠습니다 ㅇ3ㅇ

 

conflict 상황 만들기

저는 main, alpha, beta 브랜치를 따로 생성하여 충돌이 발생하는 상황을 만들어보았습니다. 동일한 commit에서 두 브랜치 alpha, beta 브랜치를 생성합니다. 그리고 alpha 브랜치에서 수정된 변화들을 먼저 main 브랜치로 merge를 하고, main 브랜치를 beta 브랜치로 merge 하며 conflict를 발생시켰습니다.

 

main 브랜치

public enum OffDay {
    Mon,
    Tue
}

 

alpha 브랜치, alpha 브랜치가 merge된 main 브랜치

public enum OffDay {
    Mon,
    Tue,
    Wed // alpha
}

beta 브랜치

public enum OffDay {
    Mon,
    Tue,
    Thu // beta
}

 

 

conflict 해결하기

 

충돌 만들기

히스토리를 확인을 먼저 해보겠습니다. 현재 alpha 브랜치에 한 커밋이 생성되었고 이미 main 브랜치에 merge 되었음(노란색,빨간색)을 확인할 수 있습니다. 그리고 beta 브랜치에도 하나의 커밋이 생성(파란색)되었다는 것을 확인할 수 있습니다.

 

그리고 main 브랜치를 최신으로 pull 한 다음 beta 브랜치로 merge 해보겠습니다. 충돌이 발생하겠죠?

Sourcetree에서 다른 브랜치(main)를 현재 브랜치(beta)로 merge 하는 법은, 현재 브랜치 checkout 후에 merge하고 싶은 브랜치 우클릭 후에 <Merge '다른브랜치' into 'checkout 브랜치'>를 선택해주시면 됩니다.

 

 

충돌 해결하기

 

쨘!! 충돌이 발생습니다.

친절하게 Sourcetree에서는 '충돌 해결' 밑의 메뉴를 사용해달라고 안내도 해주네요. 그리고 충돌이 발생한 파일들은 Sourcetree 파일 상태에서 ⚠️ 로 표시되어 있습니다.

 

 

 

해당 파일에서는 현재 브랜치의 파일 상태 (<<<<<HEAD)  그리고 타 브랜치 (>>>>>>main)으로 표시되어 있습니다. 이러한 충돌을 원하는 방식으로 수정을 해줍니다. 저는 충돌이 발생한 파일들을 확인하고, 제가 사용하는 editor에서 직접 수정을 해줍니다. main 브랜치 변경 내용을 위에, 그리고  현재 브랜치 수정 내용을 아래로 배치하며 두 수정사항을 모두 반영하겠습니다.

2. 충돌 파일 수정 전과 수정 후

두 브랜치의 한 브랜치의 변경 사항만 살려도 되거나, 살리고 싶을 때는 충돌 해결하기 > '내것' or '저장소' 를 사용하여 해결하기 옵션을 사용해 줍니다. '내것'을 이용해 해결 옵션을 선택 할 경우, 내 브랜치의 변경사항만 반영되게 되고 타 브랜치의 수정사항은 폐기됩니다. 반대로  '저장소'것을 사용하여 해결 할 경우에, 충돌이 발생한 코드에 내 브랜치의 수정사항은 폐기되고, 다른 브랜치의 변경사항반 반영되게 됩니다.

 

위의 스크린샷을 통해, '저장소' 것을 사용하여 해결 옵션을 선택할 경우. 내 브랜치의 beta 변경사항은 제거되고, alpha 브랜치의 변경사항만이 남게 되는것을 확인할 수 있습니다.

 

처음부터 다시 수정하고 싶을 땐

conflict를 수정하다 다시 처음 충돌 상황부터 다시 시작하고 싶을 땐, 충돌 해결하기 > 병합 재시작 옵션을 사용하면 깔끔하게 새롭게 수정을 시작할 수 있습니다.

 

선택 사항

파일 수정 후 ⚠️로 표시되어있는 충돌된 해당 파일 우클릭 > 충돌 해결하기 > 해결된 것으로 표시를 하게 되면 ⚠️표시가 사라지게 됩니다. 충돌된 파일이 많은 경우에는 어떤 파일들의 충돌이 해결되었고 아닌지 판단하여 수정 하기 좋겠죠?

 

 

완료하기

이제 충돌을 완료하기 위해 커밋 버튼을 클릭해줍니다. 이 커밋 내용은 수정할 수 없습니다. 이전의 merge commit의 연장선으로 충돌만 해결하는 것이기 때문에 '커밋' 버튼을 눌러줍니다. 또는 터미널에서 'git commit'을 입력해주어도 됩니다.

커밋이 정상적으로 이루어졌습니다. 바로 push를 해주고 github에서 한번 살펴볼까요?

beta 브랜치에는 아래와 같이 2개의 커밋이 생성되었습니다. 그리고 alpha와 beta의 변경사항이 모두 반영이 되어있네요!! 

그리고 각각의 커밋을 살펴보면 아래와 같습니다. 딱 alpha의 변경사항이 이쁘게 merge 되었네요.

 

충돌 해결 성공!!!!

 

 

 

Hope this helps :-)

반응형
반응형

Hello!

 

맥에서 처음 git을 세팅하며 repository clone은 정상적으로 이루어졌으나, pull을 하려고 하니 아래와 같은 에러가 발생하였습니다.

으아닛?

 

git은 SSH 프로토콜을 사용하여 remote 서버와 통신합니다. 그리고 사용자 인증을 위해 personal access token, username, pwd 이 세 가지를 사용합니다. 그렇기 때문에 유저의 access token인 SSH Key(public key)가 유저의 기기에 세팅되어 있지 않으면 이와 같은 Permission denied 접근 권한 에러가 발생하게 되는 것이죠!

 

해결 방법은 git Docs에 친절하게 설명이 되어있어서 저도 한번 매뉴얼을 따라가 보았습니다!!

같이 해보실까요?

 

 

/ git Permission denied (publickey) 해결하기 

1. 터미널 실행

$ ssh-keygen -t ed25519 -C "git_이메일_주소를_입력해주세요"

터미널을 실행하여 위의 커맨드에 이메일 주소를 입력하고 엔터를 눌러주세요.

이 커맨드는 ed25519 암호화 public/private key pair를 만들게 됩니다.

 

 

2. 저장 위치

그러면 아래와 같이 어느 위치에 key를 저장할 것인지 묻습니다. 해당 디폴트 위치에 저장하기 위해 '엔터'를 눌러줍니다.

 

 

 

3. 비밀번호 입력 후 키 복사

비밀번호를 2차례 입력하면 public key가 정상적으로 생성되고 'Your public key has been saved in' 이 알려주는 위치에 key가 저장되어 있습니다. 

'Your public key has been saved in' 오른쪽에 나오는 디렉토리 path를 마지막 . 을 제외하고 복사하여 주세요

그리고 cat 커맨드를 입력하면 public key 정보를 확인할 수 있습니다. 이 public key를 마지막의 이메일 주소까지 함께 복사를 해주세요.

 

 

4. github에 public key 등록

깃헙의 설정에서 public key를 등록해주세요. 아래의 사진처럼 따라가시면 됩니다.

 

타이틀은 아무거나 넣어주셔도 됩니다. 전 키 종류를 적어주었어요

 

public key 등록 완료!!!

 

/ 키 등록 완료 테스트 

테스트를 해볼까요?  터미널에서 git pull 커맨드를 입력해보겠습니다.

그리고 암호 키 생성 시 입력해주었던 비밀번호를 입력해주시면!!

TADA!!!!!!!

에러 메시지 없이 성공적으로 github와 연결할 수 있었습니다!!!

와~~~~

 

 

혹시 해결이 안 되셨다면 아래의 github doc을 한번 확인해주세요!!

도움이 되셨으면 좋겠네요 (ㅇ3ㅇ)

 

 

 

[ 참고 ] docs.github.com/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

 

반응형
반응형

try 구문

Exception을 처리하는 첫 번째 단계이다. 예외가 발생할 코드들을 try 구문에 포함시킨다.

 

catch 구문

try 구문과 함께 사용되며 1개 이상의 catch 블록을 가질 수 있다. 각각의 catch 블록은 명시된 exception이 발생하였을 경우 실행된다.

 

try {

} catch (IndexOutOfBoundsException e) {
   
} catch (IOException e) {
    
}

 

1개의 catch 문은 1개 이상의 exception을 한 코드에서 처리할 수도 있다.

try {

} catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

 

finally 구문

finally 구문은 try 구문 처리 후 항상 실행된다. 그렇기에 finally 구문 안에 있는 코드들은 exception이 발생하더라도 항상 실행될 수 있도록 보장된다. exception이 발생하던 발생하지 않던 finally 구문을 사용하여 이전에 사용된 자원들이 무조건 회수될 수 있도록 하거나, 다른 처리 코드를 작성하는 습관을 들이는 것이 좋다.

 

public void writeList() {
    PrintWriter out = null;

    try {
    
        out = new PrintWriter(new FileWriter("OutFile.txt"));
       
    } catch (IndexOutOfBoundsException e) {
                                 
    } catch (IOException e) {
                                 
    } finally {
        if (out != null) { // 자원이 할당되어있을 경우 회수한다.
            out.close();
        }
    }
}

 

 

 


 

My Example

public void inviteUser(User user, User invitee) {
    
    boolean isAllowed = true;
    
    try {
    	checkPermission(user);
        
    } catch(UserDoNotHavePermission e) {
    	log.error("User do not have permission.");
        isAllowed = false;
        
    } finally {
    
    	if(isAllowed)
        	processInviteUser(user, invitee);
    
    	saveActivityLog(user, invitee, isAllowed);
    }    
}

 

 

 

 

[ 참고 ] docs.orable.com/exception/finally

 

반응형

+ Recent posts