본문 바로가기
Error_Control(에러 딱대!!)/Git & Github

[출처 : noyo0123] git 명령어 정리, 에러정리

by 스타트업_디벨로퍼 2021. 2. 21.

출처 : velog.io/@noyo0123/git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC-%EC%97%90%EB%9F%AC%EC%A0%95%EB%A6%AC-znk1zz2k5e


github을 사용하지 않았던 기존 project를 github repo에 올리기

https://injeblog.tistory.com/14

git add 취소, commit 취소, pull, merge 취소

git add 취소 : git reset HEAD
git commit 취소 : git reset --hard@^

@는 1.8.4부터 도입된 HEAD의 동의어라고 합니다. 같은걸로는 @^, @~1, @~ 가 동일합니다.

git pull, merge 충돌시 취소 : git reset --merge ORIG_HEAD
ORIG_HEAD라고 하는것은 이전에 작업한 곳의 HEAD입니다.

즉. pull 이나 merge를 하는 경우에 ORIG_HEAD를 남기게 되는데, pull을 잘못 받거나 merge를 잘못하게 되면 이것을 이용합니다.

https://mrgamza.tistory.com/593

원격 저장소의 브랜치를 로컬에 생성하고 원격 브랜치를 따라가게 하기

git checkout -t origin/<브랜치이름>

git branch -D <브랜치명> 브랜치 삭제

삭제할 브랜치 명이 feature/login 으로 가정

git checkout master git branch --delete feature/login

--delete 부분은 -D로 치환할 수 있음.

원격 브랜치 삭제

git push origin --delete feature/sth

https://www.lesstif.com/gitbook/git-20776547.html

git add

git add .를 했는데요.

특정파일은 커밋안하고 싶어요.
git reset <파일이름>

git reset student.json

git reset

커밋을 취소하고싶다!


출처: https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard

git reset --hard, --soft, --mixed

git reset --hard : 최신커밋 파일 자체 사라짐.
최신 commit의 변경사항이 사라짐.

git reset --soft : 최신커밋이 취소되고 변경사항이 staged 상태로 되어있음 ( git add . )한 상태

git reset --mixed : 최신커밋이 취소되고 변경사항이 unstaged 상태로 되어있음 ( 파일을 save한 상태 )

레퍼런스 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0
https://opentutorials.org/module/4032/24533

cherry-pick

특정 커밋만 빼고싶다면?

  • f05c9e6 (HEAD -> addCart)
  • d2af8ec ~~~
  • 99fa955 ~~~ <- 요 커밋의 수정내용만 빼고싶다면?
  • 765f8cd ~~~

git checkout -b addCart-backup 백업 브랜치를 만듭니다.
git reset --hard 765f8cd한 후에 99fa955커밋에서 수정한 내용을 원래대로 돌려놓고
git cherry-pick d2af8ec
git cherry-pick f05c9e6
을 하면

* f05c9e6 (HEAD -> addCart) * d2af8ec ~~~ |--> 백업브랜치 * 765f8cd ~~~

로 될겁니다. 이제 백업브랜치 제거하고 git push <remote origin(원격저장소 명칭)> addCart --force 원격저장소에 있는 git history가 다를거기때문에 push가 안됩니다. --force로 강제로 밀어넣습니다.

git rm

rm <파일> 하고 git rm <파일> 차이
git rm <파일>은 rm <파일> git add <파일>을 한번에 할 수 있대요.
파일을 지우면 끝인데 왜 git add <파일> 하냐고요? git 그렇게 생겨먹었어요.
파일을 다 tracking해요. 그래서 제거해줬으면 git add <파일> 하시면 git status 명령어로 파일도 제거하고, git이 tracking을 안하는 것을 볼 수 있습니다.

레퍼런스 : Why use 'git rm' to remove a file instead of 'rm'? - stackoverflow

git reflog

http://ohyecloudy.com/pnotes/archives/1994/

정신 없이 코딩하다.. 잘 안되었을때 코드가 복잡해서
git reset --hard <커밋> 했는데 커밋을 잘못되돌아갔다... 소스 다 지워짐..
망했다...

그때는 git reflog해서 돌아갈 HEAD@{n}을 찾아서
git reset --hard HEAD@{n} 해주면 됩니다.
https://88240.tistory.com/284

  1. git reflog 브랜치명

이 명령문은 잘못 리베이스한 로컬 컴퓨터에서 실행해야한다. 그래야 리베이스 로그를 볼 수 있다.

