📝

8. 그 외 명령어

 
이전까지 배웠던 내용과 외에 협업할 때 자주 쓰는 명령어입니다.
 

1. amend

커밋은 하나의 기능을 만들 때 변경사항을 저장해 주는 것이 좋습니다. 하나의 기능을 만들고 커밋을 할 때 실수로 커밋을 못한 파일이나 수정된 파일이 있을 수도 있습니다. 이때, 최신 커밋에 추가하고 싶을 때에 amend를 사용합니다. amend를 한 후 커밋을 보면 기존 커밋과 amend한 내용이 저장됩니다.
 
하지만, 이 경우에 한 번 더 커밋하면 되지 라고 생각할 수도 있는데 같은 기능을 나타내는 커밋이 2개가 생기면 커밋을 되돌릴때 혼동이 올 수 있습니다.
commit 한 경우commit 한 경우
commit 한 경우
amend한 경우amend한 경우
amend한 경우
 
amend라는 기능을 amend.txt에 작성하겠습니다.
amend 1
amend.txt
 
$ git add amend.txt $ git commit -m "기능 추가"
 
기능을 수정합니다.
amend 1 amend 2
기능 수정 후
 
amend를 이용하여 최신 커밋에 수정한 내용을 추가합니다.
$ git add amend.txt $ git commit --amend
notion imagenotion image
 
이때, 혼자 사용하는 것이 아닌 여러명이 사용하는 브랜치인 경우는 히스토리가 꼬일수도 있으므로 조심해 주셔야 합니다.
 

2. stash

현재 브랜치에서 아직 커밋 못한 파일들이 있는데 커밋하기 애매하고 다른 브랜치로 넘어가야 하는 경우 현재 브랜치의 변경사항을 잠시 보관할 때 사용합니다.
stash는 git 저장소에 관리하고 있는 파일, 첫 커밋이 일어난 대상으로 실행하며 스테이지에 있는 내용과 들어가지 않는 변경사항 모두 저장합니다.
 
master 브랜치에서 README.md와 index.txt를 커밋 후 두 파일에서 수정사항이 발생되었을 때를 가정하고 시작하겠습니다. 우선, README.md 파일을 스테이지에 올리겠습니다.
$ git add README.md $ git status
notion imagenotion image
 
stash를 하면 하고 있던 작업을 임시 저장하고 가장 최근 커밋 상태로 만듭니다.
$ git stash $ git status
notion imagenotion image
 
git 저장소에 관리하지 않는 파일까지 모두 저장하고 싶으신 경우에는
$ git stash --all
 
이후 다른 브랜치에서 작업을 하고 돌아온 후, 가장 최근에 임시 저장한 내용을 가져옵니다. 이때, 스테이지 상태까지 그대로 복원하지 않습니다.
$ git stash pop
notion imagenotion image
 

3. reset

브랜치에 여러가지 버전을 올린 후 옛날 커밋으로 브랜치를 되돌릴 때 사용합니다.
히스토리를 아예 초기화합니다.
$ git reset [mode]
 
mode 중 자주 사용하는 것을 확인해보도록 하겠습니다.
  • hard : 모든 변경사항 버림. 이후 변경사항을 다 버리고 옛날 커밋으로 reset
  • mixed : 변경 사항은 로컬에 저장하고 커밋은 리셋, unstage
  • soft : 커밋을 삭제하고 모든 로컬 변경사항을 유지, stage
 
커밋 내역을 보도록 하겠습니다.
git log
notion imagenotion image
 
커밋마다 README.md 파일에 작성된 내용입니다.
first second third
second commit
first second third fourth
third commit
first second third fourth fifth
fourth commit
first second third fourth fifth sixth
fourth commit
 

3-1. hard

third commit 으로 되돌려 보도록 하겠습니다.
$ git reset --hard commit-id $ git log
notion imagenotion image
first second third fourth fifth
README.md
 
