햐 요즘엔 GUI도 잘 되어 있다지만 나는 여전히 터미널에 한 땀 한 땀 명령어 입력하는 것을 선호한다.
(이것도 몇 년간 하다 보니 익숙해지기도 했다)
기왕 쓰는거 한 번 정리해 보자!라는 생각에 포스팅을 하게 되었다.
기본(add, commit, pull, push, clone, checkout, branch)
Git을 사용하다보면 자주 많이 사용하는 명령어이다.
그 외에는 그때 그때 구글링 해도 문제없다고 생각한다.
하지만 '이 정도 명령어도 구글링을 하면 시간 낭비다'라고 생각되는 명령어를 정리해 보았다!
git init
git remote add {remote name 보통 origin을 쓴다} {url}
git branch -M main
git checkout [-B] {branch name}
git add {파일명 | .}
git commit -m "{commit message}"
git push {remote name} {branch name}
git pull {remoge name} {branch name}
간단한 설명
1. git init: 이 폴더에서 깃을 시작하겠다!라는 의미. git 폴더가 생기고 git 명령어가 사용 가능해진다.
2. git remote add: git에 있는 레포를 로컬에 연결하는 명령어. pull, push 등 명령어로 로컬에서 작성한 코드를 원격 저장소로 올리거나 원격 저장소의 코드를 가져오게 되는데 이 '원격 저장소'를 로컬에서 연결하는 명령어다.
*git remote -v 로 확인 가능
3. git branch: git의 브랜치를 지정하고 수정하고 설정하는 명령어 --help를 통해 더 많은 옵션을 확인할 수 있다.
내가 주로 쓰는 건 -M(기본 브랜치로 설정), -D(브랜치 삭제)
4. git checkout: 브랜치를 변경하는 명령어 -B 속성을 추가하면 브랜치를 새로 만들어서 변경한다.
5. git add: 로컬에서 파일들의 상태를 변경하는 명령어. 보통 add -> commit -> push 순서대로 진행되는데, 간단하게 말하면 add는 commit 하기 전에 무엇을 커밋하겠다! 지정해 주는 것이고 commit은 내가 어떤 내용을 어떤 파일을 원격 저장소에 올리겠다! 지정하는 것, push는 commit 한 내역들을 원격 저장소에 올려주는 것이다.
6. git commit: "git commit"만 실행하면 vi 편집기를 통해 상세한 commit 메시지를 작성할 수 있다. git commit -m을 사용하면 commit message의 title을 작성할 수 있어서 짧고 간단한 메시지를 작성할 때 편리하다.
7. git push, git pull: push는 원격 저장소에 코드를 올리는 것, pull은 원격 저장소에서 로컬로 코드를 가져오는 것이다. remote name과 branch name은 작성하지 않으면 default로 지정된 대로 실행된다 (default가 없으면 에러 발생)
종종 쓰는 명령어 (rebase, status, log, stash, reset)
git push {remote name} {branch name} --rebase
git rebase --continue
git status
git log
git commit --amend -m "{수정할 커밋 메세지}"
git commit --amend --date="{날짜}"
git commit --amend --author="Author Name <email@address.com>"
git stash
git stash list
git stash apply {stash name}
git reset [HEAD^ | HEAD~숫자] [--soft | --hard]
간단한 설명
1. rebase: rebase는 나도 최근에 알게 된 속성인데, 원격 저장소의 로그와 로컬 저장소의 로그가 다를 경우 commit이 꼬이지 않도록 정리해 주는 역할을 한다. conflict가 발생하면 해결 후 git rebase --confinue를 실행하면 된다.
https://git-scm.com/docs/git-rebase
2. git status: 위에 첨부 되어 있듯, git에는 상태가 있다. git status 명령어를 통해 각 파일의 상태를 확인할 수 있다. git add . 을 하는 것보다 상태를 보고 파일 단위로 add, commit 하는 것을 권장한다.
3. git log: commit 번호(이름), 작성자, 날짜, 메세지를 확인할 수 있다. commit을 삭제 또는 수정할 때 유용하게 쓰인다.
* git commit --amend로 가장 상위에 있는(HEAD) 커밋을 수정할 수 있다.
4. git stash: 임시 저장 역할 이라고 볼 수 있다. git stash를 실행하면 변경 중이던 파일들이 임시 저장되고, git stash list를 통해 stash 한 리스트를 확인할 수 있으며 'stash {숫자}'로 표시되어 있는 stash 이름을 통해 applay 할 수 있다. (git stash apply stash{0})
5. git reset: 커밋 내역을 삭제할 수 있다! 또는 add 된(staged) 파일들을 modified로 상태를 변경할 때 사용한다.
- 커밋 삭제: 상단(HEAD)부터 1개만 삭제하고 싶다면 HEAD^, 2개 이상은 HEAD~{숫자}로 작성한다. --soft 속성을 사용하면 커밋 내역만 삭제되지만 --hard 속성은 해당 커밋의 파일 변경 사항까지 싹 날려버린다. (조심!)
- 그냥 git reset만 입력하면 staged 된 파일들이 modified로 상태가 변경된다.
정말 가끔 필요한 GIT
Commit 작성자 한 번에 변경하기
(서론)
올해가 들어 SSAFY라는 교육 과정을 듣게 되면서 공부를 위한 github 계정을 따로 만들게 됐다.
본 계정에는 이미 많은 repo들이 있었고, 이 당시에 나는 뭔가 지저분하다(정리가 안된?)고 느꼈던 것 같다.
그러나 한 2달이 지났을 때쯤... 이 계정을 없애고 본 계정으로 다시 돌아가야겠다는 생각을 하게 됐다.
이유는 부계(공부를 위해 새로 만든 계정)에 잔디가 심어지는 동안 본계의 잔디가 텅텅 비어 갔기 때문...ㅠ
내 몸은 하나밖에 없기 때문에 매일매일 두 계정에 잔디를 심기란 불가능했다.
그 결과..
이렇게 나뉘어서 잔디가 심어졌다...ㅋㅋㅋㅋ
부계정의 잔디를 본 계정으로 옮겨 오고 싶은데...
"commit 기록 작성자 변경하는 법"을 검색해도 결과가 나오긴 한다
git commit ammend를 활용하거나 git rebase -i로 해결할 수도 있다.
실제로 2번의 상황에선 git rebase를 사용하기도 했다.
그러나 로그 하나하나를 변경하기엔 commit이 너무 많았고, 한 번에 촤르륵 작성자를 바꿀 수 있는 방법을 알고 싶었다.
(본론)
찾아봐도 안 나와서 github support에 문의하였더니, 감사하게도 내가 딱 원하는 방법을 알려주셨다!
Sign in for Software Support and Product Help - GitHub 지원
support.github.com
github support에 문의하는 것을 '티켓을 발행한다'라고 표현한다.
위와 같이 티켓을 생성했더니 생각보다 빠르게 (24시간 이내) 답변이 달렸다.
*영어로 문의하면 좀 더 빠르다! (거의 몇 시간 이내)
(support의 답변 기준 2번부터 따라함)
1. 먼저 commit 내역을 변경할 repo를 clone 해준다.
단, --bare이라는 속성을 사용해서 클론 한 뒤, clone 된 폴더 안으로 들어가 준다 (cd 명령어)
git clone --bare https://github.com//.git
cd <reponame>.git
--bare 속성으로 clone 한 폴더 안에 들어가면
이런 폴더들이 있다.
2. sh 파일을 만들고 아래의 스크립트를 복사 붙여 넣기 해준다.
vi script.sh
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
저장하고, 스크립트를 실행하면 된다
* 명령어를 찾을 수 없다거나 권한이 없다고 하면 chmod 777 script.sh로 권한을 설정해 줘야 한다.
* 여러 번 실행했을 경우 기존의 백업을 지우기 위해 --force 옵션을 넣어줄 수 있다.
git filter-branch --env-filter => git filter-branch --force --env-filter
실행하면 터미널에 이런 식으로 블라 블라 뜬다!
3. "Review the new Git history for errors" 하라고 하는데 그냥 안 했다.
4. push 하고,
git push --force --tags origin 'refs/heads/*'
5. clone 했던 폴더를 삭제하면 끝!
cd ..
rm -rf <reponame>.git
결과 -
Commit 작성자 몇 개만 변경하기
(서론)
여느 날처럼 개발을 하면서 commit을 쌓아갔고, 퇴근 직전 push를 했는데..! 권한이 없다면서 push가 되지 않았다.
무슨 일인가 의아해서 다음 날 로그를 찍어보니 자리가 바뀌면서 다른 사람의 git 설정이 남아 있었고,
그 사람의 이름으로 commit이 되어 있는 것을 발견했다,,^^
(본론)
이런 경우에 git rebase -i를 사용해서 commit 내역을 변경할 수 있다.
- git rebase -i {수정할 커밋의 직전 커밋의 해시값}
- git rebase HEAD~{숫자}
이런 식으로 commit 해시값 또는 HEAD 기준 몇 개를 변경할 것인지 개수로 사용 할 수 있다.
명령어를 입력하면 vi 편집창이 뜨고, 하단 사진처럼 선택한 커밋 기록이 "pick {commit number} {commit message}" 형식으로 나열되어 있다.
여기서 변경할 커밋을 pick 부분을 e로 변경한 뒤 :wq(vi 편집기 저장 명령어)를 입력한다.
* 하단 사진에는 커밋 내역이 몇 개 없지만 여러 개도 변경 가능 하다.
e로 바꾼 커밋 내역에 대해 git commit --amend 명령어로 commit을 변경하면 된다.
변경이 끝나면 git rebase --continue을 입력하면 다음 변경 커밋으로 넘어가고,
갑자기 변경하고 싶지 않으면(?) git rebase --skip을 입력하면 변경 없이 넘어간다.
모든 선택한 커밋에 대한 변경이 끝나면
성공했다고 알려준다!
모든 명령어가 처음에는 낯설고 헷갈릴 수 있겠지만 뭐든 쓰다 보면 익숙해지는 것 같다.
그리고 익숙해지고 나면 프로젝트를 할 때 훨씬 빠르고 쉽게 git으로 협업을 할 수 있다
나 역시 우여곡절을 겪으면서 익숙해졌다! (이 포스팅의 부제가 우여곡절인 이유)
그러니까 멋지게 Git 명령어 쓰면서 같이 행복한 개발 해요🌱 (급 마무리)