Git Step-4 : External tool for GIT

1. Gistory

git에서 파일을 어떻게 저장하고 관리하는지 볼 수 있는 웹 베이스 툴.

  • install

    $pip3 install gistory 
      
    Collecting gistory
      Downloading gistory-0.44-py3-none-any.whl (196 kB)
         |████████████████████████████████| 196 kB 635 kB/s
    Collecting six
      Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
    Installing collected packages: six, gistory
    Successfully installed gistory-0.44 six-1.15.0
    
  • Usage

    $<git project path>/.git/gistory
    Bottle v0.13-dev server starting up (using WSGIRefServer())...
    Listening on http://0.0.0.0:8805/
    Hit Ctrl-C to quit.
    

    브라우저를 열고 http://localhost:8805/ 접속

    image-20210308161320436

  • git add 명령으로 Staging Area에 저장되었을 때

    변경전

    [commit] fc236f439fb664666974e41a5f03eae998e1b0f7

    tree aa11ae2bd24ac1ca92a879581451a452c4c0d4c0 parent f64068c96d1735c1ef757f7fb8395ba7235e21ad

    100644 blob 7c4a013e52c76442ab80ee5572399a30373600a2 README.md 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 a.txt 100644 blob 9bc8aa15552abafff42f793fcc76a03e1616335c a_develop.txt 100644 blob 6759a3e5a1490473c7bc011b0457f22de82398af a_module.java 100644 blob 3c87d729edd556087d2953c5b4903f89923300d0 b_module.java 100644 blob 9ca2d2856add5b3641d1f545a320d02b4864d601 b_moudle.java 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 break-module.java 100644 blob a3151d16f6f13ebbeabb688bf96d747288761b8d clientMain.java 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 engin-module.java 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 engin-moudle-support.java 100644 blob cf5a77127db53088ee8a01efcbcf957827bfc21d final_module.java 100644 blob b802652b867ab815273cd0a2e8f063400e6a9a96 return-module.java 100644 blob f9e86734968b29a7adf12cdf74a863a77ae35680 serverMain.java

    $ls
    README.md      b_module.java      engin-module.java          serverMain.java
    a.txt          b_moudle.java      engin-moudle-support.java
    a_develop.txt  break-module.java  final_module.java
    a_module.java  clientMain.java    return-module.java
      
    $code a_develop.txt  수정 후 저장
      
    $git add .
    

    변경 후

    수정한 a_develop.txt의 SHA-1 hash값 2자리/나머지 이름으로 /objects 디렉토리에 저장함. ./objects/51/492775649300961b30bcd4aafdbbc7de7a7f3e

    index파일에 현재 working directory를 스냅샷함. 이때 a_develop.txt만 변경 되었으므로 a_develop.txt의 hash값만 새로 만들어진 blob 51492775649300961b30bcd4aafdbbc7de7a7f3e로 변경해서 저장함.

    ./index 100644 7c4a013e52c76442ab80ee5572399a30373600a2 0 README.md 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 a.txt 100644 51492775649300961b30bcd4aafdbbc7de7a7f3e 0 a_develop.txt 100644 6759a3e5a1490473c7bc011b0457f22de82398af 0 a_module.java 100644 3c87d729edd556087d2953c5b4903f89923300d0 0 b_module.java 100644 9ca2d2856add5b3641d1f545a320d02b4864d601 0 b_moudle.java 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 break-module.java 100644 a3151d16f6f13ebbeabb688bf96d747288761b8d 0 clientMain.java 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 engin-module.java 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 engin-moudle-support.java 100644 cf5a77127db53088ee8a01efcbcf957827bfc21d 0 final_module.java 100644 b802652b867ab815273cd0a2e8f063400e6a9a96 0 return-module.java 100644 f9e86734968b29a7adf12cdf74a863a77ae35680 0 serverMain.java

  • git commit 명령으로 repository에 저장되었을 때

    ./object에 tree 객체commit 객체가 생성됩니다.

    tree 객체는 아래와 같이 index에 존재하는 파일들을 나타내는 객체입니다.

    image-20210308164438434

    commit 객체는 tree객체와 parent(이전 커밋의 tree), author, commiter, commit message 정보를 저장합니다.

    image-20210308164422454

