3. Work on Current Change

 

0. Intro

CMD에 git을 입력하면 Commands 중에서 "Work on Current Change" 부분을 다뤄볼게요!

변경된 부분에 대한 작업! 이란 뜻인데, 저번 Start Working Area에서 Git을 통해 관리를 시작하는 방법을 정리했다면,

이번에는 그 작업들을 추가하고, 수정하고, 삭제하는 작업들에 대한 명령어입니다!

 

뭐가 있었냐면 add, mv, restore, rm 총 네 개가 있었습니다! 

뭔가 대충 무슨 느낌의 명령어 일지 예상 가지 않나요?! 아님... 말고요...ㅎ(설레발 주섬주섬)

 

 

1. Work on Current Change

1. Add: Working Directory상의 변경 내용을 Staging 영역에 추가하기 위해 사용하는 명령어

 

여기서 들 의문점 Staging 영역에 대해 짧게 짚고 넘어갈게요!

Staging AreaIndex라고 불리기도 하는데 곧 commit 할 파일들에 대한 정보를 저장하는 공간입니다!

변경된 내용들 중 commit할 내용을 판단하여 staging area에 add 하여 부분적으로 관리할 수 있는 장점이 있습니다.

 

사실 CLI를 사용할 때는 자주 사용했었는데, GUI를 사용한 이후로는 commit을 하면 add와 함께 이루어져서 잘 사용하진 않았던 거 같아요...ㅎㅎ 

그래도 Staging 영역에 올리는 버튼과 UnStaging버튼이 있었는데 추후 GUI 추가할게요!!

 

 

2. mv: 파일을 이동하거나 이름을 바꿀 때 사용한다.

마찬가지로 GUI에서는 마우스 우클릭으로 할 수 있는 작업인데, CLI로 공부하시는 분들을 위해 간단한 명령어 정리를 해둘게요!

 

$ git mv <filename> <newfilename> : 파일명을 변경할 때 사용

++ 추가로 mv를 하고 꼭 "commit"을 해주어야 변경이 된다고 합니다!

 

 

3. restore: 수정한 파일을 되돌릴 때 사용한다.

새로 생긴 명령어여서 생소할 수 있는 느낌인데 기존의 checkout과 같은 작업을 합니다!

$ git checkout -- test.txt   ‣   $ git restore test.txt

checkout이 브랜치를 변경할 때 사용하기도 하고, 수정한 파일을 되돌릴 때도 사용하기 때문에 헷갈리는 경우가 많았는데요!

이렇게 명령어가 분리되면서 명령어의 목적이 더 분명해졌습니다.

 

 

4. rm: 파일을 삭제한다.

명령어 그대로 remove! 파일을 삭제할 때 사용합니다. 마찬가지로 rm후에 commit 필수 작업입니다!

이것도 GUI에서는 마우스 우클릭으로나 상단 메뉴를 활용하여 쉽게 다룰 수 있던 부분이라서, 깊게는 안 본 듯하네요...

 

$ git rm <filename> : 로컬 디렉토리와 git 저장소 모두에서 파일을 삭제. 삭제 후에는 commit 필수!

$ git rm -f <filename> : 수정한 파일 또는 Staged 상태인 파일을 삭제하는 경우에는 -f 옵션 추가(commit하지 않은 경우)

$ git rm --cached <filename> : 로컬 디렉토리에서는 삭제하지 않지만 git에서는 삭제하는 경우 --cached 옵션 추가

$ git rm -r <directoryename> : 디렉토리를 삭제할 때 

 

 

공부를 하던 당시에도 Smart Git 내에서도 쉽게 버튼을 찾을 수 있었어서 자세히 공부하진 않았네요...

CLI로 공부하면서 개념을 잡고 넘어갔기 때문에 쉬웠던 걸지도 모르겠어요 😂😂

 

여유가 나는 대로 어떤 식으로 동작하는지 GUI 이미지도 추가하도록 하겠습니다! 많이 준비가 안되어있네요 😥

 


 

(꼬깃 Moment 😁)