그리고 이 명령문은 그냥 로그를 보는 거여서, 막 쳐봐도 된다. 무서워할 필요 없다.

출처: https://americanopeople.tistory.com/206 [복세편살]
https://americanopeople.tistory.com/206

브랜치명 변경

git branch -m '기존브랜치' '새로운브랜치'
https://thdev.tech/git/2016/12/19/Git-Branch-Name-Change/

git branch -r

원격 저장소의 branch 리스트를 확인하는 방법이 있다. $ git branch -r 옵션을 주면 원격 저장소의 branch 리스트를 볼 수 있고, $ git branch -a옵션을 주면 로컬, 원격 모든 저장소의 branch 리스트를 볼 수 있다.

출처: https://mosei.tistory.com/entry/원격-브랜치-가져오기 [씹어먹는 블로그]

git commit --amend

레퍼런스

git log -p -1

커밋 로그 한줄로 보고싶을땐?

git log --oneline
git log 보면 해시값하고 커밋로그 들이 장황하게 나오는데
--oneline 옵션을 사용하면 한줄로 나오고요.
--abbrev-commit 옵션을 사용하면 git reset이나 checkout, cherry-pick 할때 쓸 수 있는 8자리로 나오기 때문에 사용하기 편합니다. 결국 hash의 앞 8자리만 사용하니까요.

git diff --cached

레퍼런스

git fetch --prune

저장소에서 지워진 브랜치를 로컬에 반영

리모트 저장소에서 지워진 branch를 로컬에 유지할 필요가 없다. 쌓여서 문제지. 이제 git fetch, git pull 명령을 입력할 때, 옵션을 안 붙여도 된다.

http://www.ohyecloudy.com/ddiary/2017/06/20/til-git-prune-with-fetch-or-pull/

git stash

git stash 시뮬레이션
a브랜치에서 작업하다가 b브랜치 이동해서 잠깐 작업해야할때
a브랜치에서 git stash 하고 b브랜치로 checkout한후 작업해서 커밋하고 푸시까지 한 후에
a브랜치로 다시 돌아와서 git stash pop

최근에 stash 한것 빼내기 git stash pop
리스트 조회 git stash list
싹다 날리기 git stash clear

git stash merge 충돌시

git stash pop을 했는데 원치 않은 파일들이 merge되려다 충돌됐어요.
git reset HEAD . : reset all the poped files

git checkout <커밋>

glog로
과거 커밋 리스트를 볼 수 있다.
특정 커밋에서 소스를 보고싶으면 git checkout <커밋>
다시 최신 상태로 돌아오고 싶으면 git checkout power-plant

원격 저장소의 branch 가져오기

git checkout -t origin/<가져올 branch 이름>
https://cjh5414.github.io/get-git-remote-branch/

git merge <브랜치명>

sca-51이란 branch에서 작업하고있습니다.
sca-51의 하위 작업을 sca-52 branch를 생성하고 작업한 후에 sca-51에 작업한 내용을 반영하고싶어요.

마치 master 브랜치에서 생성한 hotfix 작업을 pull request 한 후에 merge하는 방법과 비슷합니다.

sca-52는 sca-51로 부터 나온 branch이기 때문에 git merge가 가능합니다.

git add file git commit -m 'sca-52작업함' git checkout sca-51 git merge sca-52

참고:
https://velog.io/@godori/Git-Rebase

git rebase

rebase 하다가 충돌났을때 소스 정리하고, merge하고 git add 명령어로 충돌된 파일 staged 상태로 바꿔줍니다. git rebase --continue 해줍니다.

간혹 git add 후에 git rebase –continue 를 헸는데 여전히 컨플릭트를 수정하라는 메시지가 나올 때가 있습니다. 수정된 파일이 이미 커밋된 내용과 동일한 경우인데요. 바로 아래와 같은 경우입니다. 이때는 git rebase --skip을 해 주면 됩니다.

참고:
https://tech.10000lab.xyz/git/git-rebase-workflow.html

github 즉 리모트 리파지토리에 브랜치명 다르게 올리기

git push <repositoryAlias> <local branch name>:<remote branch name>
예를 들어, 로컬에서 branch-a인 브랜치를 리모트에는 branch-b로 올리고싶을때
git push origin branch-a:branch-b

git squash

git log로 커밋을 합치기 위해서 몇개까지 합칠건지 봅니다.

git log --oneline

커밋을 합치려고 하는개수를 N에 치환해줍니다.