2. difftool Visual Studio Code로 사용하기

git diff 명령은 파일 또는 커밋의 차이를 비교합니다.

image-20210309131742786

간단한 내용의 비교는 쉽게 확인할 수 있지만 많은 양의 코드를 비교할 때는 가독성이 떨어질 수 있습니다.

그래서 difftool이라는 외부툴을 이용하여 diff 결과를 볼 수 있도록 하는 기능이 있습니다.

git difftool --tool-help라는 명령을 실행하면 이용할 수 있는 difftool 들을 확인할 수 있습니다.

$git difftool --tool-help
'git difftool --tool=<tool>' may be set to one of the following:
                vimdiff
                vimdiff2
                vimdiff3

        user-defined:
                vscode.cmd code --wait $MERGED
                vscode.cmd code --wait --diff $LOCAL $REMOTE

The following tools are valid, but not currently available:
                araxis
                bc
                bc3
                codecompare
                deltawalker
                diffmerge
                diffuse
                ecmerge
                emerge
                examdiff
                guiffy
                gvimdiff
                gvimdiff2
                gvimdiff3
                kdiff3
                kompare
                meld
                opendiff
                p4merge
                smerge
                tkdiff
                winmerge
                xxdiff

Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

많이 툴들이 있지만 Visual Studio Code를 이용하는 분들이라면 저와 같은 설정으로 diff 결과를 VSCode에서 확인할 수 있습니다.

$git config --global -e

//.gitconfig 파일에서 아래 내용을 추가하고 저장합니다.
[diff]
    tool = vscode
[difftool "vscode"]
    cmd = code --wait --diff $LOCAL $REMOTE

두 개의 커밋을 difftool로 비교 합니다.

$git log --oneline 
0e3c111 (HEAD -> develop) modify 2
92fe575 modify

$git difftool 0e3c111 92fe575

명령이 실행되면 Visual Studio Code가 새창으로 뜨면서 두개의 커밋을 비교하는 화면이 나타납니다.

image-20210309132715905

만약 git difftool로만 명령을 실행하면 LOCAL과 REMOTE를 비교하고, 변경된 파일이 여러개일 경우 하나씩 창이 열립니다.

예를들어 a.txt, b.txt파일이 remote와 달라졌다면 git difftool 실행 시

a.txt를 비교하는 VSCode가 열리고 이 창을 닫으면 b.txt를 비교하는 창이 열립니다.

3. mergetool Visual Studio Code로 사용하기

difftool과 마찬가지로 merge시에도 VSCode를 이용할 수 있습니다.

conflict를 VSCode로 처리하는 예

$ git checkout -b feature/test
$ echo 'change' > a.txt
$ cat a.txt
change

$ git add .
$ git commit -m "Modify a.txt in feature/test"
$ git checkout develop

$ echo 'original' > a.txt
$ git commit -am "Modify a.txt in develop"
$ git merge feature/test
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

//이 상태에서 mergetool을 사용하면 새로운 VSCode창이 열립니다.
$git mergetool

image-20210309135118169

개발자가 소스를 수동으로 병합하고 저장합니다.

image-20210309135217841

$ git commit -m "merge end"
$ git log --oneline --graph

image-20210309135415470

정상적으로 merge가 되고 새로운 파일이 하나 생성됩니다.

 $ git status -s
 ?? a.txt.orig

a.txt.orig는 conflict 상태의 정보를 담고 있습니다. 실수로 잘못 merge한 경우에 a.txt.orig를 확인해서 수정할 수 있습니다.

$ cat a.txt.orig
<<<<<<< HEAD
original
=======
change
>>>>>>> feature/test

댓글남기기