-
[git] 실제 프로젝트에 적용하는데 필요한 tipGit 2021. 8. 20. 20:48
1. git branch 활용
- 부서마다 다르지만, 브랜치를 만들기 전에 이슈 생성을 먼저 진행합니다. # 참고 사이트 : github issue template site
- 부서에서 진행하는 형식에 맞게, 브랜치 이름 및 컨벤션을 지켜야 합니다. # 참고 사이트 : git/github branch standards & conventions site
- 커밋 메시지를 재밌게 남기기 위해서 깃모지를 사용하기도 합니다. # 참고 사이트 : gitmoji site
2. commit 활용
1) checkout을 활용한 커밋 '이동'
HEAD로부터 몇번 째 혹은 해당 commit_id로 이동할 수 있습니다. 이때 임시 브랜치(?)로 해당 커밋이 나타나고, 해당 커밋의 소스파일을 새롭게 커밋하고싶다면 merge 작업을 거치면 됩니다. 보통 checkout 하기 전 staging area에 올라와 있는 파일들을 modified 상태로 바꿔줘야하는데 '$ git reset . ' 명령어를 사용합니다.
- $ git checkout HEAD~1 # 현 브랜치의 HEAD에서 한 단계 과거 커밋으로 이동하는 명령어입니다.
- $ git checkout HEAD~3 # 현 브랜치의 HEAD에서 세 단계 과거 커밋으로 이동하는 명령어입니다.
- $ git checkout eb92kdn # HEAD 대신 hash화된 commit id를 사용하여, 해당 커밋을 checkout할 수 있습니다.
- $ git checkout master # 해당 내역을 모두 확인 후 원래대로 돌아오고 싶다면 master로 checkout하면 됩니다.
※ git add 취소 명령어
- $ git reset HEAD [file] # staging area에 올라온 파일들을 unstaged 상태로 변경합니다.
- $ git reset . # staging area에 올라온 파일들을 modified 상태로 변경합니다.
※ $ git commit --amend # 최근 commit message를 변경합니다.
2) cherry-pick을 활용하여 선택적으로 자신의 브랜치에 적용
$ git cherry-pick commit_id
다른 브랜치에 있는 커밋을 내 브랜치에 선택적으로 적용시킬 수 있습니다. 사실 rebase, reset 기능들을 통해 선택적으로 브랜치에 병합할 수 있지만 많은 커밋들 사이에 껴있는 경우 불편함이 더욱 큽니다. 따라서 아래의 경우 cherry-pick의 역할은 빛을 발합니다.
- 커밋을 다른 브랜치에 잘못하고 이를 뒤늦게 찾은 경우 해당 커밋만 특정 커밋에 cherry-pick하고 잘못된 브랜치는 reset 혹은 revert를 수행합니다.
- 요구사항이 바뀌어 필요없는 커밋이 생겼을 경우 해당 커밋들을 빼고 특정 커밋만 cherry-pick합니다.
- 수정사항이 생겨 두개의 브랜치에 동시 commit 해야할 경우에 유용합니다.어느 한 브랜치에 커밋 후 다른 브랜치에서 cherry-pick을 수행합니다.
- 코드 의존성 때문에 다른 브랜치의 커밋 중 일부를 가져와야 할 경우유용합니다.
Example
아래의 그림에서 마스터 브랜치에 f만 선택적으로 가져오고 싶습니다. 먼저 cherry-pick 없이 수행한 결과입니다.
a - b - c - d Master
|
e - f - g Feature$ git checkout Feature
$ git rebase master
$ git checkout master
$ git merge Feature
a - b - c - d - e - f - g Master
|
e - f - g Feature
$ git reset --hard f # master g commit 삭제
a - b - c - d - e - f Master
|
e - f - g Feature
$ git reset --soft e #master f commit 해제 및 코드변화 가져오기
$ git stash # f 코드 변화 stash 저장
a - b - c - d - e Master (staged: f code changes)
|
e - f - g Feature
$ git reset --hard d //master e commit 삭제
a - b - c - d Master (git stash list: f code changes)
|
e - f - g Feature
$ git stash pop //master f 코드변화 불러오기
$ git commit f
a - b - c - d - f Master
|
e - f - g Feature$ git checkout master
$ git cherry-pick f_commit_id앞서 말 했듯이, cherry-pick 이외에도 git rebase, reset 명령어로 원하는 커밋을 선택적으로 고를 수 있습니다. 다만 git rebase는 현재 브랜치 위에서만 가능하므로, 다른 브랜치에서 commit을 가져오고 싶다면 먼저 그 브랜치를 현재 브랜치로 merge한 후 rebase해야 하는 번거로움이 있습니다.
3) commit message 취소
git reset 명령어
특정 커밋으로 되돌아갈 수 있는데, 되돌린 버전 이후의 버전 커밋들은 히스토리에서 삭제됩니다. 즉, 현재가 없었던것처럼 이력을 남기지 않습니다.
- $ git reset --soft commit_id # commit 이후 파일들을 staged 상태의 working directory에 모두 보존합니다.
- $ git reset --mixed commit_id # commit 이후 파일들을 unstaged 상태의 working directory에 모두 보존합니다.
- $ git reset --hard commit_id # commit 이후 파일들을 모두 삭제합니다.
- $ git reset HEAD~2 # 마지막 2개의 commit을 취소합니다. default는 mixed 명령어입니다.
git revert 명령어
특정 버전으로 되돌아갈 수 있지만, 되돌린 버전 이후 버전들의 이력은 남아있습니다. 즉, 이전의 commit 내역을 남겨두고 새로운 commit을 생성하면서 과거로 돌아갑니다.
혼자서 진행하는 프로젝트라면, 로컬과 리모트 커밋 히스토리가 불일치해도 git push--force를 통해 원격 저장소에 연결할 수 있습니다.
같은 branch를 공유하는 협업 프로젝트에서, 누군가 멋대로 커밋 이력을 삭제해버린다면 다른 사람이 push할 때 충돌이 일어날 것입니다. 따라서 협업 프로젝트에서 다름 팀원과 같은 branch를 공유하는 상황에서 가급적 revert 사용을 권장합니다.
$ git revert commit_id # 돌아가고자 하는 commit id를 기입합니다.
reset을 사용하면 커밋 히스토리를 깔끔하게 유지할 수 있고, 혼자 작업할 때 편하게 되돌아갈 수 있다는 장점이 있습니다. 하지만 팀원과 같은 브랜치에서 함께 작업할 때 커밋이 뒤섞여 버릴 수 있다는 위험한 단점이 있어 팀 프로젝트에서는 가급적 revert 사용을 권장합니다.
revert를 사용하면 중간에 무슨 문제가 있었는지, 왜 돌아갔는지 등의 기록이 가능합니다. 또한, 다른 사람과 같은 브랜치에서 함께 작업할 때 코드 충돌을 최소화 할수 있습니다.명령어
$ git reset hahs_id # 현재 브랜치에서 해당 hash_id로 이동하고 commit message를 남기는데 이전 커밋내역들은 모두 삭제합니다.
$ git revert hash_id # 현채 브랜치에서 해당 hash_id로 이동하고 commit message를 남깁니다.4) 중간에 커밋을 삭제하는 방법
git rebase --interactive
1. $ git rebase -i '수정할 직전 커밋' ex) $ git rebase -i HEAD~3
git rebase -i terminal 2. 각 동작은[명령어] [커밋해시] [커밋 메시지] 순서로 구성되있습니다. 원하는 명령어를 수행 후 저장합니다.
3. $ git rebase --continue
지금까지 로컬에서 작업을 처리했지만 remote 서버에 변경값을 기록하고 싶다면 'force push' 혹은 'pull을 땡겨서 merge하면 됩니다.' 만약 reset 명령어와 revert 명령어 중 어떤걸 써야될지 고민된다면 팀 프로젝트라면, revert 사용을권장합니다.
https://gmlwjd9405.github.io/2018/05/25/git-add-cancle.html[Git] git add 취소하기, git commit 취소하기, git push 취소하기 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
https://victorydntmd.tistory.com/79
[Git] 명령어(5) - reset, revert
1. reset과 revert 작업을 진행하다가 실수로 중요한 파일을 삭제했거나 제대로 병합이 안됐을 경우, 잘 작동이 되던 이전 버전으로 돌아가야 합니다. 이것이 바로 버전 관리를 하는 이유이며, 이
victorydntmd.tistory.com
[Git] reset과 revert 알고 사용하기
Git으로 협업프로젝트를 진행하였다.깃으로 협업하는데 익숙치 않은터라 한번 push를 잘못하거나, 로컬의 main 브랜치에서 원격저장소로부터 pull하고 거기서 의도와 다르게 다른 브랜치와 merge 해
velog.io
https://zakelstorm.tistory.com/29
cherry-pick 필요 상황 및 사용법
평소 git branch, checkout, add, commit, pull, push, reset, rebase, merge, stash 와 git IDE으로 부족함 없이 git을 사용하여 왔기 때문인지 git 명령어에 대한 공부가 게을러졌다. 저 위의 명령어들외에 그나..
zakelstorm.tistory.com
'Git' 카테고리의 다른 글
[git] workflow (0) 2021.08.20 [git] Github (0) 2021.08.13 [git] Command (0) 2021.08.12 [git] Introduce (0) 2021.08.11