얼마 전 회사 근처로 자취방을 옮겼어요!! 출퇴근 지하철 탈출 + 여가시간을 얻었습니다!! 🤩

그래서 블로그 글을 더 자주 정성 들여 쓸 수 있을 줄 알았는데...

게임을 하고 싶기도 하고... 집안일도 하고... 예상과는 빗나가고 있지만... 확실한 건 이전보단 여유로워졌다는 것!!

 

혹시 제 글을 보시는 분들... 직장 구하실 때 거리도 잘 보시고... 출퇴근 루트도 한번 보시는 걸 추천드려요...(제발)

저는 무려 왕복 3-4시간이 걸렸답니다😂😂 n개월을 그렇게 다니다가.. 결국엔....

아 맞다... 중기청에 대해서도 간단히 다뤄볼까 생각 중이에요... 태어나서 대출 처음 받아봤는데 복잡하기도 하고 그렇더라고요😖

 

할 말은 많지만 이게 본문이 될까 봐 더 못쓰겠어요..ㅎㅎ 얼른 일상 글도 스멀스멀 올려야겠어요🤣

이 글을 찾아주신 분들 모두 건강하시고 코로나 조심하세요!!😄😄

 

♡ 감사합니다!! 뿅!!

 

 

 

 

2. Start Working Area:: Repository와 Clone & Init

 

0. Git 설치는 되어있나요!?

 

우선 Git을 설치했다는 가정 하에 시작합니다!!

Git 설치 과정도 같이 작성하면 좋을 것 같긴 합니다만,

설치 부분은 자세히 나와있는 블로그도 많고 운영체제별, 버전별, 사이트도 달라지기 때문에...

구글링으로 맞는 블로그 보면서 설치하는 걸 추천드려요~!😁😁 (사실 자신 없음...ㅎㅎ)

 

cmd창을 켜시고 git 을 입력하세요!!

 

cmd에서 사용할수 있는 git 명령어들!!

 

위와 같이 나오면 정상적으로 설치가 된거구, 알 수 없는 명령어라고 나오면 설치가 제대로 안된 겁니다!

아래에 길게 영어로 쓰여있는 부분은 Git Commands인데요! 

파트별로 잘 나뉘어 사실 저 부분만 봐도 어떤 명령어가 어떤 느낌인지는 잡을 수 있을 겁니다!

 

 

...라고는 했지만🤔🤔

repository...  branch... 이게 다 무슨 말이죠...? (라고 생각했던 n개월 전 subing😂)

 

자주 쓰는 용어 위주로! 우선 작성하고 제가 빠트린 용어나 새로 배운 용어들은 추후 추가할게요!

 

우선 Git의 기초 개념을 잡는데 도움되었던 사이트 먼저 공유할게요😋

주임님이 보내주신 사이트인데 왕초보가 개념잡기에 가장 도움되었던 사이트인 것 같아요!

http://backlogtool.com/git-guide/kr/

 

저는 거의 명령어(Commit, push...ㅎ)만 알다 보니 저장소에 대한 개념이 없어서

그 부분부터 개념을 잡고 들어가니 그 뒤에 Commands를 이해하는데 수월했던 것 같아요!

 

그래서 처음에는 명령어보다 "기본 개념에 초점을 두고 개념을 잡아" 공부했습니다.

 

 

1) Repository

 

Git이 관리하고 있는 저장소를 의미합니다. 

크게 원격 저장소(Remote Repository)로컬 저장소(Local Repository)가 있습니다.

 

  • 로컬(local) 저장소: 내 컴퓨터 내에 있는 저장소.
    1. Working Directory: 실제로 소스코드를 작업하는 영역. .git, .gitignor폴더를 제외한 파일 또는 폴더! Git에 의해 관리(Version  Control) 대상이 됩니다.
    2. Staging Area: Working Directory에 git add 명령을 실행하면 Staging Area로 이동하며 이를 통해 소스코드 상태 정보를 확인할 수 있습니다. (Staged, Added 등등..)
    3. (local) Repository: Staging Area에 있는 소스코드에 git commit 명령을 실행하면 최종적으로 local directory에 반영됩니다.

 

  • 원격(remote) 저장소: Git 저장소.
    1. (remote) Repository: Git 서버에 존재하는 저장소! 라고 이해했습니다(아니면 지적 부탁드려요😂) 로컬 저장소에서 최종적으로 git push를 하면 Remote Repository에 올라가게 됩니다! (그러면 다른 사람들도 코드를 볼 수 있게 되겠지요!)

 

