|
| 1 | +安装Git |
| 2 | + * 在Linux上安装Git: |
| 3 | + * Debian或Ubuntu: sudo apt-get install git |
| 4 | + * 其它Linux通过源码安装git: |
| 5 | + 先从Git官网下载源码,然后解压,依次输入: |
| 6 | + ./config,make,sudo make install |
| 7 | + * 在windows上安装Git: |
| 8 | + * msysgit是Windows版的Git,从http://msysgit.github.io/下载 |
| 9 | + * Tortoisegit是git的客户端 |
| 10 | + * 安装完设置:(--global参数,表示你这台机器上所有的Git仓库都会使用这个配置) |
| 11 | + $ git config --global user.name "Your Name" |
| 12 | + $ git config --global user.email " [email protected]" |
| 13 | + * git --version |
| 14 | + |
| 15 | +创建版本库 |
| 16 | + * 创建文件夹learngit,用来放置版本库 |
| 17 | + * $ git init |
| 18 | + 把这个目录变成Git可以管理的仓库 |
| 19 | + * $ git add readme.txt |
| 20 | + 编写一个readme.txt文件,放到learngit目录下,通过命令将文件添加到仓库 |
| 21 | + * $ git commit -m "wrote a readme file" |
| 22 | + 把文件提交本地到仓库 |
| 23 | + |
| 24 | +时光机穿梭 |
| 25 | + * 查看版本库的状态:(将要被提交的修改包括了什么) |
| 26 | + * 修改readme.txt,使用以下命令: |
| 27 | + * $ git status |
| 28 | + * $ git diff readme.txt |
| 29 | + * $ git add readme.txt |
| 30 | + * $ git commit -m "add distributed" |
| 31 | + * 版本回退 |
| 32 | + * $ git log 查看提交历史,以便确定要回退到哪个版本 |
| 33 | + $ git log --pretty=oneline 可以减少输出信息 |
| 34 | + * $ git reset --hard commit_id 在版本的历史之间穿梭 |
| 35 | + 上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写成HEAD~100 |
| 36 | + * $ git reflog 查看命令历史,以便确定要回到未来的哪个版本 |
| 37 | + * 工作区和暂存区 |
| 38 | + * 工作区(Working Directory):就是你在电脑里能看到的目录,比如learngit文件夹就是一个工作区 |
| 39 | + * 版本库(Repository):工作区有一个隐藏目录.git,这个是Git的版本库。 |
| 40 | + * Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区, |
| 41 | + 还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。 |
| 42 | + * 文件往Git版本库里添加的时候,是分两步执行的: |
| 43 | + * 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; |
| 44 | + * 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 |
| 45 | + * 简单理解为:需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改。 |
| 46 | + * 管理修改 |
| 47 | + * Git管理的是修改,而不是文件 |
| 48 | + * 每次修改,如果不add到暂存区,那就不会加入到commit中 |
| 49 | + * 撤销修改 |
| 50 | + * 把readme.txt文件在工作区的修改全部撤销,有两种情况: |
| 51 | + * 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态: |
| 52 | + * $ git checkout -- readme.txt |
| 53 | + * 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态: |
| 54 | + * $ git reset HEAD readme.txt //把暂存区的修改撤销掉(unstage),重新放回工作区 |
| 55 | + * $ git checkout -- readme.txt //丢弃工作区的修改 |
| 56 | + * 删除文件 |
| 57 | + * $ git rm test.txt (删除也是修改,将修改信息提交到暂存区) |
| 58 | + * $ git checkout -- test.txt //撤销删除 |
| 59 | + * $ git commit -m "remove test.txt" //从版本库中删除该文件 |
| 60 | + |
| 61 | +远程仓库 |
| 62 | + * 设置SSH的私钥和密钥 |
| 63 | + * 第1步:创建SSH Key |
| 64 | + $ ssh-keygen -t rsa -C " [email protected]" |
| 65 | + * 第2步:登陆GitHub |
| 66 | + 打开“Account settings”,“SSH Keys”页面; |
| 67 | + 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容 |
| 68 | + * 在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,id_rsa.pub是公钥 |
| 69 | + * 添加远程仓库 |
| 70 | + * $ git remote add origin [email protected]:gdouchufu/learngit.git |
| 71 | + 把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库 |
| 72 | + * $ git push -u origin master |
| 73 | + 把本地库的所有内容推送到远程库上 |
| 74 | + (第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支, |
| 75 | + 还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。) |
| 76 | + * 从远程仓库克隆 |
| 77 | + * $ git clone [email protected]:gdouchufu/gitskills.git |
| 78 | + * Git支持多种协议,包括https,默认的git://使用ssh,通过ssh支持的原生git协议速度最快 |
| 79 | + |
| 80 | +分支管理 |
| 81 | + * 创建与合并分支 |
| 82 | + * $ git checkout -b dev //创建并切换到dev分支,相当于: |
| 83 | + $ git branch dev |
| 84 | + $ git checkout dev |
| 85 | + * $ git branch |
| 86 | + 查看当前分支 |
| 87 | + * $ git checkout master |
| 88 | + 切换回master分支 |
| 89 | + * $ git merge dev |
| 90 | + * 把dev分支的工作成果合并到master分支上 |
| 91 | + * Fast-forward 是“快进模式”,也就是直接把master指向dev的当前提交,合并速度非常快。 |
| 92 | + * $ git branch -d dev |
| 93 | + 删除dev分支 |
| 94 | + * git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全! |
| 95 | + * 解决冲突 |
| 96 | + * $ git log --graph --pretty=oneline --abbrev-commit |
| 97 | + --graph 查看分支合并图,--abbrev-commit 只显示commitID的前7位 |
| 98 | + (出现冲突时手动更改冲突文件,把冲突文件add到stage后commit,即可fix冲突) |
| 99 | + * 分支管理策略 |
| 100 | + * Merge made by the 'recursive' strategy. |
| 101 | + * 合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息; |
| 102 | + * 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 |
| 103 | + * $ git merge --no-ff -m "merge with no-ff" dev |
| 104 | + * --no-ff参数,表示禁用Fast forward |
| 105 | + * 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 |
| 106 | + * 分支策略的基本原则 |
| 107 | + * master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活 |
| 108 | + * 干活都在不稳定的的dev分支上,发布版本新时,再把dev分支合并到master上,在master分支发布1.0版本 |
| 109 | + * Bug分支 |
| 110 | + * $ git stash |
| 111 | + 把当前工作现场“储藏”起来,等以后恢复现场后继续工作 |
| 112 | + statsh : 隐藏,藏匿;贮藏;〈英〉停止 |
| 113 | + * $ git stash list |
| 114 | + 查看保存的工作现场列表 |
| 115 | + * 恢复工作现场的2个方法: |
| 116 | + * 1、用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除 |
| 117 | + * 2、用git stash pop,恢复的同时把stash内容也删了 |
| 118 | + * $ git stash apply stash@{0} |
| 119 | + 多次stash后恢复的时候,先用git stash list查看,然后恢复指定的stash |
| 120 | + * 强制删除分支 |
| 121 | + $ git branch -D feature-vulcan |
| 122 | + * 多人协作 |
| 123 | + * $ git remote //查看远程仓库信息 |
| 124 | + * $ git remote -v //显示更详细的信息 |
| 125 | + * 推送分支 |
| 126 | + * 哪些分支需要推送到远程仓库,哪些不需要? |
| 127 | + * $ git push origin master //master分支是主分支,因此要时刻与远程同步; |
| 128 | + * $ git push origin dev //dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; |
| 129 | + * feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。 |
| 130 | + * push失败时,先 git pull ,在本地合并后手动解决冲突,再推送 |
| 131 | + * 抓取分支 |
| 132 | + * $ git pull |
| 133 | + 抓取远程仓库的最新版到当前分支 |
| 134 | + * $ git checkout -b dev origin/dev |
| 135 | + 创建远程origin的dev分支到本地 |
| 136 | + * $ git branch --set-upstream dev origin/dev |
| 137 | + 设置dev和origin/dev的链接 |
| 138 | + * $ git push origin dev |
| 139 | + 将本地的dev分支push到远程的dev分支上 |
| 140 | + |
| 141 | +标签管理 |
| 142 | + * 创建标签 |
| 143 | + * $ git tag |
| 144 | + 查看所有标签(标签不是按时间顺序列出,而是按字母排序的) |
| 145 | + * $ git tag v1.0 |
| 146 | + 在最新提交的commit上打标签为v1.0 |
| 147 | + * $ git tag v0.9 6224937 |
| 148 | + 在commit id为6224937的提交上打标签 |
| 149 | + * $ git show v0.9 |
| 150 | + 查看标签信息 |
| 151 | + * $ git tag -a v0.1 -m "version 0.1 released" 3628164 |
| 152 | + 创建带有说明的标签,用-a指定标签名,-m指定说明文字 |
| 153 | + * $ git tag -s v0.2 -m "signed version 0.2 released" fec145a |
| 154 | + 通过-s用私钥签名一个标签,签名采用PGP签名,必须先安装gpg(GnuPG) |
| 155 | + * 操作标签 |
| 156 | + * $ git tag -d v0.1 |
| 157 | + 删除本地标签 |
| 158 | + * $ git push origin v1.0 |
| 159 | + 推送某个标签到远程 |
| 160 | + * $ git push origin --tags |
| 161 | + 一次性推送全部尚未推送到远程的本地标签 |
| 162 | + * 删除已经推送到远程的标签 |
| 163 | + * 先从本地删除:$ git tag -d v0.9 |
| 164 | + * 再从远程删除:$ git push origin :refs/tags/v0.9 |
| 165 | +使用GitHub |
| 166 | + * 在GitHub上,可以任意Fork开源仓库; |
| 167 | + * 自己拥有Fork后的仓库的读写权限; |
| 168 | + * 可以推送pull request给官方仓库来贡献代码。 |
| 169 | + |
| 170 | + |
| 171 | +自定义Git |
| 172 | + * $ git config --global color.ui true |
| 173 | + * 让Git显示颜色,让命令输出看起来更醒目 |
| 174 | + * --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用 |
| 175 | + * 忽略特殊文件 |
| 176 | + * Git工作区的根目录下创建一个特殊的.gitignore文件,把要忽略的文件名填进去,Git就会自动忽略这些文件 |
| 177 | + * 所有配置文件可以直接在线浏览:https://github.com/github/gitignore |
| 178 | + * 配置别名 |
| 179 | + * $ git config --global alias.st status |
| 180 | + 用git st代替git status |
| 181 | + * 用co表示checkout,ci表示commit,br表示branch |
| 182 | + * $ git config --global alias.co checkout |
| 183 | + * $ git config --global alias.ci commit |
| 184 | + * $ git config --global alias.br branch |
| 185 | + * $ git config --global alias.unstage 'reset HEAD' |
| 186 | + $ git reset HEAD test.py --> $ git unstage test.py |
| 187 | + * $ git config --global alias.last 'log -1' |
| 188 | + $ git last //显示最近一次的提交 |
| 189 | + * git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" |
| 190 | + 丧心病狂! 方便地查看git log ... |
| 191 | + * 搭建Git服务器 |
| 192 | + * 第一步,安装git: |
| 193 | + $ sudo apt-get install git |
| 194 | + * 第二步,创建一个git用户,用来运行git服务: |
| 195 | + $ sudo adduser git |
| 196 | + * 第三步,创建证书登录: |
| 197 | + 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个 |
| 198 | + * 第四步,初始化Git仓库: |
| 199 | + 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:$ sudo git init --bare sample.git |
| 200 | + 把owner改为git : $ sudo chown -R git:git sample.git |
| 201 | + * 第五步,禁用shell登录: |
| 202 | + 编辑/etc/passwd文件,将git:x:1001:1001:,,,:/home/git:/bin/bash 改为:git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell |
| 203 | + * 第六步,克隆远程仓库: |
| 204 | + $ git clone git@server:/srv/sample.git |
0 commit comments