$ git commit --amend
직전 커밋을 새로 덮어쓴다. 이전에 있던 커밋은 사라지고 새로 만든 커밋이 자리를 대신한다.
가장 최근 커밋을 변경할 때 자주 쓴다.
ex) hello.md를 작성하고 커밋했다. hello.md를 다시 보니 오타가 발견되었다.
오타를 수정후
$ git add [file] or [.]
$ git commit --amend
$ git revert [commit]
혼자서 관리하는 레포는 강제 푸시를 해도 상관 없다. 그러나 공용 레포라면 절대로 강제 푸시하면 안된다.
만약 어떤 커밋을 푸시 후, amend
커밋을 만들었다면 충돌이 난다. 왜냐하면 직전 커밋은 사라지고 새로운 커밋이 대체했기 때문이다.
보통은 git push --force
강제 푸시 한다. 공용 레포라면 git revert
를 사용하자.
revert
는 대상 커밋과 반대되는 커밋을 만든다. A 커밋이 "hello"라는 단어를 추가한 커밋이라면, revert 커밋은 A 커밋의 반대 커밋이다.
A - B - C
$ git revert A
A - B - C - A'
A'
는 A 커밋을 무효화하는 커밋이다.
$ git reset --[soft, mixed, hard] [commit]
git은 세가지 영역을 관리한다. working tree
, stage(index)
, commit
-
soft
commit
만 되돌린다. -
mixed
commit
,stage
를 되돌린다. -
hard
commit
,stage
,working tree
를 되돌린다.
되돌리고 나서 다시 앞으로 가고 싶은 경우, 약간 피곤해진다. ref
를 뒤져야한다.
$ git checkout -b [브랜치_이름] [대상_커밋]
브랜치를 만들어 되돌아가고 수정 후, 원래 브랜치로 merge
나 rebase
하는 방법이다.
장점 : 기존 커밋들을 건드리지 않고 다른 context
에서 작업할 수 있으므로 좋다.
단점 : merge
나 rebase
할 때 충돌날 수도 있다. 브랜치가 많아진다.