git rebase -i HEAD~N

vi 편집기로 이동합니다. vi 편집기가 생소하면 "vi 명령어"로 검색하면 됩니다.
i를 눌러서 편집모드를 시작합니다. (한글이면 안되니 영어로 바꾸셔야됩니다.)
pick 커밋태그 커밋내용 순으로 나올텐데요.
첫번째 pick 빼고
나머지를 s로 바꾸고
esc -> :wq 를 해주면 저장됩니다.

그러면 커밋로그를 어찌할지 물어보는 에디터로 바뀌는데 그때는 :wq로 저장해줍니다.

  • 꿀팁
    합칠게 많다? 그러면 일일이 s로 바꿔주시지않고 명령모드에서
    (1) 2~10행의 모든 pick을 s로 변경 - :2,10s/pick/s/g
    이렇게 해주시면 2~10행에 모든 문자열에서 pick을 찾아서 s로 변경해줍니다.

  • 참고
    vi 편집기 사용법
    https://jhnyang.tistory.com/54

vi 문자열 치환
https://harryp.tistory.com/736

커밋 로그가 너무 많아져서 보기싫잖아요. 가장 마지막 커밋으로 묶을 수 있어요.
https://meetup.toast.com/posts/39

git 사용시 에러

git 에러는 에러메시지에 나온대로만 하면 해결이 됩니다. 안되면 에러메시지를 구글링해보시면 stackOverFlow에 무조건 나옵니다.

git commit이 실패했네요.

error: Committing is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm <file>' hint: as appropriate to mark resolution and make a commit. fatal: Exiting because of an unresolved conflict.

unmerged files이 있대요.

이전에 git pull <원격저장소> <원격브랜치> 를 했는데요.


그리고 코드 충돌 student.json을 들어가 보시면요.

다음과 같이 나와요.

<< HEAD pull 받은 코드 === 기존 코드 >>

난 부분을 꺽쇄, === 표시 다 없애고,
정해야되요.
incoming 코드를 살릴건지, 기존 코드를 살릴건지, 둘다 살릴건지요.

전 incoming 코드를 살렸습니다.

그리고 나서 충돌난 코드를

git add student.json git commit -m '커밋메시지'

위와 해주면 코드 병합시 충돌 해결됩니다.

원격 저장소에 push 할때 에러 (충돌이 난 상황)

git push origin <branch name> 할때 에러가 발생했어요.

원인은 remote branch에 있는 git history와 git local history가 달라서 인데요.
로컬소스를 최근 코드로 바꾼후에 git push origin <branch name> --force 로 해주시면
로컬소스가 최근 코드이고 이걸로 덮어씌우자 하면 로컬 history로 덮어씌우게 됩니다.

원격저장소(github)에 올린 커밋을 수정하고 싶어요.

로컬 저장소 (디렉토리에서)에서
git reset를 통해 제거하고 싶은 커밋 하나 이전 커밋으로 돌아갑니다.

커밋을 수정후 push --force해줍니다. (원격저장소와 git history가 달라서 push로는 안되요 덮어써야합니다.)

원래는 1469dc4 ~ 00e0317 사이에 여럿 커밋이 존재했었는데요.
다 없어지고 다음과 같이 남게 되었습니다.

커밋 취소

git reset --soft HEAD^

레퍼런스
https://gmlwjd9405.github.io/2018/05/25/git-add-cancle.html

.env파일이 .gitignore에 있는데도 tracking이 됩니다.

.env파일이 git status 명령어로 잡혀요.
이럴땐

git rm .env --cached git commit -m 'git rm .env --cached

https://stackoverflow.com/questions/38983153/git-ignore-env-files-not-working

git ssh 및 github 사용자 인증하기

https://jootc.com/p/201905122827

git ssh로 로컬저장소마다 계정을 바인딩해서 사용해요~

출처: https://mygumi.tistory.com/96 [마이구미의 HelloWorld]

토이프로젝트랑 업무랑 동시에할때 회사계정으로 토이프로젝트에 push 하는 경우가 생겼음.. 그래서 push가 되지 않은 상황이 발생했고, 다음 레퍼런스를 통해 해결했음.

결론은 각 리파지토리마다 계정을 바인딩 하는 방식임.

자세한 방법은 제일 친절한 레퍼런스를 찾아둠. 마이구미님이 친절하게 설명해주심.

생소한 용어
ssh key를 생성했고,
id_rsa_me는 나의 private key이고, id_rsa_me.pub은 github 계정에 등록하는 용도이다.
https 의 private key, public key로 대응되는 것 같음.

