이 글은 Git의 기본 내용만 알고 있는 제가 안드로이드 스튜디오에 Git을 적용하여 사용해보는 연습을 담았습니다.
저는 안드로이드 개발을 8년정도 해왔고, 다른 사람들과 다르게 시대에 빠르게 적응하고 시대를 따라가는 용기와 추진력을 갖지 못해서 Git을 다룬 적이 없었습니다.
이 글의 카테고리 목록에서 Git에 대해 간단하게 다룬 글이 있는데, 그걸 토대로 안드로이드 스튜디오에 적용해보았습니다.
저는 여태까지, 버전관리를 할 때 수정 전에 프로젝트를 압축파일로 저장시켜놓았다가 수정 뒤에 문제가 생기면 기존의 백업 압축파일을 다시 풀어서 대체하는 방식을 사용해왔습니다.
이게 계속 하다 보니까 여간 불편한 일이 아니였습니다. 그래서 Git을 사용하기로 마음먹었습니다.
이 글은 Github에 대해서 다루지는 않습니다. 내부 로컬 저장소에 대해서만 다룹니다.
해당 프로젝트의 MainActivity.java 파일은 이렇습니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
기본 상태죠.
이제 버전관리를 위해 이 프로젝트를 git에게 버전관리를 요청하겠습니다.
해당 프로젝트 경로로 들어갔고, 버전 등록 이전에 파일 상황은 이렇습니다.
MacBook-Pro:git_practice hevton$ ls -al
total 64
drwxr-xr-x 13 taejune staff 416 1 17 15:42 .
drwxr-xr-x 49 taejune staff 1568 1 17 15:45 ..
-rw-r--r-- 1 taejune staff 225 1 17 15:42 .gitignore
drwxr-xr-x 6 taejune staff 192 1 17 15:42 .gradle
drwxr-xr-x 12 taejune staff 384 1 17 15:42 .idea
drwxr-xr-x 7 taejune staff 224 1 17 15:42 app
-rw-r--r-- 1 taejune staff 530 1 17 15:42 build.gradle
drwxr-xr-x 3 taejune staff 96 1 17 15:42 gradle
-rw-r--r-- 1 taejune staff 1093 1 17 15:42 gradle.properties
-rwxr--r-- 1 taejune staff 5296 1 17 15:42 gradlew
-rw-r--r-- 1 taejune staff 2260 1 17 15:42 gradlew.bat
-rw-r--r-- 1 taejune staff 436 1 17 15:42 local.properties
-rw-r--r-- 1 taejune staff 48 1 17 15:42 settings.gradle
이제 git init .을 통해 현재 디렉토리를 버전관리해봅시다.
MacBook-Pro:git_practice hevton$ git init .
Initialized empty Git repository in /Users/hevton/AndroidStudioProjects/git_practice/.git/
이러고 이제 다시 ls -al을 쳐보면 .git 파일이 새로 등록된 것을 볼 수 있습니다.
MacBook-Pro:git_practice hevton$ ls -al
total 64
drwxr-xr-x 14 taejune staff 448 1 17 15:46 .
drwxr-xr-x 49 taejune staff 1568 1 17 15:45 ..
drwxr-xr-x 9 taejune staff 288 1 17 15:46 .git
-rw-r--r-- 1 taejune staff 225 1 17 15:42 .gitignore
drwxr-xr-x 6 taejune staff 192 1 17 15:42 .gradle
drwxr-xr-x 12 taejune staff 384 1 17 15:42 .idea
drwxr-xr-x 7 taejune staff 224 1 17 15:42 app
-rw-r--r-- 1 taejune staff 530 1 17 15:42 build.gradle
drwxr-xr-x 3 taejune staff 96 1 17 15:42 gradle
-rw-r--r-- 1 taejune staff 1093 1 17 15:42 gradle.properties
-rwxr--r-- 1 taejune staff 5296 1 17 15:42 gradlew
-rw-r--r-- 1 taejune staff 2260 1 17 15:42 gradlew.bat
-rw-r--r-- 1 taejune staff 436 1 17 15:42 local.properties
-rw-r--r-- 1 taejune staff 48 1 17 15:42 settings.gradle
이제 다시 안드로이드 스튜디오로 돌아가보면, 갑자기 파일 이름부분이 붉게 물들여져 있고, git 버튼 메뉴가 추가된 것을 볼 수 있습니다.
안드로이드 스튜디오 자체적으로 Git을 지원해주기도 하기 때문입니다. Untracked, Tracked 이런 느낌을 색상으로 주는 것이죠.
참고로 저는 CLI 상으로 설명드릴 것이지만, 안드로이드 스튜디오 자체적인 Git UI 버튼으로도 간편하게 사용할 수 있습니다.
대신 git init을 일단 CLI상에서 해줘야 UI가 그때부터 생깁니다.
CLI에선 매번 add를 통해 Staging Area에 올려놓는데.. 이건 처음에 한 번 add하면, 그 이후부터 매번 Staging Area에 올려놓는 과정 필요없이, 트랙킹되는 걸 활용해서 커밋하면 알아서 선택하여 커밋할 수 있게 해준다.
즉 모든 프로젝트 파일을 add하는게 아니라 수정된 부분들만 알려주고, 버전화시켜준다. 변화없는 파일들은 불필요하게 버전관리해줄필요가 없이 그대로 냅두고, 변화있는 파일들만 변화시켜주는것. 내가 여태 모든 프로젝트 파일을 add 하여 Staging Area에 올려놓고 버전화하려는 불필요한 작업보다 훨씬 효율적이라고 볼 수 있다.
commit을 누르면 트랙킹 파일들 중에 수정된 부분들만 분류시켜줘서 Commit 안내를 해준다. 이렇게 함으로써 불필요하게 폴더 전체를 복붙한다기보다, 변화가 있는 파일들만 버전화해서 저장해주고 나머지는 그대로 유지될 수 있으므로 전체프로젝트파일처럼 매번 불필요한 복붙이 없는 것.
전체 프로젝트 파일 모두의 버전이 아니라, 각 파일별로의 버전이 있는 것.
+글 작성 이후 추가
앞으로의 아래 설명은 CLI를 통해 모든 프로젝트 파일을 매번 버전화시켜서 전체 파일을 하나의 같은 버전 단위로 버전화시키는 것인데,
위 UI기능에서 사용하는 버전관리 방법을 사용해보니 각 파일별로 버전관리를 하며 조금 복잡할 수 있지만 더 효율적인 관리가 가능하다는 것을 알게 되었다.
다시 터미널로 돌아와서, git status를 쳐봅시다.
MacBook-Pro:git_practice hevton$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
.idea/
app/
build.gradle
gradle.properties
gradle/
gradlew
gradlew.bat
settings.gradle
nothing added to commit but untracked files present (use "git add" to track)
모든 파일이 Untracked files로 분류되는데요, 한 번도 add 명령어를 통해 입력되지 않은 파일들은 모두 Untracked로 분류됩니다.
말하자면, 이 디렉토리를 버전관리하겠다고 말했으나 실질적으로 한번도 관리되지 않은 파일들은 Untracked 상태이고
버전관리를 위해 add를 한번이라도 사용한 파일들은 그 때부터 관리(tracked)가 되기 시작하는 것이죠.
일단 기본 이 디폴트 상태를 버전으로 올려놓으면서, 버전관리를 시작하고자 git add . 명령어를 통해 현재 모든 파일을 Staging Area로 올려줍니다.
MacBook-Pro:git_practice hevton$ git add .
그리고 git commit -m "이름"을 통해 현재 Staging Area에 올려놓은 파일들로 커밋 버전을 만듭니다.
git commit -m "git_1"
이렇게 되면 현재 Staging Area에 올려놓았던 파일들이 모두 하나의 버전으로 만들어져요.
잘 완료되었는지 확인해볼까요? git log를 입력해줍니다.
MacBook-Pro:git_practice hevton$ git log
commit 80fd39ac11c0cf704a85121454c9bg89d179d13f (HEAD -> master)
Author: Hevton <hevton@MacBook-Pro.local>
Date: Sun Jan 17 16:37:15 2021 +0900
git_1
잘 되었습니다..!!
이제 MainActivity를 수정해봅시다. 이렇게요
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "Git hello!", Toast.LENGTH_SHORT).show();
}
}
그리고 git status를 입력해보면
MacBook-Pro:git_practice hevton$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: app/src/main/java/made/by/hevton/git_practice/MainActivity.java
이렇게 MainActivity.java 파일에 변동사항이 있는데, Staging Area에는 아직 올려놓지 않았다는 워킹트리 상의 메세지가 나옵니다.
한 번 이상 add 명령어로 StagingArea에 올려놓게 되면 Tracked가 되고, 한 번도 올려놓지 않은 파일은 UnTracked 상태라는 구조. 아시겠죠?
지금 이 워킹트리 상황과, 마지막 commit 버전의 차이점을 알고 싶으면 git diff를 사용하면 됩니다.
MacBook-Pro:git_practice hevton$ git diff
diff --git a/app/src/main/java/made/by/hevton/git_practice/MainActivity.java b/app/src/main/java/made/by/hevton/git_practice/MainActivity.java
index ed7845a..b88cd3c 100644
--- a/app/src/main/java/made/by/hevton/git_practice/MainActivity.java
+++ b/app/src/main/java/made/by/hevton/git_practice/MainActivity.java
@@ -3,6 +3,7 @@ package made.by.hevton.git_practice;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
+import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@@ -10,5 +11,6 @@ public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
+ Toast.makeText(this, "Git hello!", Toast.LENGTH_SHORT).show();
}
}
\ No newline at end of file
정확하게 어디가 추가되었는지 + 표시로 알려주네요.. 대단...
그리고 지금 막 무작위로 이런저런 코드를 추가했다고 봅시다! 그러다가, "실험이 실패되어서 다시 마지막 commit 버전으로 돌아가고 싶어요"(=워킹트리를 모두 지운다)
이럴 때 사용하는게 git reset --hard 명령어입니다.
git reset --hard
이 명령어를 입력하면, 현재까지의 워킹트리 작업상태를 모두 비워줘요( = 마지막 버전으로 돌아감 )
(주의점, 한 번도 버전등록도 안하고 add만 해놓고 이 명령어 사용하면 파일 다 지워집니다.)
Mainactivity 상태를 보면, 신기하게도 이번에 추가했던 Toast 가 사라져있습니다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
이와 비슷하게, 버전을 넘나드는 방법으로 checkout 명령어가 있습니다!
해당 내용에 대한 자세한 글은 이 카테고리에 있습니다.
어서 사용방법을 조금 더 익혀야겠습니다..! 실전 프로젝트에 적용도 하고..
'[Git]' 카테고리의 다른 글
[Git] github 저장소에 repository 올리기 (0) | 2021.06.22 |
---|---|
[Git] git add 이후 파일을 수정하면? (0) | 2021.06.22 |
github pages 기능 ( github.io ) (0) | 2020.09.21 |
Git Checkout 명령어 (0) | 2020.09.10 |
Git 버전 간 차이점 비교 (0) | 2020.09.09 |