반응형

만약 로컬에 커밋을 하고 서버에 push까지 했는데 이걸 예전커밋으로 돌려야할 경우가 있다.

이럴 경우 3가지 방법이 있다.


1. Revert 를 이용 하자.


git revert <hashcode> // 해당 커밋내용의 반대되는 내용으로 커밋한다.

       //코드를 추가 했다면 , 삭제하고, 수정했다면 원복하는 커밋이 생긴다.


git revert -n OLDER_COMMIT^..NEWER_COMMIT // Commit Range를 줘서 한번에 여러개의 Commit을 Revert할 때 쓰인다.


만약 돌아가려는 위치까지 커밋이 여러개라면 위에서 부터 순차적으로 Revert를 진행해줘도 하나씩 반대되는 커밋을 생성하면서

원래대로 RollBack을 시켜야 하는 불편함이 있다.

위 커맨드로 실행을 하고 오류가 발생하지 않았다면, 서버에 Push하면 롤백이 완성되었다고 할 수 있다.


주의) 만약에 이미 내가 서버에 올린 소스를 다른사람이 수정해서 중간에 다른 사람의  커밋이 섞여 있다면, Revert중간에 오류가 발생할 소지 가         있다고 생각한다.


2. Reset 이용하자.(위험 하지만 , 간단하다.)


git reset --hard <hashcode> //rollback하고 싶은 시점의 커밋으로 돌린다.


git push origin +master  //강제로 현재 상태를 서버에 Update한다. origin , master 는 자신의 remote 이름과 브랜치 이름에 따라서 바뀔것이고 ,                                 //중요한건 "+" 이 기호이다 이게 강제로 overwrite하겠다는 커맨드 인것 같다.

                                 //이커맨드를 실행하면 정말로 push 할것 인지 확인을 위한 Git Password를 확인한다.

    //아마도 리스크가 큰 커맨드라서 확인을 하는 것 같다.


주의) 만약 내가 올린 코드를 누군가 받아서 이미 작업을 했다면, 그동안 롤백을 진행했고 , 다른 사용자가 이미 받은 코드로 작업을 해서 올린다면

 어떤 오류가 발생할지 난 알 수 없다. ^^;


반응형

git init
//만약에 .git 파일이 없다면 이 커맨드를 입력

git remote add origin <server repo url>
git push --mirror

위와 같이 하면 Local Git의 히스토리 까지 모두 서버로 옮길 수 있다.


만약에 제대로 Remote 서버가 등록 되었는지 알아보려면 아래의 커맨드를 실행하면 알 수 있다.


git remote -v

'Tools > GIT Tutorial' 카테고리의 다른 글

Git SubModule 사용하기  (0) 2017.08.30
Git Server에 커밋을 RollBack해야 할 때  (0) 2017.04.20
Git Alias [유용한 나의 Alias]  (0) 2016.12.01
Git Log Filtering  (0) 2016.11.17
Git 자주 사용하는 Command  (0) 2016.08.27
반응형
[alias]

 st = status -s

 cl = clone

 ci = commit

 cm = commit -m

 cma = commit -a -m

 ca = commit --amend

 amend = commit --amend

 caa = commit -a --amend -C HEAD

 filelog = log -u

 fl = log -u

 ai = add --interactive

 co = checkout

 br = branch

 bra = branch -ra

 le = log --oneline --decorate --remotes --branches

 ll = log --pretty=format:%C(yellow)%h%Cred%d\\ %Cblue\\ [%cn]%Creset%s --decorate --numstat

 ls1 = log --pretty=format:%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn] --decorate

 lds = log --pretty=format:%C(yellow)%h\\ %C(green)%ad%Cred%d%Creset\\ [%cn]\\ %<(20)%s --decorate --date=format:%y/%m/%d_%H:%M:%S --graph

 ldsa = log --pretty=format:%C(yellow)%h\\ %C(green)%ad%Cred%d%Creset\\ [%cn]\\ %<(20)%s --decorate --date=short --graph --remotes --branches

 ls = log --pretty=format:%C(green)%h\\ %C(yellow)[%ad]%Cred%d\\ %Creset%s%Cblue\\ [%cn] --decorate --date=relative

 lc = "!f() { git ll $1^..$1; }; f"

 lnc = log --pretty=format:%h\\ %s\\ [%cn]

 la = !git config -l | grep alias | cut -c 7-

 diff = diff --word-diff

 d = diff --word-diff

 dc = diff --cached

 dl = !git ll -1

 dlc = diff --cached HEAD^

 dr = "!f() { git diff -w $1^..$1; }; f"

 diffr = "!f() { git diff $1^..$1; }; f"

 branch = branch -ra

 r = reset

 r1 = reset HEAD^

 r2 = reset HEAD^^

 rh = reset --hard

 rh1 = reset HEAD^ --hard

 rh2 = reset HEAD^^ --hard

 rbp = rebase -p

 svnr = svn rebase

 svnd = svn dcommit

 svnl = svn log --oneline --show-commit

 sl = stash list

 sa = stash apply

 ss = stash save

 cp = cherry-pick

 grep = grep -Ii

 gr = grep -Ii

 gra = "!f() { A=$(pwd) && TOPLEVEL=$(git rev-parse --show-toplevel) && cd $TOPLEVEL && git grep --full-name -In $1 | xargs -I{} echo $TOPLEVEL/{} && cd $A; }; f"

 f = !git ls-files | grep -i

 done = "!f() { git branch | grep $1 | cut -c 3- | grep -v done | xargs -I{} git branch -m {} done-{}; }; f"

 assume = update-index --assume-unchanged

 unassume = update-index --no-assume-unchanged

 assumed = !git ls-files -v | grep ^h | cut -c 3-

 unassumeall = !git assumed | xargs git update-index --no-assume-unchanged

 assumeall = !git st -s | awk {'print $2'} | xargs git assume

 lasttag = describe --tags --abbrev=0

 lt = describe --tags --abbrev=0

 ours = "!f() { git co --ours $@ && git add $@; }; f"

 theirs = "!f() { git co --theirs $@ && git add $@; }; f"

 rem = !git config -l | grep remote.*url | tail -n +2

 lap = "!f() { git --git-dir=$1 format-patch -k -1 --stdout $2 | git am -3 -k; }; f"

 sba = "!f() { git subtree add --prefix $2 $1 master --squash; }; f"

 empty = !git commit -am\"[empty] Initial commit\" --allow-empty

 ra = "!f() { git remote add $1 https://bitbucket.org/$2.git; }; f"

 gm = merge --no-ff

 arch = archive -o
반응형

1. Commit 한 사람으로 필터링

git log --author=<pattern>

ex) git log --author=홍길동


2. 날짜 이후로 필터링

git log --after={2011-11-11} ---> 11/11이후이 커밋만 보여준다.


3. 커밋 메세지로 필터링.

git log --grep=<pattern>

ex) git log --grep=메세지내용


4. Log에서 File 상태까지 보고 싶을때

git log --name-status


+ Recent posts