요약하면
1. ssh key 생성
$ ssh-keygen -t rsa -C 'me@example.com'
이메일은 github 계정을 만들때 등록한 email을 사용하면 됌. ssh key는 github 계정마다 하나씩 만들 수 있음.

Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):id_rsa_me

cd ~/.ssh 해보면
id_rsa_me, id_rsa_me.pub 이 만들어진 것을 확인 할 수 있음.

ssh key를 추가하고 저장할 것

$ ssh-add ~/.ssh/id_rsa_me // 추가 $ ssh-add -l // 저장

  1. 이제는 Github에서 각각의 ssh key로 접근할 수 있게 해줘야한다.
    이 작업을 위한 config 파일을 직접 만들어줘야한다.

$ touch ~/.ssh/config

이제 만들어진 config 파일에 다음 내용을 추가합니다.

# me account Host github.com-me HostName github.com User git IdentityFile ~/.ssh/id_rsa_me # work account Host github.com-work HostName github.com User git IdentityFile ~/.ssh/id_rsa_work

중요한 건 Host, IdentityFile이다.

말그대로 Host는 접속 주소라고 보면 되고, IdentityFile은 ssh key의 경로라고 보면 된다.

마지막으로 git 저장소가 셋팅된 /.git 경로를 가보자.

리파지토리 디렉토리로 이동합니다.
vi ~/.gitconfig

remote 주소를 위에서 ~/.ssh/config 파일의 host 처럼 변경해줘야한다.
.ssh 경로에 config 파일을 만들어준 것처럼 .git 경로에도 비슷한 작업을 해줘야한다.
하지만 .git 경로에는 config 파일이 존재한다.
열어보면 아래와 같은 형식을 볼 수 있다.

$ git remote -v origin git@github.com:{GithubID}/{RepositoryName}.git git remote -v origin <~/.ssh/config에 기록한 HOST>:{GithubID}/{RepositoryName}.git

url부분만 수정해주면 지정해둔 리파지토리는 ~/.ssh/config에 등록한 ssh key를 이용하기 때문에
여러 계정을 써도 문제가 생기지 않아서 좋음.

다른 사람의 private 리파지토리 clone하기

출처: https://ssabi.tistory.com/48 [싸비]]

준비사항: github 계정에 ssh를 등록한 상태, private 리파지토리에 대한 권한을 받은 상태

Use SSH 클릭한 후

밑에 input 창에 있는 git clone 주소를 보면
git@github.com-me:사용자ID/리파지토리이름.git

git@github.com-me <- 이렇게 한 이유는 ssh 등록할때 host를 github.com-me 으로 등록했기 때문이고,

$vi ~/s Host github.com-me <- HostName github.com User git IdentityFile ~/.ssh/id_rsa_me

이게 뭔말이냐 하신다면 여기서 잘 설명된 블로그 보시면 됩니다.
출처: https://mygumi.tistory.com/96 [마이구미의 HelloWorld]

첫번째 커밋을 취소하고싶을때?

git update-ref -d HEAD

https://stackoverflow.com/questions/6632191/how-to-revert-initial-git-commit

github에 pull request 요청해서 create a merge commit를 했는데 수정해야할때?

예를 들어, 지금 branch1이란 브랜치에 create a merge commit 방식으로 merge를 했다면

git pull origin branch1 git log --oneline -> 문제의 merge 커밋 해쉬를 찾아요. git revert -m 1 <commit-hash> git push -u origin branch1

레퍼런스:
https://stackoverflow.com/questions/7099833/how-to-revert-a-merge-commit-thats-already-pushed-to-remote-branch

Jenkin 사용시 에러

error: some local refs could not be updated; try running 'git remote prune <repoURI>' to remove any old, conflicting branches

git refs?
레퍼런스 : https://stackoverflow.com/a/23067662/7929206
참고: https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Git-Refs

더 자세하고 잘 정리되어있는 블로그 : https://jeonghwan-kim.github.io/dev/2020/02/10/git-usage.html

git flow

git flow finish 취소
https://stackoverflow.com/questions/13450039/how-to-undo-git-flow-feature-finish

develop에서

git log --oneline

commithash1 - merge전 commithash
commithash2 - feature가 merge가 되기전에

git checkout develop git checkout -b feature/<feature-name> git reset <sha1> --hard git checkout develop git reset <sha2> --hard

 

반응형