来源: Git教程 - 廖雪峰的官方网站
安装Git 1 2 /* Ubuntu上安装 */ $ sudo apt-get install git
创建版本库/仓库 版本库/仓库相当于一个目录, 目录中所有文件修改、删除都可被Git追踪和管理 工作区working directory ⊃ 版本库repository ⊃ 暂存区stage + 分支master(⊃HEAD)1 2 3 4 $ mkdir git-repository //创建版本库 $ cd git-repository //转到版本库 $ git init //初始化版本库 /* 初始化后, 目录中生成了一个.git目录, 它用来跟踪管理此版本库 */
版本库文件操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 $ vim XXX.txt //创建并编辑文件 $ git add XXX.txt //添加文件到仓库 $ git commit -m "add XXX" //提交添加到仓库(加备注说明) $ git status //查看仓库当前状态 $ touch XXX.txt $ vim XXX.txt $ git status /* `Changes not staged for commit` = 工作区文件有修改待添加 */ $ git add XXX.txt $ git status /* `Changes to be committed:` = 缓冲区文件有添加待提交 */ $ git commit -m "add XXX" $ git status /* `nothing to commit, working tree clean` = 仓库目录干净 */ $ rm XXX.txt $ git status /* `Changes not staged for commit` = 工作区文件有修改待添加 */ $ git rm或add XXX.txt $ git commit -m "remove XXX.txt" $ vim XXX.txt $ git checkout -- XXX.txt //丢弃工作区的修改, 回到最近一次commit或add时的状态 $ vim XXX.txt $ git add XXX.txt $ git reset HEAD XXX.txt //撤销(unstage)暂存区的修改, 重新放回工作区 $ git diff XXX.txt //查看文件的修改 $ git diff HEAD -- XXX.txt //查看工作区和版本库里面最新版本的区别 $ git log //显示从最近到最远的提交日志 $ git log --pretty=oneline //显示从最近到最远的简要提交日志 $ git reset --hard HEAD^ //回退到上一个版本 $ git reset --hard HEAD~n //往上回退n个版本 $ git reset --hard <commit> //指定回到某个版本(根据版本号) $ git reflog //查看记录的每一次命令
远程仓库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ ssh-keygen -t rsa -C "youremail@example.com" //-t(加密方式); -C(备注信息) $ cat /Users/$USER/.ssh/id_rsa.pub /* Github -> Account settings -> Add SSH Key -> Ctrl+V */ $ cd git-repository $ git remote add origin git@server-name:path/repo-name.git $ git push -u origin master //-u(关联本地与远程的分支) $ vim XXX.txt; $ git add XXX.txt $ git commit -m "add XXX" $ git push origin master $ mkdir git-newrepository $ cd git-newrepository $ git clone git@server-name:path/repo-name.git
分支管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 step1: $ git branch dev //创建dev分支 step2: $ git checkout dev //转到dev分支 equal: $ git checkout -b dev //创建并切换到新分支 equal: $ git switch -c dev //创建并切换到新分支(新版本git提供switch切换命令) $ git branch //查看当前分支 $ vim XXX.txt $ git checkout或switch master //转到已有master分支(新版本git提供switch切换命令) $ cat XXX.txt $ git merge (--no-ff -m "...") dev //(非快速)合并指定分支到当前分支 $ cat XXX.txt $ git branch -d dev //删除dev分支(快速模式在删除分支后分支信息会丢失) $ git switch -c dev $ vim XXX.txt $ git add XXX.txt $ git commit -m "in n line" //修改XXX文件dev分支第n行 $ git switch master $ vim XXX.txt $ git add XXX.txt $ git commit -m "in n line" //修改XXX文件master分支第n行 $ git merge dev //合并dev分支到master分支: 无法快速合并 $ cat XXX.txt //可直接查看冲突内容 $ vim XXX.txt //修改好冲突内容 $ git add XXX.txt $ git log --graph --pretty=oneline --abbrev-commit //查看分支合并情况(合并图) $ git branch -d dev //删除dev分支 $ git commit -m "conflict fixed" //合并完成 $ git branch dev $ vim XXX.txt $ git status $ git stash //把当前工作现场"储藏"起来 $ git checkout master $ git checkout -b issue-101 $ vim readme.txt $ git add readme.txt $ git commit -m "fix bug 101" $ git switch master $ git merge --no-ff -m "merge bug fix 101" $ git switch dev $ git status $ git stash list //查看"储藏"的工作现场 $ git stash pop /* = $ git stash apply + $ git stash drop; $ git stash apply stash@{0} */ $ git stash list $ git branch $ git cherry-pick <commit> $ git switch -c feature //添加新功能分支 $ git add valcan.py $ git status $ git commit -m "add feature vulcan" $ git switch dev $ git branch -d feature $ git branch -D feature $ cd /original-git $ git remote (-v) $ git push origin master $ git push origin dev $ cd /another-git //多用户分支 $ git clone git@server-name:path/repo-name.git $ git branch $ git checkout -b dev origin/dev $ git add env.txt $ git commit -m "add env" $ git push origin dev $ cd /original-git $ git add env.txt $ git commit -m "add new env" $ git push origin dev $ git pull $ git branch --set-upstream-to=origin/dev dev $ git pull $ git commit -m "fix env conflict" $ git rebase //把本地未push的分叉提交历史整理成直线
标签管理 tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起1 2 3 4 5 6 7 8 9 10 11 $ git branch $ git checkout master $ git tag <tag> //添加标签 $ git tag -a <tag> -m "description" <commit> $ git tag //查看标签 $ git show <tag> //查看某标签信息 $ git tag -d <tag> //删除标签 $ git push origin <tag> //推送某标签到远程 $ git push origin --tags //推送所有标签到远程 $ git tag -d <tag> //删除远程标签step1 $ git push origin :refs/tags/<tag> //删除远程标签step2
自定义git 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 $ git config --global color.ui true //让Git显示颜色 $ git touch .gitignore $ vim .gitignore $ git add .gitignore $ git commit -m "add .gitignore" $ git status $ git add XXX.xxx $ git add -f XXX.xxx $ git check-ignore -v XXX.xxx $ git config (--global) alias.xxx XXX或"XXX XXX" /* --global参数是全局参数, 加则对电脑所有Git仓库都有用, 不加则只针对当前的仓库起作用 */ $ ssh root@xxxx.xxxx.xxxx.xxxx //搭建Git服务器 $ sudo apt-get install git $ sudo adduser git $ vim /home/git/.ssh/authorized_keys $ cd /srv $ sudo git init --bare sample.git $ sudo chown -R git:git sample.git $ vim /etc/passwd /* git:x:1001:1001:,,,:/home/git:/bin/bash -> ...:/home/git:/usr/bin/git-shell */ $ exit $ git clone git@server:/srv/sample.git