GitNotes.7-3.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 7.3: reflog 활용하기

rebase 수행시 작업이 원하는 대로 완료되지 않았을 때, rebase 이전의 커밋으로 되돌려서 작업을 다시 시도해 보고 싶을 수 있다. 이런 경우 reflog 를 이용하는 것이 편리하다 (reflog 는 최근 90일간의 사용자가 수행한 로컬 작업 내역을 기록하고 있다 - 이 설정은 변경 가능하다):

$ git reflog 4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo 4a5cbb3 HEAD@{1}: rebase: fixed such and such 904f7f0 HEAD@{2}: rebase: checkout upstream/master 3cbe20a HEAD@{3}: commit: fixed such and such ...

reflog 기록으로부터 rebase 직전의 커밋이 HEAD@{3} (해시값을 참조하는 것도 가능하다) 임을 확인 가능하다:

git checkout HEAD@{3}

이렇게 rebase 직전의 커밋으로 돌아간 후, 새로운 브랜치 생성 / 예전 브랜치 삭제 / rebase 재수행 등의 작업을 할 수 있다.

reflog 를 이용하여 아래와 같이 기록상의 특정 지점으로 직접 초기화를 수행할 수도 있으나, 이러한 작업이 실제 사용자가 원하는 작업인지 100% 확신할때만 수행하도록 한다:

git reset --hard HEAD@{3}

위 명령어는 사용자의 현재 Git tree 내용물을 파라미터로 주어진 지점의 내용물과 동일하게 재설정한다 ("7.2: 변경 사항을 되돌리기" 참고).

이러한 방법은 특정 브랜치를 다른 브랜치에 rebase 했을때 어떻게 동작하는지 확인을 위해 임시로 작업을 완료하고 나서, 실제 결과물은 계속 유지하고 싶지 않을때 사용할 수 있다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.7-2.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 7.2: 변경 사항을 되돌리기

작업 디렉토리 내의 특정 파일이나 특정 디렉토리에 대한 변경사항을 되돌리기:

git checkout -- file.txt

역주: git checkout 이용시 커밋이나 stage 하지 않은 변경사항을 되돌립니다

현재 디렉토리 내의 모든 파일 및 서브 디렉토리들에 대해 재귀적(recursively) 으로 모든 작업본들의 변경사항을 되돌리기:

git checkout -- .

변경사항 중 일부분만을 되돌리기 위해서는 --patch 옵션을 이용한다. 각각의 hunk 단위의 변경 사항들마다 사용자는 해당 변경사항을 되돌릴지 말지 결정할 수 있다.

git checkout --patch -- dir

index 에 추가된 변경 사항들을 되돌리기:

git reset --hard

--hard 옵션 없이 위 명령어를 수행할 경우에는 soft reset 을 수행할 것이다.

아직 원격 저장소에 push 하지 않은 로컬 커밋들에 대해서는 soft reset 을 사용할 수 있을 것이다. 이러한 방법으로 커밋들과 파일들에 대한 재작업을 수행할 수 있다.

git reset HEAD~2

위 예제 수행시, 현재 작업본에 해당하는 파일들을 유지한 채 사용자의 마지막 두개의 커밋을 되감기(unwind) 할 것이다. 이 상태에서 사용자는 추가적인 수정사항들과 커밋을 생성할 수 있다.

주의: 여기서 소개된 모든 조작법은 (soft reset 은 제외) 사용자의 변경사항들을 완전히 삭제할 것이다. 보다 안전한 작업을 위해서는 상황에 따라 git stash -p 혹은 git stash 등을 사용하도록 한다. 이후에 stash pop 을 통해 되돌리기 작업을 취소하거나 stash drop 을 이용하여 되돌리기 한 내역을 완전히 삭제할 수 있다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.7-1.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 7.1: 이전 커밋으로 되돌리기

이전 커밋으로 작업 환경을 돌리고 싶다면, 우선 git log 명령을 이용해 커밋의 해시값을 확인한다.

일시적으로 작업 환경을 해당 커밋으로 올리고 싶다면, 현재 HEAD를 아래와 같이 detach 시킨다:

git checkout 789abcd

위 명령어는 사용자의 작업 환경을 789abcd 커밋에 위치시켜 줄 것이다. 이제 사용자가 이 예전 커밋 위에 새로운 커밋을 추가하더라도, 기존 HEAD 가 가리키던 브랜치에는 아무런 영향을 미치지 않는다. 이렇게 추가된 새로운 수정 사항들은 branchcheckout -b 등의 Git 명령을 통해 정식 브랜치로 만들어질 수 있다.

현재의 변경 사항들을 유지하면서도 작업 환경을 예전 커밋으로 되돌리기를 원한다면, 아래와 같이 수행한다:

git reset --soft 789abcd

가장 마지막 커밋을 되돌리고 싶다면, 아래와 같이 수행한다:

git reset --soft HEAD~

특정 커밋 이후의 모든 변경사항들을 완전히 무효화하길 원한다면, 아래와 같이 수행한다:

