https://injeblog.tistory.com/14
https://wayhome25.github.io/git/2017/04/01/git-cat/
git global config를 수정하여 pager를 cat방식으로 세팅하기
git log를 한줄로 요약하여 n개까지 로그만 보기
$ git config --global core.pager cat
$ git log --oneline -n
git config 참고: https://younho9.dev/git-config
git reset HEAD
git reset --soft @^
(이전에 커밋한 staged상태로 돌아가고, hard로하면 이전 커밋내용으로 돌아갑니다.)@는 1.8.4부터 도입된 HEAD의 동의어라고 합니다. 같은걸로는 @^, @~1, @~ 가 동일합니다.
git reset --merge ORIG_HEAD
즉. pull 이나 merge를 하는 경우에 ORIG_HEAD를 남기게 되는데, pull을 잘못 받거나 merge를 잘못하게 되면 이것을 이용합니다.
https://mrgamza.tistory.com/593
git checkout -t origin/<브랜치이름>
삭제할 브랜치 명이 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
변경하고자하는 branch로 checkout함
git checkout -t origin/<old_branch>
새로운 브랜치에 push, old 브랜치 제거
git push origin -u <new_branch>
git push origin -D <old_branch>
https://readystory.tistory.com/175
특정파일은 커밋안하고 싶어요.
git reset <파일이름>
git reset student.json
커밋을 취소하고싶다!
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
특정 커밋만 빼고싶다면?
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로 강제로 밀어넣습니다.
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
http://ohyecloudy.com/pnotes/archives/1994/
정신 없이 코딩하다.. 잘 안되었을때 코드가 복잡해서
git reset --hard <커밋>
했는데 커밋을 잘못되돌아갔다... 소스 다 지워짐..
망했다...
그때는 git reflog해서 돌아갈 HEAD@{n}을 찾아서
git reset --hard HEAD@{n}
해주면 됩니다.
https://88240.tistory.com/284
이 명령문은 잘못 리베이스한 로컬 컴퓨터에서 실행해야한다. 그래야 리베이스 로그를 볼 수 있다.
그리고 이 명령문은 그냥 로그를 보는 거여서, 막 쳐봐도 된다. 무서워할 필요 없다.
출처: https://americanopeople.tistory.com/206 [복세편살]
https://americanopeople.tistory.com/206
git branch -m '기존브랜치' '새로운브랜치'
https://thdev.tech/git/2016/12/19/Git-Branch-Name-Change/
원격 저장소의 branch 리스트를 확인하는 방법이 있다. $ git branch -r 옵션을 주면 원격 저장소의 branch 리스트를 볼 수 있고, $ git branch -a옵션을 주면 로컬, 원격 모든 저장소의 branch 리스트를 볼 수 있다.
출처: https://mosei.tistory.com/entry/원격-브랜치-가져오기 [씹어먹는 블로그]
바로 이전 커밋 메시지 수정
git commit --amend -m '메시지'
여러 옵션 중 -p, --patch 는 굉장히 유용한 옵션이다. -p 는 각 커밋의 diff 결과를 보여준다. 다른 유용한 옵션으로 -2
가 있는데 최근 두 개의 결과만 보여주는 옵션이다
https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%BB%A4%EB%B0%8B-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0
git log --oneline
git log 보면 해시값하고 커밋로그 들이 장황하게 나오는데
--oneline 옵션을 사용하면 한줄로 나오고요.
--abbrev-commit 옵션을 사용하면 git reset이나 checkout, cherry-pick 할때 쓸 수 있는 8자리로 나오기 때문에 사용하기 편합니다. 결국 hash의 앞 8자리만 사용하니까요.
저장소에서 지워진 브랜치를 로컬에 반영
리모트 저장소에서 지워진 branch를 로컬에 유지할 필요가 없다. 쌓여서 문제지. 이제 git fetch, git pull 명령을 입력할 때, 옵션을 안 붙여도 된다.
http://www.ohyecloudy.com/ddiary/2017/06/20/til-git-prune-with-fetch-or-pull/
git stash 시뮬레이션
a브랜치에서 작업하다가 b브랜치 이동해서 잠깐 작업해야할때
a브랜치에서 git stash
하고 b브랜치로 checkout한후 작업해서 커밋하고 푸시까지 한 후에
a브랜치로 다시 돌아와서 git stash pop
최근에 stash 한것 빼내기 git stash pop
리스트 조회 git stash list
싹다 날리기 git stash clear
원하는 stash 골라서 적용: git stash apply stash@{2}
원하는 stash 골라서 제거: git stash drop stash@{2}
레퍼런스: https://wayhome25.github.io/git/2017/05/16/git-07-stashing-cleaning/
git stash pop을 했는데 원치 않은 파일들이 merge되려다 충돌됐어요.
git reset HEAD . : reset all the poped files
glog
로
과거 커밋 리스트를 볼 수 있다.
특정 커밋에서 소스를 보고싶으면 git checkout <커밋>
다시 최신 상태로 돌아오고 싶으면 git checkout power-plant
git checkout -t origin/<가져올 branch 이름>
https://cjh5414.github.io/get-git-remote-branch/
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
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
git remote rename source target
https://support.beanstalkapp.com/article/1000-how-do-i-rename-an-existing-git-remote
git push <repositoryAlias> <local branch name>:<remote branch name>
예를 들어, 로컬에서 branch-a인 브랜치를 리모트에는 branch-b로 올리고싶을때
git push origin branch-a:branch-b
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 에러는 에러메시지에 나온대로만 하면 해결이 됩니다. 안되면 에러메시지를 구글링해보시면 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 '커밋메시지'
위와 해주면 코드 병합시 충돌 해결됩니다.
git push origin <branch name>
할때 에러가 발생했어요.
원인은 remote branch에 있는 git history와 git local history가 달라서 인데요.
로컬소스를 최근 코드로 바꾼후에 git push origin <branch name> --force
로 해주시면
로컬소스가 최근 코드이고 이걸로 덮어씌우자 하면 로컬 history로 덮어씌우게 됩니다.
로컬 저장소 (디렉토리에서)에서
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파일이 git status 명령어로 잡혀요.
이럴땐
git rm .env --cached
git commit -m 'git rm .env --cached
https://stackoverflow.com/questions/38983153/git-ignore-env-files-not-working
https://jootc.com/p/201905122827
SSH Secure Shell Protocol, 네트워크 프로토콜중 하나이고,
Public Network를 통해 서로 안전하게 통신할때 사용하는 프로토콜
ssh는 통신할때 공개키 비밀키를 가지고 통신함.
그래서 보통 공개키는 ssh통신하려는 대상에 전달해야함. ( 물론 네트워크상에서 해커한테 털릴수 있음 )
server에서 응답받는 데이터를 ssh private키로 복호화할텐데 해커는 private key가 없으니 데이터를 볼수 없게 되는 구조
https://storycompiler.tistory.com/112
대부분 사용자는 접속하는 상황이 많이 발생하기 때문에 ssh
client로 ssh server에 통신하는 구조.
ssh server는 ssh server가 설치된 머신일 것임.
linux로 만약에 사용한다치면 apt-get으로 원격머신에 ssh server를 설치하고 client에서도 ssh client를 설치해야 할 것임.
보통 접근자니까 client에서
ssh-keygen으로 ssh키를 생성하고,
cd ~/.ssh
ssh-keygen -t rsa -f <sshkey파일명> -c 'keyfile의 코멘트'
-t : 키 타입 지정 (rsa, dsa)
-C : comment 를 남길경우 사용
복사해줍니다.
cat ./<sshkey파일명>.pub | pbcopy
그래서 서버 머신의 ~/.ssh/authorized_keys 파일에 키값을 붙여넣어주면 됌
cat >> ~/.ssh/authorized_keys
이제 ssh로 원격 머신에 접근하기
ssh -i [비밀키명] [username]@[serverIP] -p [port number]
generate ssh-keygen :
https://www.ssh.com/ssh/keygen/
ssh 란? :
https://baked-corn.tistory.com/52
접근하려는 host를 known_host에 등록하면 따로 사용자에게 확인하지 않음.
known_hosts:
https://junho85.pe.kr/667
레퍼런스: https://opentutorials.org/module/432/3742
https://gist.github.com/jexchan/2351996
예전에는 리파지토리마다 계정을 바인딩 하는 방식으로 이해했다면 사실 그런거 아니고 그냥 단순히
ssh protocol을 이용해서 인증하는 것임. github document에 나와있음
그래서 여기 나온대로 https://mygumi.tistory.com/96
ssh-keygen으로 ssh키를 생성하는 것이고,
ssh-add로 ssh 인증 agent 에 추가하는 것이고,
그 공개키를 github 계정 세팅에 등록하는 것임.
그리고 ssh 프로토콜로 git과 github 통신함.
왜 ssh-agent에 ssh 키를 추가해서 사용하나? : 한번만 입력해두면 비밀번호 입력안해도됌. ssh-agent없이도 ssh 키로 원격서버에 접속할 수 있음.
telnet, ssh 그림
출처 : https://slidesplayer.org/slide/11214627/
ssh나 telnet 이 있기 때문에 원격 머신의 터미널을 통해 원격 머신을 shell로 제어할 수 있게 됌.
telnet: 텔넷(TELNET)은 인터넷이나 로컬 영역 네트워크 연결에 쓰이는 네트워크 프로토콜이다.
https://ko.wikipedia.org/wiki/%ED%85%94%EB%84%B7
OSI 7 layer의 Application 위치
telnet 접속 도구로 Putty, XShell를 많이 사용했었음.
telnet 접속 라인으로는 Modem, ISDN, ADSL, VDSL이 있다고함.
telnet은 wireshark라는 패킷 분석 프로그램을 사용하면 평문의 데이터를 다 볼 수 있음..
ssh : 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다.
https://ko.wikipedia.org/wiki/%EC%8B%9C%ED%81%90%EC%96%B4_%EC%85%B8
ssh 4가지 기능
인증
ssh 클라이언트는 처음 접속한 서버의 키를 저장함으로써 서버가 번경되었을 경우에도 판별가능
암호화
ssh는 네트워크를 통해 전달되는 데이터를 암호화함
무결성
네트워크를 통해 받은 데이터가 변경되지 않았음을 보장
압축
ssh 연결을 통해 보낸 데이터를 압축할 수 있음.
레퍼런스: SSH 동작원리 및 EC2 SSH 접속
어떻게? 비대칭키 : 암호화, 복호화 키가 서로 다른 경우
개인키로 암호화하고 공개키로 복호화함. 그러므로 당연히 개인키는 내가 갖고 있어야 하고, 공개키는 네트워크 타겟에게 전달해야함. 그래야지 복호화함. 단순하게 여기까지만..
https://www.google.com/search?q=%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4+%EB%8F%99%EC%9E%91+%EB%B0%A9%EC%8B%9D&sxsrf=ALeKk00jJP8575T-bz2GREtsDVmLI156GA:1615796679171&source=lnms&tbm=isch&biw=1019&bih=1251#imgrc=NMZJXpbUN1HdHM
old post
출처: 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로 대응되는 것 같음.
요약하면
홈디렉토리에서 .ssh 디렉토리 생성한 후 .ssh 디렉토리에서
1. ssh key 생성
$ ssh-keygen -t rsa -C 'me@example.com'
-t : keytype
-c : comment of ssh key
ssh-keygen 옵션: https://www.ssh.com/academy/ssh/keygen#what-is-ssh-keygen?
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 참고:
https://dgkim5360.tistory.com/entry/gnu-linux-crypto-04-agents
https://thebook.io/006718/part02/ch06/04/01/
$ 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: 접속할 정보의 이름, 입력한 정보로 ssh 접속시 아래 접속 정보로 ssh 접속이 실행됩니다.
HostName: 접속할 서버의 IP 주소
User: 접속할 서버의 user 정보
IdentityFile: 인증 키 파일의 필요한 경우, 로컬환경의 키파일 경로를 설정합니다.
Port: ssh 접속 포트
참고: https://ibks-platform.tistory.com/113
ssh config 매뉴얼 : https://www.ssh.com/academy/ssh/config
cd ~/.ssh/
cat ./id_rsa_me.pub | pbcopy
github 계정 > settings > SSH and GPG keys에 new 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를 이용하기 때문에
여러 계정을 써도 문제가 생기지 않아서 좋음.
ssh config는 ssh시 파라미터를 미리 정의해두고 alias처럼 사용하는 것
ssh-add : ssh key를 관리하는 agent
knownhosts :
신회할수 있는 서버인지, 기록하는 것, 공개키와 같이 기록함.
등록되지 않는 서버에 접속하려면 경고가 뜸.
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_known_hosts%EC%97%90%EC%84%9C%ED%98%B8%EC%8A%A4%ED%8A%B8%ED%82%A4_%EC%82%AD%EC%A0%9C
ssh 레퍼런스:
ssh 보안키 생성 - http://taewan.kim/post/ssh_key/
ssh 명령 기본 사용법 -
http://taewan.kim/post/ssh_config/
출처: 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]
config파일 레퍼런스: https://edykim.com/ko/post/simplifying-ssh-with-ssh-config/
삭제한 commit의 해시태그를 찾는다.
git checkout -b '복구할브랜치명' 해시태그
레퍼런스: https://shanepark.tistory.com/317
git update-ref -d HEAD
https://stackoverflow.com/questions/6632191/how-to-revert-initial-git-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
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 init을 이미 한 상태인데,
git flow feature start new_feature
시
다음과 같은 에러가 발생했을 때
Please run 'git flow init' first." error message
https://github.com/petervanderdoes/gitflow-avh/issues/372#issuecomment-784018798
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
https://evan-moon.github.io/2019/08/30/commit-history-merge-strategy/
https://coding-groot.tistory.com/97
https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-Rebase-%ED%95%98%EA%B8%B0
한글: https://developer-alle.tistory.com/315
stackoverflow: https://stackoverflow.com/a/9257901/7929206