반응형

출처 : http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

잃어버린 commit들 복구하기

만약 당신이 마지막 commit을 버리기 위해 git reset --hard HEAD^ 를 실행하였습니다. 그런데 그 변경이 필요하지 않았음이 밝혀졌습니다.  당신은 두 번 다시 완벽하게 알고리즘을 구현할 수 없고 다시 원래대로 복구해야 합니다. 겁먹지 말고 git은 당신의 잃어버린 그 commit을 가지고 있습니다. reset할 때 당신이 버린 commit은 "dangling" 상태가 됩니다. 그것은 git의 데이터로 보관되어 있고 다음 garbage collection 때 치워질 것입니다. 당신이 위 명령을 실행했을 때 부터 git gc를 실행하지 않는다면 당신은 그것을 복구할 수 있습니다.

예를 들어 저는 이 블로그를 위한 코드를 작성하였습니다. 그리고 바로 다음을 실행합니다.

$ git show-ref -h HEAD
  7c61179cbe51c050c5520b4399f7b14eec943754 HEAD

$ git reset --hard HEAD^
  HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid

$ git show-ref -h HEAD
  39ba87bf28b5bb223feffafb59638f6f46908cac HEAD

우리의 HEAD는 하나의 commit으로 저장된 상태입니다. 이 때 우리는 git pull으로 그것을 원래대로 돌릴 수 있다면 우리의 local repository는 그 commit을 알고 있다고 가정할 수 있습니다. 우리는 그것을 원래대로 돌리기 위해 그 commit의 SHA1이 필요합니다. 우리는 fsck명령으로 그 commit에 대해 알고 있다는 것을 증명할 수 있습니다.

$ git fsck --lost-found
  [... some blobs omitted ...]
  dangling commit 7c61179cbe51c050c5520b4399f7b14eec943754

또한, git은 reflog명령을 사용하여 아직 그 commit에 대해 알고 있다는 것을 확인 할 수 있습니다.

$ git reflog
  39ba87b... HEAD@{0}: HEAD~1: updating HEAD
  7c61179... HEAD@{1}: pull origin master: Fast forward
  [... lots of other refs ...]

결국, 우리는 복구하고자 하는 SHA1:7c61179 을 알았습니다. 만약 현재 branch에 복구하고자 하는 그 commit을 바로 적용하려면, git merge함으로서 그 commit으로 복구할 것입니다.

$ git merge 7c61179
  Updating 39ba87b..7c61179
  Fast forward
    css/screen.css |    4 ++++
    submit.html    |    4 ++--
    2 files changed, 6 insertions(+), 2 deletions(-)

이 명령은 우리의 잃어버린 변화들을 되돌릴 것이고 HEAD가 그 commit을 가리키도록 보장할 것입니다. 여기서부터 평소처럼 작업을 이어서 할 수 있습니다. 또한, 당신은 새로운 branch로 복구할 SHA1을 checkout할 수 있지만 merge가 당신이 그 hash를 가지고 있을 때 잃어버린 commit을 복구하는 가장 빠르고 쉬운 방법입니다. 혹시 당신이 다른 방법을 알고 계시면 댓글을 남겨주세요!

만약 이러한 상황에서 할 수 있는 더 많은 option들을 알고 싶다면, Mathieu Martin’s illustrated guide to recovering lost commits with Git이 충분히 당신에게 도움이 될 것입니다.


반응형
반응형

출처 : http://stackoverflow.com/questions/5471174/git-move-branch-pointer-to-different-commit

Git: branch 포인터를 특정 commit으로 이동하게 하기.

check-out된 branch의 포인터를 이동하기 위해 git reset --hard 명령을 사용할 수 있습니다. 하지만 check-out되지 않은 branch의 포인터를 다른 commit을 가리키도록 이동하는 방법을 알고 싶습니다. (기존에 추적중인 원격 branch같은 다른 정보들은 유지되어야 합니다.)


3 개의 답변 중 1개의 답변만 추려냄.

git branch -f <branch-name> [<new-tip-commit>]

만약 new-tip-commit 이 생략되면 기본적으로 현재 commit을 가리킵니다.

반응형

'Git' 카테고리의 다른 글

git log  (0) 2015.08.31
Git에서 새롭고 비어 있는 branch를 만드는 방법  (0) 2015.07.17
Git: 파일 checkout 없이 git branch 변경하기  (0) 2015.03.18
잃어버린 commit들 복구하기.  (0) 2015.01.22
git config  (2) 2014.11.14
반응형



Git 최초설정

/etc/gitconfig 파일 : 시스템의 모든 사용자와 모든 저장소에 적용되는 설정. git config --system 옵션으로 이 파일을 읽고 쓸 수 있다.

~/.gitconfig 파일 : 특정 사용자에게만 적용되는 설멍이다. git config --global 옵션으로 이 파일을 읽고 쓸 수 있다.

.git/config : 이 파일은 Git 디렉터리에 있고 현재 작업 중인 프로젝트에만 적용된다. 각 설정은 역순으로 우선시된다. 그래서 .git/config가 /etc/gitconfig보다 우선한다.

프로젝트마다 적용하고 싶으면 --global 옵션을 빼고 명령을 실행한다.

설정 확인

git config --list : 설정한 모든 것을 보여준다.


사용자 정보

Git이 커밋할 때 사용하는 사용자 정보를 설정한다.

git config --global user.name "John Doe"

git config --global user.email johndoe@example.com

편집기

Git에서 사용할 텍스트 편집기를 고른다.

git config --global core.edit emacs

Diff도구

Git에서 Merge 충돌을 해결하기 위해 사용하는 Diff도구를 설정할 수 있다.

git config --global merge.tool vimdiff

vimdiff 참조 

http://blog.daum.net/trvoid/236


출처

http://git-scm.com/book/ko/v1/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95


git commit 메세지 인코딩 관련 정보

git config --global i18n.commitEncoding cp949

메세지를 commit할 때 저장될 메세지의 인코딩 정보.

git config --global i18n.logoutputencoding cp949

git log, git show, git blame 명령어로 화면에 보여줄 때 출력될 문자열의 인코딩 정보. 없으면 i18n.commitEncoding를 사용한다.


출처

http://nabiro.tistory.com/153

https://www.kernel.org/pub/software/scm/git/docs/git-commit.html


git에서 파일 권한 변화를 무시하도록 설정하는 방법이 있을까요?
예시)Git에서 unstaged changes로부터 "oldmode 100755 new mode 100644"를 제거하는 방법?
git config --global core.fileMode false
현재 프로젝트에 적용하는 방법
git config core.fileMode false

출처


반응형

+ Recent posts