라고 이해하면 쉽게 생각할 수 있을 듯합니다!


 

2) Init과 Clone

 

출처: 이사님이 주신 세미나 자료

 

 start a working area에 딱 두 가지 명령어가 있었죠 init과 clone (가장 윗줄 참고해주세요!)

 

    1. init: Local Repository에서 생성한 .git폴더 생성하여 Working directory에 추가!!

    => init을 해석했을 때도 알 수 있듯, '초기화'할 때 사용! .git폴더를 추가하여 working directory를 git에 의해 관리하도록 합니다.

 

git init 하여 Initalized empty Git Repository

처음 공부할 때는 CLI로 공부했어서 이거뿐인데 GUI 버전도 곧 추가할게요!

(++ 추가완료! 22.03.31)

Repository > Add or Create

기존에 있는 폴더에서도 할수있고 새로 만드는 방법도 있네요! 

 

실제로 init이 잘 이루어졌는지 확인하려면 아래 이미지를 참고해주세요!

숨김폴더를 확인하면 .git 폴더가 추가된 것을 확인할 수 있습니다!

 

 

    2. clone: Remote Repository에서 생성한 .git폴더 생성하여 Working directory에 추가!!

    => git에 이미 올라와있는 Remote Repository에서 파일을 내려받을 때 사용! 프로젝트를 복제한다고 생각하면 이해가 쉬웠어요.

 