git reset --hard 789abcd

마찬가지로, 이전 커밋 이후로의 모든 변경사항들을 완전히 무효화하길 원한다면, 아래와 같이 수행한다:

git reset --hard HEAD~

주의: 위와 같이 무효화시킨 커밋들은 reflogreset 을 이용하여 복구를 할 수 있지만, 커밋되지 않은 변경사항들은 복구가 아예 되지 않는다.

안전한 작업을 위해서는 git reset --hard 보다는 git stash; git reset 을 이용하는 것을 권장한다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.6-12.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 6.12: UTF-16 형식으로 인코딩된 파일들과 plist 바이너리 파일들의 변경 내역 확인하기

UTF-16 으로 인코딩된 파일들 (현지화(localization)에 사용되는 iOS와 macOS의 strings 파일들이 좋은 예이다)의 변경 내역 출력을 위해서는 Git 으로 하여금 변경 내용 확인을 어떤 식으로 수행해야할지 지정이 필요하다.

자신의 ~/.gitconfig 파일 내에 아래 내용을 추가한다.

[diff "utf16"] textconv = "iconv -f utf-16 -t utf-8"

iconv 는 서로 다른 인코딩간의 변환을 처리해주는 프로그램이다. 그런 후, 해당 변환이 필요한 저장소의 루트 디렉토리에 .gitattributes 파일을 새로 생성하거나 혹은 기존 파일을 편집하여 아래 내용을 추가한다. 물론 ~/.gitattributes 파일을 수정할 수도 있다.

*.strings diff=utf16

위 설정은 .strings 으로 끝나는 파일들에 대해 git diff 를 수행하기 전에 utf16 에 대한 인코딩 변환을 해줄것이다.

이러한 변환 처리는 텍스트로 변환 가능한 다른 파일 종류에 대해서도 적용할 수 있다. 예를 들어 바이너리 형식의 plist 파일 처리를 위해서는 .gitconfig 파일에 아래와 같은 항목을 추가하고,

[diff "plist"] textconv = plutil -convert xml1 -o -

.gitattributes 파일에는 아래와 같이 추가할 수 있다.

*.plist diff=plist

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.6-11.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 6.11: meld 툴을 이용하여 작업 디렉토리 내의 모든 수정사항을 확인하기

git difftool -t meld --dir-diff

위 명령어는 meld 를 이용하여 작업 디렉토리 내의 변경사항들을 보여줄 것이다. 추가적으로,

git difftool -t meld --dir-diff [COMMIT_A] [COMMIT_B]

위 명령어와 같이 수행하면 특정 두개의 커밋 사이의 차이점을 확인할 수 있다.

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.6-10.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 6.10: 두 커밋 혹은 두 브랜치 사이의 차이점 확인하기

두 브랜치 사이의 차이점을 확인하려면 아래와 같이 수행한다

git diff <branch1>..<branch2>

두 커밋 사이의 차이점을 확인하려면 아래와 같이 수행한다

git diff <commitId1>..<commitId2>

현재 브랜치와의 차이점을 확인하려면 아래와 같이 수행한다

git diff <branch/commitId>

변경내역을 요약해 보려면 아래와 같이 수행한다

git diff --stat <branch/commitId>

특정 커밋 이후로 변경된 파일들의 목록을 확인하려면 아래와 같이 수행한다

git diff --name-only <commitId>

특정 브랜치와 비교했을때 차이점이 있는 파일들의 목록을 확인하려면 아래와 같이 수행한다

git diff --name-only <branchName>

특정 커밋 이후로 변경된 파일들 중 특정 폴더 내의 목록만을 확인하려면 아래와 같이 수행한다

git diff --name-only <commitId> <folder_path>

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.6-9.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 6.9: patch 명령어와 호환되는 diff 결과물 생성하기

가끔식은 patch 명령어를 이용해서 변경 내역을 적용할 수 있는 diff 결과물이 필요할 때가 있다. 기본적인 git --diff 명령어의 결과물은 이러한 경우에 바로 사용할 수 없으므로, 아래 명령어를 사용하라:

git diff --no-prefix > some_file.patch

이후, 이렇게 생성된 패치 파일을 다른 곳에서 이용해 변경 내역을 적용할 수 있다:

patch -p0 < some_file.patch

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형
GitNotes.6-8.md
본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

Section 6.8: 현재 커밋과 이전 커밋 사이의 차이점 표시하기

git diff HEAD^ HEAD

위 명령은 이전 커밋과 현재 커밋 사이의 변경 사항을 표시해 줄 것이다.

역주: HEAD 는 마지막 커밋을, HEAD^ 는 마지막 커밋 직전 커밋을 가리키므로, 현재 작업 디렉토리에 커밋하지 않은 수정사항이 있을 경우에는 위 명령어의 결과와 git diff HEAD^ 의 결과가 다르게 나옵니다. (커밋하지 않은 수정사항이 없는 경우에는 동일)

[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)

반응형

+ Recent posts