이때, push를 하면 에러가 발생합니다. 히스토리를 고치는 push이기 때문입니다. 강제로 push를 해야합니다. 마찬가지로 혼자 쓰는 브랜치에서만 사용하시고 여러명이 사용하는 브랜치에서는 사용하시면 안됩니다.
 

3-2. mixed

second commit 으로 되돌려 보도록 하겠습니다.
$ git reset --mixed commit-id $ git log
 
이때, 로컬에서 README.md 를 살펴보면 작업내용이 사라지지 않고 commit 만 리셋된 것을 볼 수 있습니다.
notion imagenotion image
first second third fourth fifth
README.md
 

3-3. soft

이때까지 변경내역을 unstaged에 남겼다면 soft는 staged 영역에 남기게 됩니다. git commit 을 했을 때 기존 상태로 돌아오게 됩니다.
 
README.md 파일을 스테이지에 올려보도록 하겠습니다.
$ git add README.md $ git log $ git status
notion imagenotion image
 
모드를 soft로 설정한 후 커밋 내역을 삭제합니다.
$ git reset --soft commit-id $ git log $ git status
 
히스토리를 살펴보면 커밋 내역은 사라지고 작업 내역은 stage에 남은 것을 볼 수 있습니다.
notion imagenotion image

4. revert

이력을 남겨 변경사항을 되돌리고 커밋을 생성
reset과 같이 커밋으로 브랜치를 되돌리고 싶을 때 사용합니다. reset은 히스토리를 아예 초기화 하므로 다른사람 히스토리에 영향을 주니 revert를 사용해 커밋을 새로 만듭니다.
히스토리를 계속 쌓으면서 변경
master는 모든 사람이 보고 있는 브랜치 이기 때문에
다른 사람이 버전을 수정하고 있는 경우 충돌이 나게 됩니다.
그렇기 때문에 히스토리를 수정하는 대신 새로운 히스토리를 남기면서 되돌립니다.
 
$ git log $ git revert commit-id
notion imagenotion image
first second third fourth fifth
fourth commit
 

5. cherry-pick

여러가지 커밋 중에 내가 원하는 커밋만 떼와서 현재 브랜치에 붙일 수 있습니다.
cherry-pick 하기 전cherry-pick 하기 전
cherry-pick 하기 전
cherry-pick 한 후cherry-pick 한 후
cherry-pick 한 후
 
브랜치에 버그가 생긴 경우 버그를 고쳐서 main 브랜치에 merge. main에 수정사항이 많아 당장 머지를 할 수 없는 상황.근데 릴리즈 브랜치에는 버그 수정커밋이 들어가야할 때, main에서 버그 수정 커밋만 떼서 붙입니다.
 
우선 master 브랜치와 cherry 브랜치가 있다고 가정하겠습니다.
$ git branch cherry $ git switch cherry
 
cherry 브랜치에서 README.md를 수정하고 add > commit 을 하겠습니다.
$ git add README.md $ git commit -m "commit message"
 
다시 master 브랜치로 돌아와서 cherry-pick 을 사용하여 cherry 브랜치에서 커밋을 떼 오도록 하겠습니다
$ git log $ git switch master $ git cherry-pick commit-id
 
notion imagenotion image
 
 

 

pull request

  • 다른 저장소에서 fork 해온 코드를 머지!
  • 일반 저장소에서도 보낼 수 있고, fork한 저장소에서 보낼 수도 있음.
  • 협업할 때 직접 머지가 아니라 풀리퀘!
  • 코드리뷰!
  • 수정이 필요하면 댓글을 달아 change request!
  • 오픈소스에 PR을 보낼 때에는 '기여 안내서'를 반드시 참고! 안읽으면 어차피 머지 안해줌!
  • fork한 github 페이지에 소스코드 바로 위 pull request라는 버튼 있음
  • Create pull request를 누른다음 작성하면 됨
  • 관리자가 fork된 repo에 가서 뎃글 달 수 있음(Pull requests을 누르고 4개의 탭(conversation, commits, checks, filechanged) 중 files changed 선택)
  • 서로 뎃글 주고 받을 수 있음.
  • merge full request누르면 잘 머지가 된 것임!