Repository > Clone

    • Remote Git or SVN repository: Git Url (ex. https://github.com/subin1004/gitproject.git)
    • Local Git repository: 컴퓨터내의 파일 경로 (ex. C:\Users\subin\AndroidStudioProjects\MyApplication)

 

Clone 완료!!

 

회사에서 공부하다 보니 GUI 툴은 Smart Git 사용했습니다! (지금도 사용하고 있구요😎)

무료로 개방되긴 하지만 작업이 제한되어 있고 상업용으로 유료로 라이센스를 얻어 사용한다고 합니다!!

위에 건 회사 프로젝트와는 별도(사실 저 때 프로젝트 clone권한도 없었어요..😋)로 제가 git 공부 때문에 별도로 공부한 부분이어서

추후 사진은 좀 가려질 경우도 있을 수 있을 것 같아요!! 최대한 안 하는 쪽으로 해볼게요!!

 

그리고 소스트리나 다른 프로그램으로 많이들 공부하시는 것 같아서 SmartGit에 관한 정보는 얻기 어려웠는데

한 발짝 먼저 시작한 제가 조금이나마 도움이 되었으면 하는 마음에 최대한 열심히 적어보겠습니다!🤗

 

다른 Git GUI보다 어렵다고 하더라고요! UI적으로 복잡한 것도 있고 Commands에 대한 지식도 더 많이 요구한다고 해요!

사실 저는 GUI를 Smart Git으로 처음 시작했기 때문에 처음부터 차근차근 받아들였어요..ㅎㅎ

 


 

 

벌써 1시네요... 6시간 뒤에 기상해야 하므로 얼른 잠들어볼게요!🤣🤣

TMI로 자가격리 해제후 바쁜..? 시간을 보내고 있답니다... 회사에 녹아드는 중이랄까요...

하지만 한없이 부족하고 모자라고... 아직 파악하는데 어려움을 앓는 중이랍니다...

나중에 #일상 카테고리에...ㅎㅎ 내일은 옥상에서 바람 쐴 여유가 생기길🙏

 

이 글을 찾아주신 분들 모두 건강하시고 코로나 조심하세요!!😄😄

 

♡ 감사합니다!! 뿅!!

 

 

👩: 그래서 Git은 왜 써야 하는 거죠? 면접 보려고 쓰는 건 아니잖아요?
🧑: Git 안 쓰고도 프로젝트 가능하던데요? 

라는 태아 시절 Subing의 의문점이었습니다..

BUT!!

Git을 공부하고 실제로 사용하면서 배운 Git을 쓰면 좋은 점! 써야만 하는 이유! 를 개발자 관점에서 적어봤어요😙

 

크게 두 가지✌로 나눠봤습니다.

  1. 버전 관리
  2. 협업

 

 

1. 버전 관리

 

부끄럽네요...😅 커밋메시지도 갈겨버리는 신입의 패기...

 

입사 후, Developer 공식문서와 예제 파일을 테스트해보기 위해  여러 가지 기능을 추가한 프로젝트의 Git Log입니다.

회사에서 리뷰를 했는데 그 과정을 보여드릴 때 우선 Git Log로 어떻게 진행했는지 진행률이 어느 정도인지를 보여드리기에 적합했습니다. 

 

  1. 버전을 달리하려면 프로젝트를 다른 이름으로 저장해야 하는 불편함이 있기 때문에, (또한 매우 보기 안 좋고 헷갈림😡)

        → 기능이 추가되었거나, 오류사항을 수정했을 때 등에 commit을 사용하여 메시지와 함께 관리할 수 있고,

 

  1. 뭔가 잘못되어서 되돌리고 싶을 때, 이전의 Subing은 전부 찾아서 고치거나... Ctrl + z를 연발했다면..ㅎㅎ;; (이 과정에서 잘했던 부분도 다 지워지거나... 돌이키기 힘든 실수를 하는 경우도 많죠!!)

        → commit 해둔 내용을 다시 받아와서 작업하는(reset & revert)! 똑똑한 버전 관리를 할 수 있게 되었습니다😎

 

2. 협업

이것도 응애들의 대잔치이니 그저 Example로만 받아들여주세요 😥

 

사실 회사에서 Git 사용법을 아는지에 대해 물어보는 이유는 저번 포스트에서 작성했듯이

팀원들과 협업하는데 빠르게 적응을 할 수 있는가 에 대한 답변을 듣기 위함입니다.

 

회사에선 여러 명의 개발자가 한 프로젝트를 하는 경우가 많은데, (학교에서 하는 소규모 팀 프로젝트에서도 마찬가지예요😃)

Git을 사용한다면,

  • 일일이 코드를 비교해서 수정하는 번거로움이 사라집니다.
  • 코드가 변경된 이력을 쉽게 확인할 수 있습니다.
  • 어느 부분이 추가/수정/삭제되었는지 볼 수 있고, 반대로 제가 추가한 기능을 다른 개발자가 확인할 수 있습니다.
  • 물론 같은 부분을 수정해서충돌(Conflict)이 발생하기도 합니다만, 생각보다 쉽게 고칠 수 있습니다.

        (추후에 수정하는 법은 따로 게시글로 다뤄볼게요🤗)

 

쓰다 보니 장황하지만 내용은... 잘 모르겠네요..ㅎㅎ 하지만 실제 면접에서는 이정도로 간단하게 답변하면 될 것 같습니다!!

추후에 계속해서 수정할 내용이니 이 정도로 정리해보겠습니다😋

 

혹시라도 읽어주신 분 감사드리고 좋은 하루 보내시길 바랄게요❤

코로롱 조심하시고요!!

 

 

♡ 감사합니다!! 뿅!!

 

개발자 면접 "무 적 권" 받는 질문!!!

👨‍💼: Git 사용해봤어요?
👨‍💼: Git을 왜 사용하나요?
👨‍💼: 팀 프로젝트 버전 관리는 어떤 식으로 했나요?

라는 질문에 저는 자신 있게 대답했습니다.

 

🙆‍♀️: Git은 팀원들과 협업 프로젝트를 할 때 사용하고, 실제로는 commit이랑 push 해봤습니다!!😆😆😆

 

실화입니다 Real True (Sad) Stroy... 저는 응애도 아닌 💥태아💥였고,

면접관님이 "그것만 하면 안 될 텐데... 허허.."라고 말씀하시는 걸 분명히 들었습니다... 

그 면접관님이 현재 저으 팀장님... 감사합니다...

대학교에서도 학원에서도 누구도 깃에 대한 강의는 해주시지 않았기 때문에

"몰라도 된다. 언어가 중요하지 암!!" 이라는 안일한 생각을 가지고 있었던 것 같아요. (깃 과목 필요하다 생각합니다 악....!!!!!!!)

 

...  너무 무식하고 용감했죠... 🤣🤣

 

그래서 입사 후 첫 임무가 Git 마스터였어요. 어쩌면 당연히 알아야 할 기본 지식인데

저에게 시간을 투자해서 공부할 시간을 주신 수석님들, 도움 주신 주임님들께 너무 감사한 마음이어서 더 열심히했었어요😂

 

입사 첫 주 정리한 내용을 공유하고, 저도 언젠가 이 글을 읽으면서 입사 첫 주의 아찔함🤯을 느끼기 위해... 뚱땅뚱땅 문서화 한 파일을 정리해보려 합니다.

누군가가 보고 도움이 된다면 더더욱 좋을 것 같으면서 제가 공부한 내용이라 틀린 부분이 있을까 걱정되기도 합니다만,

틀린 부분은 지적받아 수정하고 내용을 추가하면서 정리해보겠습니다.

저는 아직도 공부 중이니까요!👩‍💻👩‍💻 (기록용 + 공부용!!!)

 

 

기본 Commands용어의 개념, 용도 정도는 알고있으면, 저와 같은 불상사는 겪지 않을 것이에요...💦💦

 

 

회사에서는 기존에 하고 있던 프로젝트가 있었기 때문에 대부분의 회사는 Git을 사용하고있고,

정말... 기본 중의 기본이라고 이제와서 생각합니다...😂

 

😖 결 론 : G I T 당 장 시 작 해 😖

 

게시글은 자가격리 기간과 퇴근 후 시간을 활용하여 틈틈이 올려볼게요!!

이 글을 찾아주신 분들 모두 건강하시고 코로나 조심하세요!!😄😄

 

♡ 감사합니다!! 뿅!!

 

 

 

TouchEvent 좌표 오류: ViewTreeObserver.OnGlobalLayoutListener

 

 

TouchEvent로 해당 좌표에 ImageView가 나타나게 하고 싶었는데, 엉뚱한 곳에 나타남😂 (애매한 오른쪽 아래?)

 

TouchEvent에서 받아온 좌표값은 Screen 전체에서의 좌표 값이고,

그려지는 부분에선 Layout을 기준으로 하기 때문에 Actiobar나 화면 상태표시줄 등등에 의해 오차가 생긴 거였다!!

A view tree observer is used to register listeners that can be notified of global changes in the view tree. Such global events include, but are not limited to, layout of the whole tree, beginning of the drawing pass, touch mode change.... A ViewTreeObserver should never be instantiated by applications as it is provided by the views hierarchy. Refer to View.getViewTreeObserver() for more information.

공식문서: https://developer.android.com/reference/android/view/ViewTreeObserver.html

 

대충 ViewTreeObserver를 이용하여 리스너를 등록하고 리스너를 통해 뷰의 크기나 위치를 가져오는 시점으로 사용하면 값을 가져올 수 있다는 뜻👌

처음에 Activity에서 구현했었는데, Fragment로 바꾸면서 TouchEvent가 잘못 찍히는 현상이 사라졌으나,

나중에 기억하기 위해서 남깁니다..ㅎㅎ(주임님이 도와주셨는데 넘... 헤맸던 부분이라 꼭 기억하고 싶었습니댱...)

 

그래서 코드상 fragment의 구조로 되어있는데 onCreateView 👉 onCreate에서 확인할 수 있습니다!

( 주석처리 풀어서 급하게 작성하느라 수정은 못했습니다^^;; 불친절한 블로거ㅎㅎㅠㅠㅠㅠ)

 

x좌표와 y좌표를 저장할 변수 선언.
    // Point
    private int mLayoutMainX = -1;
    private int mLayoutMainY = -1;

 

onCreate :: getViewTreeObserver().addOnGlobalLayoutListener
   @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_screentouch, container, false);

        mLayoutMain = mView.findViewById(R.id.layout_main);
        ...
        mLayoutMain.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Log.d(TAG, "onGlobalLayout! (layout_main)");

                mLayoutMain.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                Log.i(TAG, "layout_main w: " + mLayoutMain.getWidth() + ", h: " + mLayoutMain.getHeight());

                int[] location = new int[2];
                mLayoutMain.getLocationOnScreen(location);
                Log.i(TAG, "layout_main location: " + Arrays.toString(location));
                mLayoutMainX = location[0];
                mLayoutMainY = location[1];
            }
        });
        return  mView;
    }
 

