6.1.显示颜色
(1)让Git显示颜色,会让命令输出看起来更醒目:”git config –global color.ui true”这样,Git会适当地显示不同的颜色。
6.2.忽略特殊文件
(1)有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files …,有强迫症的童鞋心里肯定不爽。好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore。
(2)忽略文件的原则是:忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
(3)先在git工作目录中新建.gitignore文件,然后编辑gitignore文件,(见图1),最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。
(4)忽略某些文件时,需要编写.gitignore;.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理。
6.3.配置别名
(1)没有经常敲错命令?比如git status?status这个单词真心不好记。如果敲git st就表示git status那就简单多了。我们只需要敲一行命令,告诉Git,以后st就表示status:”git config –global alias.st status”。当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch。–global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
(2)命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:
“git config –global alias.unstage ‘reset HEAD’”。配置一个git last,让其显示最后一次提交信息:”git config –global alias.last ‘log -1’”。甚至还有人丧心病狂地把lg配置成了:”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”“,效果(见图2)。
(3)配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中。别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
6.4.搭建Git服务器
(1)GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
(2)第一步,安装git:”sudo apt-get install git”;第二步,创建一个git用户,用来运行git服务:”sudo adduser git”;第三步,创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个;第四步,初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:”sudo git init –bare sample.git”,Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:”sudo chown -R git:git sample.git”。第五步,禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:”git:x:1001:1001:,,,:/home/git:/bin/bash”改为:”git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell”
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。第六步,克隆远程仓库:现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:”git clone git@server:/srv/sample.git”。剩下的推送就简单了。
(3)如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
(4)有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
(5)搭建Git服务器非常简单,通常10分钟即可完成;要方便管理公钥,用Gitosis;要像SVN那样变态地控制权限,用Gitolite。
(6)Git虽然极其强大,命令繁多,但常用的就那么十来个,掌握好这十几个常用命令,你已经可以得心应手地使用Git了。友情附赠国外网友制作的Git Cheat Sheet,建议打印出来备用:现在告诉你Git的官方网站:http://git-scm.com,英文自我感觉不错的童鞋,可以经常去官网看看。
git_settings.sh
#!/bin/sh
# 各种Git和GitHub的设置
# ubuntu/debian下安装git并查看git版本号
#sudo apt-get install git
#git --version
# 每台机器自报家门
#git config --global user.name "Rston"
#git config --global user.email "1181714007@qq.com"
# 创建空目录并初始化本地仓库
#mkdir /home/rston/workspace/Test
#cd /home/rston/workspace/Test
#git init
#cd -
# 查看文件具体修改的内容
# add本地仓库下所有文件并进行commit
# 查看当前仓库的状态
#git diff
#git add .
#git commit -m "版本V2.0"
#git status
# 查看从最近到最远的所有的commit提交日志
# 显示详细信息
#git log
# 显示简略信息
#git log --pretty=oneline
# 回退到过去的上1个版本
#git log
#git reset --hard HEAD~1
#git log
# 查看命令历史并返回未来的某个版本
#git reflog
#git reset --hard 58c3e7d
#git log
# 查看某个文件在工作区和版本库里面最新版本的区别
#git diff HEAD -- git_settings.sh
#git status
# 使某个文件回到最近一次git commit或git add时的状态
#git checkout -- git_settings.sh
#git status
# 使某个文件从暂存区的修改回退到工作区
#git reset HEAD git_settings.sh
#git status
# 彻底删除某个文件(该文件已经add并commit)
#rm -f git_settings.sh
#git rm git_settings.sh
#git commit -m "remove git_settings.sh"
#git status
# 把误删的某个文件恢复到最新版本(该文件已经add并commit)
#rm -f git_settings.sh
#git checkout -- git_settings.sh
#git status
# 创建SSH Key并查看用户主目录下有没有.ssh目录
# 查看.ssh目录下是否有id_rsa(私钥)和id_rsa.pub(公钥)
# 登陆GitHub->Account settings->SSH Keys->Add SSH Key->粘贴id_rsa.pub文件内容
#ssh-keygen -t rsa -C "1181714007@qq.com"
# 在GitHub上创建远程库Test并与本地库Test关联
# 通过https关联
#git remote add origin https://github.com/Rston/Test.git
# 通过ssh关联
#git remote add origin git@github.com:Rston/Test.git
# 删除远程仓库
#git remote rm origin
# 查看远程库的详细信息
#git remote -v
# 克隆远程的某个仓库到本地形成本地库
# 通过https协议clone
#git clone https://github.com/Rston/GitTest.git
# 通过ssh协议clone
#git clone git@github.com:Rston/GitTest.git
# 创建本地local的dev分支+切换到dev分支+查看当前分支
#git checkout -b dev
#git branch
# 在本地创建和远程分支对应的分支+查看当前分支
#git checkout -b dev origin/dev
#git branch
# 切换到master分支+查看当前分支
#git checkout master
#git branch
# 合并dev分支到当前分支+删除dev分支+查看当前分支(Fast forward模式)
#git merge dev
#git branch -d dev
#git branch
# 合并dev分支到重新生成的commit+查看当前分支(强制禁用Fast forward模式)
#git merge --no-ff -m "merge with no-ff" dev
#git branch
# 查看具体的分支合并图
#git log --graph --pretty=oneline --abbrev-commit
# 强行删除一个没有被合并过的分支
#git branch -D dev
# 指定本地master分支与远程origin/master分支的链接+把最新的提交从origin/master抓下来
#git branch --set-upstream master origin/master
#git pull
# 指定本地dev分支与远程origin/dev分支的链接+把最新的提交从origin/dev抓下来
#git branch --set-upstream dev origin/dev
#git pull
# 推送本地master分支(主分支)到远程库+推送本地dev分支(开发分支)到远程库
# bug分支只用于在本地修复bug,就没必要推到远程了。
# feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
#git push -u origin master
#git push -u origin dev
# 强制推送本地master分支(主分支)到远程库(慎重使用)+强制推送本地dev分支(开发分支)到远程库(慎重使用)
#git push -f -u origin master
#git push -f -u origin dev
# 删除远程库test.txt文件(慎重使用)
#git pull origin master
#git rm test.txt
#git commit -m "rm test.txt"
#git push -u origin master
# 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
#git stash
#git status
# 查看储藏起来的工作现场
#git stash list
# 恢复储藏起来的工作现场+同时删除stash内容
#git stash pop
#git stash list
# 恢复指定的stash+删除指定的stash
#git stash apply stash@{0}
#git stash drop stash@{0}
#git stash list
# 找到历史提交的commit id
# 给5c08b5b的commit打上v0.1的标签并加上说明
# 查看所有标签
# 显示标签v0.1的详细信息
#git log --pretty=oneline --abbrev-commit
#git tag -a v0.1 -m "version 0.1 released" 5c08b5b
#git tag -ln
#git show v0.1
# 生成GPG Key+输入相关信息并确认
# 显示公钥信息
# 显示私钥信息
#gpg --gen-key
#gpg --list-keys
#gpg --list-secret-keys
# 创建v0.2标签+使用GPG加密v0.2标签
# 查看tag标签的验证信息
# 参考链接http://airk000.github.io/git/2013/09/30/git-tag-with-gpg-key
#git log --pretty=oneline --abbrev-commit
#git tag -u "Rston" -s v0.2 -m "signed version 0.2 released" b8b5297
#git tag -ln
#git tag -v v0.2
#git show v0.2
# 删除本地库中的某个标签
#git tag -ln
#git tag -d v0.1
# 删除某个远程标签
#git tag -ln
#git tag -d v0.1
#git push origin :refs/tags/v0.1
# 推送某个本地标签到远程库
# 推送全部未推送过的本地标签
#git tag -ln
#git push origin v0.2
#git push origin --tags
# 使Git适当的显示不同的颜色
#git config --global color.ui true
# 从下方链接处clone相应的.gitignore文件+重命名+编辑
# 配置文件链接https://github.com/github/gitignore
#git clone https://github.com/github/gitignore.git
#cp ./gitignore/C.gitignore .
#mv C.gitignore .gitignore
#vim .gitignore
# 检查并显示.gitignore文件中关于test.hex文件的规则设置
#git check-ignore -v test.hex
# 为常用的git命令设置别名
# 显示最近一次的提交
# 丧心病狂的配置lg命令
#git config --global alias.st status
#git config --global alias.co checkout
#git config --global alias.ci commit
#git config --global alias.br branch
#git config --global alias.last 'log -1'
#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"
# 删除git命令的别名设置,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
# 修改每个仓库的Git配置文件
# 修改用户主目录下针对当前用户的Git配置文件
#cat .git/config
#cat .gitconfig
# 搭建Git服务器
# 安装git+创建1个git用户,用来运行git服务
# 切换到git用户+回到/home/git目录
# 在git用户新建.ssh目录+将开发者的SSH公钥添加到git用户的authorized_keys文件中
# 将/home/git/GitServer/project.git目录作为Git仓库+更改目录权限
# 初始化Git仓库即创建1个没有工作区的裸仓库+把owner改为git
# 禁止git用户使用shell登陆(编辑/etc/passwd将git:x:1001:1001:,,,:/home/git:/bin/bash改为git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell)
# 在ubuntu中安装openssh-server服务+输入ssh密码
# 在别的电脑上克隆远程库
#sudo apt-get install git
#sudo adduser git
#su git
#cd ~
#mkdir .ssh
#sudo cat /home/rston/.ssh/id_rsa.pub >> /home/git/.ssh/authorized_key
#mkdir -p /home/git/GitServer/project.git
#chmod 777 -R GitServer/
#cd /home/git/GitServer
#sudo git init --bare project.git
#sudo chown -R git:git project.git
#sudo vim /etc/passwd
#sudo apt-get install openssh-serve
#ssh localhost
#git clone git@192.168.1.104:/home/git/GitServer/project.git