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로 자가격리 해제후 바쁜..? 시간을 보내고 있답니다... 회사에 녹아드는 중이랄까요...

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

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

 

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

 

♡ 감사합니다!! 뿅!!

 

 

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