mLayoutMain(최상위 layout)에 getViewTreeObserver를 이용하여 리스너를 등록하고

onGlobalLayout을 override (new 연산자 입력하면 자동으로 생성됨!)

  • removeOnGlobalLayoutListener(this);  
    • 리스너가 중첩되는 것을 막기 위해 반드시 해주어야한다고 함!!
  • mLayoutMain.getLocationOnScreen(location);
    •  touchEvent의 좌표값 받아올 수 있음.

 

 

추가로 사용 예시.. 같은 건데.. 그냥 참고만 해주세요😅

isTouchInside(View view, int x, int y) :: view 안을 터치하면 result를 반환하는 method
  private boolean isTouchInside(@NonNull View view, int x, int y) {
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        int realRight = location[0] + view.getWidth();
        int realBottom = location[1] + view.getHeight();

        Log.i(TAG, String.format("성공범위 (x: %d ~ %d, y: %d ~ %d", view.getLeft(), realRight, view.getTop(), realBottom));
        Log.d(TAG, String.format(" touched x: %d, y: %d", x, y));

        boolean result = (x >= view.getLeft() && x <= realRight && y >= view.getTop() && y <= realBottom);

        return result;
    }
 

Circle(ImageView)의 위치를 이용하여 Width와 Height를 계산하여 touchEvent가 발생할 때마다 호출하게 함.

