#Git 튜토리얼
###서문에
약간의 역사, 싫어하는 분은 여기를 클릭하여 건너뛰기
2002 년이 되자 Linux 시스템은 10 년 동안 발전했고, 코드베이스의 거대함으로 인해 Linus 는 수동으로 관리하기 어려워졌습니다. 커뮤니티의 개발자들도 이 방식에 강한 불만을 표했습니다. 그래서 Linus 는 상용 버전 관리 시스템인 BitKeeper 를 선택했습니다. BitKeeper 의 모회사 BitMover 사는 인도주의 정신으로 Linux 커뮤니티에 이 버전 관리 시스템을 무료로 사용할 수 있는 권한을 부여했습니다.
2005 년에 이 안정된 상황은 깨졌습니다. Linux 커뮤니티에는 고수들이 모여 있었고, 어쩔 수 없이 양산박 호한들의 강호 기질을 일부 띠게 되었습니다. Samba 를 개발한 Andrew 가 BitKeeper 의 프로토콜을 크랙하려고 시도했고 (실제로 그뿐만 아니라 다른 사람들도 있었습니다), BitMover 사에 발견되었습니다 (감시 작업을 잘했습니다!). 그래서 BitMover 사는 화가 나서 Linux 커뮤니티의 무료 사용권을 회수하겠다고 선언했습니다.
Linus 가 BitMover 사에 사과하고 앞으로 형제들을 엄격히 관리하겠다고 약속할 수 있을까요? 음, 그것은 불가능합니다. 실제 상황은 다음과 같습니다:
Linus 는 2 주 동안 C 언어로 분산형 버전 관리 시스템을 직접 작성했습니다. 이것이 Git 입니다! 한 달 이내에 Linux 시스템의 소스 코드가 Git 으로 관리되기 시작했습니다! 소란 피우는 사람은 어떻게 정의될까요? 여러분도 느껴보시기 바랍니다.
Git 은 빠르게 가장 인기 있는 분산형 버전 관리 시스템이 되었습니다. 특히 2008 년 GitHub 웹사이트가上线되어 오픈소스 프로젝트에 Git 저장소를 무료로 제공했습니다. 수많은 오픈소스 프로젝트가 GitHub 로 이주하기 시작했습니다. jQuery, PHP, Ruby 등을 포함합니다.
###1.vim 에서 중국어 글자 깨짐
명령줄에서 직접 vim 을 사용하여 편집하면 한자 글자 깨짐이 발생합니다. 또한 QQ 병음 입력법을 사용하여 vim 내에서 일부 한자를 입력할 수 없습니다. 예를 들어, 中 wen 의 wen,還有 wu 法의 wu 가 1 이 됩니다 utf8 글자 깨짐 문제는 아직 해결되지 않았습니다 (찾은 해결책은 모두 돌파하지 못했습니다). vim 으로 직접 편집하지 않는 것을 권장합니다
###2.MINGW32 는 기본적으로 복사/붙여넣기를 지원하지 않습니다. 수동 설정이 필요합니다
-
제목 표시줄을 마우스 오른쪽 버튼으로 클릭하고 [속성] 선택
-
[옵션] 선택
-
[빠른 편집 모드 Q] 체크
-
[확인] - [확인]
설정이 즉시 적용되며 복사/붙여넣기를 지원합니다:
-
복사: 왼쪽 버튼으로 드래그하여 선택한 후 마우스 오른쪽 버튼 클릭하면 복사 완료
-
붙여넣기: 창 내에서 마우스 오른쪽 버튼 클릭
질문이 있으시면 ChinaUnix 블로그: windows 에서 mingw 의 복사/붙여넣기 를 확인하세요
##일.git 설치
Windows/Mac/Linux 에서 git 설치 방법은 廖雪峰的官方网站: Git 설치 를 확인하세요
P.S. 廖雪峰 선배의 git 튜토리얼은 매우 훌륭하지만, 당신은 분명히 처음부터 끝까지 볼 인내심이 없을 것입니다. 하지만 괜찮습니다. 내가 보았으니까요. 가능한 한 불필요한 말 없이 요약하겠습니다
##이.로컬 작업
###1.저장소 생성
- 마음에 드는 폴더를 찾아
cd로 이동한 후 그 안에서 저장소 (Repository) 를 생성합니다
P.S. git 명령줄 도구는 실제로 간단한 Linux 가상 머신이며 Shell 명령어를 지원합니다. Linux 명령어를 몇 개 기억하면 더 쉽게 사용할 수 있습니다. 일반적인 Shell 명령어는 博客园:일반적인 파일 및 디렉토리 작업 명령어 (전재) 를 확인하세요
- Git 저장소를 초기화합니다.
git init명령어를 사용합니다
현재 디렉토리를 git 저장소로 초기화할 수 있습니다. 실제로는 디렉토리 아래에 git 관리 정보를 자동 생성하는 것입니다
- 파일 생성
해당 디렉토리 아래에 파일을 생성합니다. 명령줄의 touch 또는 탐색기에서 마우스 오른쪽 버튼으로 생성할 수 있습니다
-
파일을 Git 저장소에 추가합니다. 두 단계로 나뉩니다:
-
git add <file>명령어를 사용하여 파일을 임시 저장 영역에 추가합니다. 주의: 여러 번 사용하여 여러 파일을 추가할 수 있습니다; -
git commit명령어를 사용하여 임시 저장 영역의 변경사항을 커밋합니다. 완료.
-
P.S. 폴더 아래에 생성한 파일 및 파일 내용의 추가/삭제/변경은 동기화 클라우드 드라이브처럼 자동 동기화되지 않습니다. add-commit 해야만 새 버전을 생성합니다
###2.일상 업무
- 상태 확인
작업 공간의 상태를 항상 파악하려면 git status 명령어를 사용합니다.
git status 가 파일이 수정되었다고 알려주면 git diff 를 사용하여 변경 내용을 확인할 수 있습니다.
- 버전 후퇴 및前进
HEAD 가 가리키는 버전이 현재 버전입니다. 따라서 Git 은 버전 기록 사이를 이동할 수 있도록 허용합니다. git reset --hard commit_id 명령어를 사용합니다.
이동하기 전에 git log 를 사용하여 커밋 기록을 확인하고 어느 버전으로 후퇴할지 결정합니다.
미래로 돌아가려면 git reflog 를 사용하여 명령어 기록을 확인하고 어느 버전으로 돌아갈지 결정합니다.
-
변경사항 취소
-
시나리오 1: 작업 공간의某个 파일 내용을 어지럽게 변경했고 작업 공간의 변경사항을 직접 폐기하려는 경우
git checkout -- file명령어를 사용합니다. -
시나리오 2: 작업 공간의某个 파일 내용을 어지럽게 변경했을 뿐만 아니라 임시 저장 영역에 추가한 경우 변경사항을 폐기하려면 두 단계가 필요합니다. 첫 번째 단계에서
git reset HEAD file명령어를 사용하면 시나리오 1 로 돌아갑니다. 두 번째 단계는 시나리오 1 대로 작업합니다. -
시나리오 3: 부적절한 변경사항을 저장소에 커밋한 경우 이 커밋을 취소하려면 버전 후퇴 섹션을 참조하세요. 단, 원격 저장소에 푸시하지 않았다는 전제가 필요합니다.
-
-
파일 삭제
git rm 명령어는 파일을 삭제하는 데 사용됩니다. 파일이 이미 저장소에 커밋된 경우 실수로 삭제하는 것을 걱정할 필요는 없습니다. 하지만 주의해야 합니다. 파일을 최신 버전으로만 복원할 수 있으며, 마지막 커밋 이후에 수정한 내용은 잃게 됩니다.
- 브랜치 작업
실제 개발에서는 몇 가지 기본 원칙에 따라 브랜치 관리를 수행해야 합니다:
먼저 master 브랜치는 매우 안정적이어야 합니다. 즉, 새 버전 릴리스에만 사용되며 평소에는 거기서 작업하면 안 됩니다;
그럼 어디서 작업할까요? 작업은 모두 dev 브랜치에서 합니다. 즉, dev 브랜치는 안정적이지 않습니다. 어느 시점에, 예를 들어 1.0 버전 릴리스 시 dev 브랜치를 master 에 병합한 후 master 브랜치에서 1.0 버전을 릴리스합니다;
당신과 당신의 동료들은 모두 dev 브랜치에서 작업하며, 각자 자신의 브랜치가 있고 때때로 dev 브랜치에 병합하면 됩니다.
브랜치를 병합할 때 --no-ff 파라미터를 추가하면 일반 모드로 병합할 수 있습니다. 병합 후 기록에 브랜치가 있어 병합을 했었음을 알 수 있습니다. fast forward 병합은 병합을 했었음을 알 수 없습니다. 예: git merge --no-ff -m "merge with no-ff" dev
구체적인 명령어:
- 브랜치 확인: `git branch`
- 브랜치 생성: `git branch <name>`
- 브랜치 전환: `git checkout <name>`
- 브랜치 생성 + 전환: `git checkout -b <name>`
- 某 브랜치를 현재 브랜치에 병합: `git merge <name>`
- 브랜치 삭제: `git branch -d <name>`
Git 이 자동으로 브랜치를 병합할 수 없을 때는 충돌을 해결해야 합니다. 충돌을 해결한 후 커밋하면 병합이 완료됩니다.
Git 은 <<<<<<<, =======, >>>>>>> 로 다른 브랜치의 내용을 표시합니다. 수동으로 변경하여 충돌을 해결한 후 add-commit 하면 됩니다
git log --graph 명령어를 사용하면 브랜치 병합 그림을 확인할 수 있습니다
- 버그 처리
버그를 수정할 때는 새로운 bug 브랜치를 생성하여 수정한 후 병합하고 마지막으로 삭제합니다;
손에 든 작업이 완료되지 않았을 때는 먼저 작업 현장을 git stash 한 후 버그를 수정하고 수정 후 git stash pop 하여 작업 현장으로 돌아갑니다.
- 새 기능 개발
새로운 feature 를 개발할 때는 새 브랜치를 생성하는 것이 가장 좋습니다;
병합되지 않은 브랜치를 폐기하려면 git branch -D <name> 을 사용하여 강제로 삭제할 수 있습니다.
###3.인간적인 설정 옵션
- 특수 파일 무시
일부 파일을 무시할 때는 .gitignore 를 작성해야 합니다;
.gitignore 파일 자체는 저장소에 배치해야 하며 .gitignore 에 대한 버전 관리도 할 수 있습니다
- 명령어 별칭 설정
일반적으로 받아들여지는 별칭 (매크로와 같은 것으로 손가락을 보호하는 데 사용):
- st 는 status 를 나타냅니다. 명령어 `git config --global alias.st status`
- co 로 checkout 을 나타냅니다. 명령어 `git config --global alias.co checkout`
- ci 는 commit 을 나타냅니다. 명령어 `git config --global alias.ci commit`
- br 은 branch 를 나타냅니다. 명령어 `git config --global alias.br branch`
3. 별칭 삭제
각 저장소의 Git 설정 파일은 .git/config 파일에 있으며 별칭은 [alias] 뒤에 있습니다. 별칭을 삭제하려면 해당 행을 삭제하면 됩니다
전역 Git 설정 파일은 ~/gitconfig 파일에 있으며 직접 편집할 수 있습니다
- 기타 설정 옵션
사용자 정의할 수 있는 부분이 비교적 많습니다. 예를 들어 명령어 출력 결과 색상 구성표 (파일 이름 강조 등)
###4.git 서버 구축
자세한 단계는 廖雪峰的官方网站: Git 서버 구축 를 확인하세요
##삼.원격 작업
원격 작업은 로컬 프로젝트와 GitHub 의 프로젝트를 정기적으로 동기화하는 것을 의미합니다
###0.준비 작업
GitHub 계정 등록, 저장소 생성, 공개 키 설정 등이 필요합니다. 자세한 내용은 廖雪峰的官方网站:원격 저장소 추가 를 확인하세요
###1.원격 저장소 연결
원격 저장소를 연결하려면 git remote add origin git@server-name:path/repo-name.git 명령어를 사용합니다;
연결 후 git push -u origin master 명령어를 사용하여 처음으로 master 브랜치의 모든 내용을 푸시합니다;
이후 로컬에서 커밋할 때마다 필요하면 git push origin master 명령어를 사용하여 최신 변경사항을 푸시할 수 있습니다;
분산형 버전 관리 시스템의 가장 큰 장점 중 하나는 로컬 작업이 원격 저장소의 존재를 전혀 고려할 필요가 없다는 것입니다. 즉, 네트워크 연결 유무와 관계없이 정상적으로 작업할 수 있습니다. SVN 은 네트워크 연결이 없을 때는 작업을 거부합니다! 네트워크가 있을 때 로컬 커밋을 푸시하면 동기화가 완료됩니다. 정말 편리합니다!
###2.원격 저장소 복제
저장소를 복제하려면 먼저 저장소 주소를 알아야 한 후 git clone 명령어를 사용하여 복제합니다.
Git 은 여러 프로토콜을 지원합니다. https 를 포함하지만 ssh 를 통한 네이티브 git 프로토콜이 가장 빠릅니다.
###3.다중 협업
원격 저장소 정보를 확인하려면 git remote -v 를 사용합니다;
로컬에서 새로 생성한 브랜치는 원격으로 푸시하지 않으면 다른 사람에게는 보이지 않습니다;
로컬에서 브랜치를 푸시하려면 git push origin branch-name 을 사용합니다. 푸시에 실패하면 먼저 git pull 을 사용하여 원격의 새 커밋을 가져옵니다;
로컬 브랜치와 원격 브랜치에 대응하는 브랜치를 생성하려면 git checkout -b branch-name origin/branch-name 을 사용합니다. 로컬과 원격 브랜치 이름은 일치시키는 것이 가장 좋습니다;
로컬 브랜치와 원격 브랜치의 연결을 설정하려면 git branch --set-upstream branch-name origin/branch-name 을 사용합니다;
원격에서 브랜치를 가져오려면 git pull 을 사용합니다. 충돌이 있으면 먼저 충돌을 처리해야 합니다.
###4.태그 사용
태그는 저장소의 스냅샷이며 일반적으로 새 버전 릴리스 전에 현재 버전을 표시하는 데 사용됩니다
- 태그 생성
git tag <name> 명령어는 새 태그를 생성하는 데 사용됩니다. 기본값은 HEAD 입니다. commit id 를 지정할 수도 있습니다;
git tag -a <tagname> -m "blablabla..." 는 태그 정보를 지정할 수 있습니다;
git tag -s <tagname> -m "blablabla..." 는 PGP 서명 태그를 사용할 수 있습니다;
git tag 명령어는 모든 태그를 확인할 수 있습니다.
- 태그 작업
git push origin <tagname> 명령어는 로컬 태그를 푸시할 수 있습니다;
git push origin --tags 명령어는 모든 푸시되지 않은 로컬 태그를 푸시할 수 있습니다;
git tag -d <tagname> 명령어는 로컬 태그를 삭제할 수 있습니다;
git push origin :refs/tags/<tagname> 명령어는 원격 태그를 삭제할 수 있습니다.
###5.GitHub 에서 fork
P.S. fork 는 Linux 의 Shell 명령어 fork 에서取自된 것입니다 (현재 프로세스를 복제하여 얻은 자식 프로세스는 부모 프로세스에 영향을 받지 않음). 타인의 프로젝트 저장소를 자신의 GitHub 로 전송하는 데 사용됩니다. 이후 상호 독립적입니다
GitHub 에서任意로 오픈소스 저장소를 Fork 할 수 있습니다;
Fork 후 저장소의 읽기/쓰기 권한을 소유합니다;
공식 저장소에 pull request 를 푸시하여 코드를 기여할 수 있습니다.
###6.일반적인 원격 작업
-
원격 프로젝트 가져오기
git clone git@github.com:ayqy/git-helloworld.git. 현재 디렉토리 아래에 프로젝트 폴더가 생성됩니다 -
온라인 수정
git pull origin master를 통해 로컬로 가져옵니다 -
로컬 수정
git push -u origin master를 통해 업로드하여 동기화합니다 (먼저 add-commit 해야 함에 주의하세요)
##사.일반적인 명령어
-
mkdir:XX(빈 디렉토리 XX 생성. XX 는 디렉토리 이름을 가리킴) -
pwd: 현재 디렉토리 경로 표시. -
cat XX: XX 파일 내용 확인 -
git init: 현재 디렉토리를 관리 가능한 git 저장소로 변환하여 숨김 .git 파일 생성. -
git add XX: xx 파일을 임시 저장 영역에 추가. -
git commit –m "XX": 파일 커밋 –m 뒤는 주석. -
git status: 저장소 상태 확인 -
git diff XX: XX 파일이 어떤 내용을 수정했는지 확인 -
git log: 기록 확인 -
git reset--hard HEAD^ 또는 git reset --hard HEAD~: 이전 버전으로 후퇴P.S. 100 버전 전으로 후퇴하려면 git reset --hard HEAD~100 사용
-
git reflog: 기록의 버전 id 확인 -
git checkout -- XX: XX 파일의 작업 공간 수정사항 모두 취소. -
git rm XX: XX 파일 삭제 -
git remote add origin https://github.com/ayqy/test.git: 원격 저장소 연결 -
git push –u(처음에는 -u 필요, 이후 불필요) origin master: 현재 master 브랜치를 원격 저장소로 푸시 -
git clone https://github.com/ayqy/test.git: 원격 저장소에서 복제 -
git checkout –b dev: dev 브랜치 생성 및 dev 브랜치로 전환 -
git branch: 현재 모든 브랜치 확인 -
git checkout master: master 브랜치로 전환 -
git merge dev: 현재 브랜치에서 dev 브랜치 병합 -
git branch –d dev: dev 브랜치 삭제 -
git branch name: 브랜치 생성 -
git stash: 현재 작업을 숨긴 후 나중에 현장 복구하여 계속 작업 -
git stash list: 숨겨진 모든 파일 목록 확인 -
git stash apply: 숨겨진 파일 복구하지만 내용은 삭제하지 않음 -
git stash drop: 파일 삭제 -
git stash pop: 파일 복구와 동시에 파일도 삭제 -
git remote: 원격 저장소 정보 확인 -
git remote –v: 원격 저장소 상세 정보 확인 -
git push origin master: Git 은 master 브랜치를 원격 저장소에 대응하는 원격 브랜치로 푸시 -
git push origin :branch-name: 콜론 앞 공백을 줄이면 안 됨. 원리는 빈 브랜치를 server 에 푸시하여 해당 브랜치 삭제와 동일 -
git push --force origin master: 버전 후퇴 시 로컬 구버전으로 최신 버전을 덮어쓰고 싶을 때 사용. 새 버전의 log 기록을 삭제하여 흔적 없음
##오.명령어大全
###1.CREATE
-
기존 저장소 복제
git clone ssh://user@domain.com/repo.git -
새 로컬 저장소 생성
git init
###2.LOCAL CHANGES
-
작업 디렉토리의 변경된 파일
git status -
추적된 파일의 변경사항
git diff -
모든 현재 변경사항을 다음 커밋에 추가
git add . -
의 일부 변경사항을 다음 커밋에 추가
git add -p <file> -
추적된 파일의 모든 로컬 변경사항 커밋
git commit -a -
이전에 스테이징된 변경사항 커밋
git commit -
마지막 커밋 변경 게시된 커밋을 수정하지 마십시오!
git commit --amend
###3.COMMIT HISTORY
-
최신부터 시작하는 모든 커밋 표시
git log -
특정 파일의 시간 경과에 따른 변경사항 표시
git log -p <file> -
에서 누가 언제 무엇을 변경했는지
git blame <file>
###4.BRANCHES & TAGS
-
모든 기존 브랜치 목록
git branch -av -
HEAD 브랜치 전환
git checkout <branch> -
현재 HEAD 를 기반으로 새 브랜치 생성
git branch <new-branch> -
원격 브랜치를 기반으로 새 추적 브랜치 생성
git checkout --track <remote/branch> -
로컬 브랜치 삭제
git branch -d <branch> -
현재 커밋에 태그 표시
git tag <tag-name>
###5.UPDATE & PUBLISH
-
현재 구성된 모든 원격 목록
git remote -v -
원격에 대한 정보 표시
git remote show <remote> -
라는 이름의 새 원격 저장소 추가
git remote add <shortname> <url> -
에서 모든 변경사항 다운로드但 HEAD 에 통합하지 않음
git fetch <remote> -
변경사항 다운로드 및 직접 HEAD 에 병합/통합
git pull <remote> <branch> -
원격에서 로컬 변경사항 게시
git push <remote> <branch> -
원격 브랜치 삭제
git branch -dr <remote/branch> -
태그 게시
git push --tags
###6.MERGE & REBASE
-
를 현재 HEAD 에 병합
git merge <branch> -
현재 HEAD 를 로 리베이스 게시된 커밋을 리베이스하지 마십시오!
git rebase <branch> -
리베이스 중단
git rebase --abort -
충돌 해결 후 리베이스 계속
git rebase --continue -
구성된 병합 도구를 사용하여 충돌 해결
git mergetool -
에디터를 사용하여 수동으로 충돌 해결 및 (해결 후) 파일을 해결됨으로 표시
git add <resolved-file>git rm <resolved-file>
###7.UNDO
-
작업 디렉토리의 모든 로컬 변경사항 폐기
git reset --hard HEAD -
특정 파일의 로컬 변경사항 폐기
git checkout HEAD <file> -
커밋 되돌리기 (반대 변경사항이 있는 새 커밋 생성하여)
git revert <commit> -
HEAD 포인터를 이전 커밋으로 리셋
…그 이후 모든 변경사항 폐기:
git reset --hard <commit>…모든 변경사항을 스테이징되지 않은 상태로 유지:
git reset <commit>…커밋되지 않은 로컬 변경사항 유지:
git reset --keep <commit>
###참고 자료
아직 댓글이 없습니다