Boolean 값을 return하고 조건문을 활용하여, 기능 추가함.

 

setCirclePoint(int x, int y) :: view 밖을 터치했을 때 실행되는 method

view 매개변수가 주어졌을땐 getLocationOnScreen 메소드를 사용하여 스크린 상의 위치를 얻을 수 있었으나,

매개변수가 주어지지 않을 때는 View.getViewTreeObserver에 아래와 같이 Listener 등록하여 사용.

 private void setCirclePoint(int x, int y){
        int realX = x -mIvCircle_point.getWidth()/2;
        int realY = y - mIvCircle_point.getHeight()/2;

        mIvCircle_point.setX(realX);
        mIvCircle_point.setY(realY);
        setValueAnimation(mIvCircle_point, Color.RED);
        Log.i(TAG, "touch outside");

        mIvCircle_point.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                View view = mLayoutMain.getChildAt(0);
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                int[] location = new int[2];
                view.getLocationOnScreen(location);
                setValueAnimation(mIvCircle_point, Color.RED);
            }
        });
    }
 

 


++ 추가) 현재 화면(Display)의 크기를 알고 싶을때

        WindowManager windowManager = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        final Point realSize = new Point();
        display.getRealSize(realSize);
        Log.d(TAG, "real Display Size: " + realSize.toString()); // realSize = 디스플레이 크기
 

WindowManager 사용하여 가져올 수 있음. (실제로 사용하지는 않았지만 이상하게 찍히는 원인을 알 수 있어서 추가)

 

첫 게시글이라 조금 불친절해요... 양해부탁드립니다 ㅎㅎ

 

♡ 감사합니다!! 뿅!!

 

 

 

+ Recent posts