文章目录
一、概述
二、git config(配置)
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
-
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
-
当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)
每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
1. 查看 config
#查看配置
git config --list
#查看所有的配置以及其所在的文件
git config --list --show-origin
2. 设置用户信息
#设置全局用户信息
git config --global user.name "John Doe"
git config --global user.email [email protected]
#设置项目用户信息
git config user.name "John Doe"
git config user.email [email protected]
三、Git的使用
1. 本地仓库
#0. 克隆仓库
git clone <url>
#1. 创建本地仓库
#该命令将创建一个名为 .git 的子目录
git init
#2. 追踪(暂存)文件
git add <file>
git add *.c #追踪所有.c的文件
#3. 提交追踪(暂存)的文件到仓库
git commit -m 'text' #-m 表示此次提交的说明
git commit -a -m 'text' #-a 会自动把所有已经跟踪过的文件暂存起来一并提交
#3.1 修补提交,即:提交后发现忘记了暂存某些需要的修改
git commit -m 'initial commit' #忘提交个文件
git add forgotten_file #添加忘记的文件
git commit --amend #修补提交,最终只会有一个提交——第二次提交将代替第一次提交的结果
#4. 检查当前文件状态
#查看哪些文件处于什么状态,是否被跟踪
git status
git status -s #查看简洁信息
#5. 查看当前与提交的区别
#只显示尚未暂存的改动,未跟踪的文件不显示
git diff <filename>
#查看已暂存的将要添加到下次提交里的内容
git diff --staged #或 --cached
#6. 删除文件
#6.1 从"提交"中删除,并删除该文件。但不能删除“暂存”和“未跟踪”的文件
git rm <file>
#6.2 从"提交"或“暂存”中删除,并删除该文件。但不能删除“未跟踪”的文件
git rm -f <file>
#6.3 只从"提交"或“暂存”中删除,不删除文件。但不能删除“未跟踪”的文件
git rm --cached <file>
#6.4 使用 glob 模式
git rm log/\*.log #删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~ #删除所有名字以 ~ 结尾的文件
#7. 文件改名
git mv file_from file_to
#8. 取消暂存
git reset HEAD <file>
#回滚
#HEAD^ 上个版本; HEAD^^ 再上一个版本; HEAD~1000 为之前的1000个版本
git reset --hard HEAD^
#不用参数就用 git log 命令中查询到的 版本号 来控制回滚
#9. 撤消对文件的修改
#会用暂存区全部或指定的文件替换工作区的文件
#这个操作很危险,会清除工作区中未添加到暂存区的改动
git checkout -- <file>
#查看执行过的git命令
git reflog
2. 远程仓库
#1. 查看所有的远程仓库
git remote -v #默认名称是 origin。如远程仓库为多个,将会全部列出
#2. 添加远程仓库
git remote add <shortname> <url> #用 shortname 来代替整个 URL
#3. 从远程仓库中拉取
#访问远程仓库,从中拉取所有本地还没有的数据。
#执行完成后,将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git fetch <remote>
#4. 从远程仓库中抓取
#自动抓取后合并该远程分支到当前分支
git pull
#5. 推送到远程仓库
git push <remote> <branch>
#6. 查看某一个远程仓库的信息
git remote show <remote>
#7. 重命名远程仓库
git remote rename <remote> <newname>
#8. 删除远程仓库
git remote remove <remote>
3. 标签
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)
#1. 查看标签
git tag
git tag -l "v1.8.5*" #查看某一系列的标签
#2. 创建轻量标签
git tag <tag>
#3. 创建附注标签
git tag -a <tag> -m "msg"
#4. 查看标签详细信息
git show <tag>
#5. 对已提交的操作打标签
git tag -a <tag> <commitHash>
#6. 推送标签
git push <remote> <tag>
git push <remote> --tags #推送所有标签
#7. 删除标签
git tag -d <tag>
#8. 删除远程的标签
git push <remote> :refs/tags/<tag>
git push <remote> --delete <tag>
#9. 检出标签
#如做了某些更改然后提交,标签不会发生变化,
#但新提交将不属于任何分支,并且将无法访问,
#除非通过确切的提交哈希才能访问。
git checkout <tag>
#建议创建一个新的分支
4. 分支
#1. 创建分支
git branch <branch>
#2. 分支切换
git checkout <branch>
#2.1 创建并切换到新分支
git checkout -b <branch>
#3. 查看分支历史
git log --oneline --decorate --graph --all
#4. 查看分支
git branch -a #查看所有分支
git branch -v #查看每一个分支的最后一次提交
git branch --merged #查看已经合并到当前分支的分支
git branch --no-merged #查看尚未合并到当前分支的分支
git branch -vv #查看设置的所有跟踪分支
#5. 合并分支
#如有冲突,Git用
#<<<<<<<
#当前分支内容
#=======
#合并分支的内容
#>>>>>>>
#标记出不同分支的内容
git merge <branch> #将别的分支合并到本分支
git merge --no-ff -m "merge with no-ff" <branch> #--no-ff 表示禁用快速合并
#6. 变基
#将本分支变基到其它分支。相当于提交到其它分支上,使提交树更简洁。
#其它分支并未改变,还需要进行切换、合并操作。
#准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
git rebase <branch>
#图1:c1<-c2<-c5<-c6(master)
# \<-c3<-c4<-c10(server)
# \<-c8<-c9(client)
git rebase --onto master server client #将 client 的修改变基到 master 分支上
#图2:c1<-c2<-c5<-c6(master)<-'c8<-'c9(client)
# \<-c3<-c4<-c10(server)
git checkout master #切换到 master 分支
git merge client #合并 client 分支到 master 分支
#图3:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)
# \<-c3<-c4<-c10(server)
git rebase master server #再将 server的修改变基到 master 分支上
#图4:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)<-'c3<-'c4<-'c10(server)
#记住:只对尚未推送或分享给别人的本地修改执行变基,从不对已推送至别处的提交执行变基
#7. 删除分支
git branch -d <branch>
5. 远程分支
#远程分支以 <remote>/<branch> 命名
#1. 检出远程分支
git checkout -b <branch> <remote>/<branch>
#检出远程分支,并且本地分支与远程分支名称相同
git checkout --track <remote>/<branch>
#2. 推送到远程分支
git push <remote> <branch>
#将本地的分支推送到远程仓库上的另一个分支
git push <remote> <branch>:<otherbranch>
#3. 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支
git branch -u <remote>/<branch>
git branch --set-upstream <branch> <remote>/<branch>
#4. 删除远程分支
git push <remote> --delete <branch>
6. 查看提交历史
-
git log
查看推送日志,输入字母q退出
不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。-p 或 --patch 会显示每次提交所引入的差异
git log -p -2 #-2表示显示最近的两条提交
–stat 会显示每次提交的简略统计信息
git log --stat
–pretty=oneline|short|full|fuller|format
#每个提交放在一行显示 git log --pretty=oneline #short、full 和 fuller 显示的信息长度不一样 git log --pretty=short #自定义输出 git log --pretty=format:"%h - %an, %ar : %s"
-
git log --pretty=format
常用的选项选项 说明 %H 提交的完整哈希值 %h 提交的简写哈希值 %T 树的完整哈希值 %t 树的简写哈希值 %P 父提交的完整哈希值 %p 父提交的简写哈希值 %an 作者名字 %ae 作者的电子邮件地址 %ad 作者修订日期(可以用 --date=选项 来定制格式) %ar 作者修订日期,按多久以前的方式显示 %cn 提交者的名字 %ce 提交者的电子邮件地址 %cd 提交日期 %cr 提交日期(距今多长时间) %s 提交说明 -
git log
的常用选项选项 说明 -p 按补丁格式显示每个提交引入的差异。 –stat 显示每次提交的文件修改统计信息。 –shortstat 只显示 --stat 中最后的行数修改添加移除统计。 –name-only 仅在提交信息后显示已修改的文件清单。 –name-status 显示新增、修改、删除的文件清单。 –abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 –relative-date 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 –graph 在日志旁以 ASCII 图形显示分支与合并历史。 –pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 –oneline –pretty=oneline --abbrev-commit 合用的简写。 -
过滤 git log 输出的选项
选项 说明 示例 -<n> 仅显示最近的 n 条提交 显示最近的两条提交 git log -2
–since, --after 仅显示指定时间之后的提交 显示最近两周的所有提交 git log --since=2.weeks
可以是 "2008-01-15"的某一天
可以是 “2 years 1 day 3 minutes ago” 的相对日期–until, --before 仅显示指定时间之前的提交 同上 –author 仅显示作者匹配指定字符串的提交 –committer 仅显示提交者匹配指定字符串的提交 –grep 仅显示提交说明中包含指定字符串的提交 如果添加了 –all-match 选项, 则只会输出 所有 匹配 --grep 模式的提交 -S 仅显示添加或删除内容匹配指定字符串的提交 –no-merges 隐藏合并提交
7. 忽略文件
-
git 用 .gitignore 文件来标记忽略的文件。其格式规范如下:
a)所有空行或者以 # 开头的行都会被 Git 忽略
b)可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
c)匹配模式可以以(/)开头防止递归
d)匹配模式可以以(/)结尾指定目录
e)要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反 -
创建 .gitignore 文件
#忽略所有以 .o 或 .a 结尾的文件 *.[oa] #忽略所有名字以波浪符(~)结尾的文件 *~ # 忽略所有的 .a 文件 *.a # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件 !lib.a # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO /TODO # 忽略任何目录下名为 build 的文件夹 build/ # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt doc/*.txt # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件 doc/**/*.pdf
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore文件列表
四、分支管理策略
- 主分支 master
代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。 - 开发分支 develop
主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
这个分支可以用来生成代码的最新代码版本。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。 - 功能分支 feature
功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
功能分支的名字,可以采用feature-*的形式命名。 - 预发布分支 release
预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。 - bug 分支 fixbug
bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。 - 其它分支 other
根据需要创建即可
五、搭建Git服务器
-
用yum安装git服务器
cd src/ wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm rpm -ivh epel-release-5-4.noarch.rpm Preparing... ########################################### [100%] package epel-release-5-4.noarch is already installed yum list yum install -y git
-
创建一个git用户,用来运行git服务
adduser git
-
创建客户端登录证书
注,收集所有需要登录的用户的公钥,就是他们自己生成的id_rsa.pub文件,把所有公钥复制到/home/git/.ssh/authorized_keys文件里,一行一个。- 客户端生成id_rsa.pub文件的命令
ssh-keygen -t rsa cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
- 查看服务器上authorized_keys文件
[root@git ~]# cat /home/git/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9+Fbjgd6oBSzNuaBtCIbwNNsEyM/henTl2euI3XsnJQ/ITr6c/q0P3WoGl4E2QFQ2kZqs+1eDC0CgHcBrqvFv1Jr414sVYK9lfZwIF+jDdtaBOrSJuq1Agx9pGUFUEB4tQfkXxsWm/MvOmKAVvduKDE1eenUEL9zzyeELPcSXLe3NOoTjZhkX6EEXxQR1ZiZRFywLpfM4qopZ10to2KIUyVtzw6hx6V3cg7kn40lYVW0EAMATw9dVldwcRUI+kJzJSKUTKDVSwY3/+Q== root@CHENMINGQIAN ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsmmJuR+KhRSpdSirCiL30RA8WbfgicY1z7itWVnKHJW6hTuJFhzruY59FilVjJR1hbQBluP9JnK3XPSK9PSg+bwiJ2iQRa39rXck35r+trVOLyNbPyfKVRfOemD8YuykMlyr5JeW8gZjsHEuLnJ8//RiCiYzd3RT/SSUQ4yawDoIIWkz3eUSL09xoCRZFBsAp+S/LD3vx2MN+FNOHwvqcE+yK3oRNIqjWwLoKE0e5TRnqNgrPQ95PJYB3XPUulzaeMwsWPZs7jIUMl/5yEqSgAkioa8SVMOsikYJG/erv99NNVgFmpCBIiWqKEGkNrIpYzLLHDSYQ4g5Gbci/RZ54Q== Administrator@WIN2003X323 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
说明:我这里有三个用户登录服务器,所以我这里就有三个ssh-rsa,大家可以看一下。
- 客户端生成id_rsa.pub文件的命令
-
初始化Git仓库
注,先选定一个目录作为Git仓库,这里是/data/git/project.git。cd /data/git/ git init --bare project.git ls branches config description HEAD hooks index info objects refs
执行以上命令 Git命令,会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
chown -R git.git project.git ls -l 总计 4 drwxr-xr-x 7 git git 4096 05-09 13:50 project.git
-
禁用shell登录
注,出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:cat /etc/passwd | grep git git:x:1001:1001:git version control:/home/git:/bin/bash
改为:
vim /etc/passwd git:x:1001:1001:git version control:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
-
克隆远程仓库
注,现在可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:git clone [email protected]:/data/git/project.git
注,$ git clone [email protected]:/data/git/project.git,其中git用户名,git.jjhh.com服务器,/data/git/prgject.git是仓库路径。好了,到这里服务器的搭建到这里就完成了,下面我们来安装一下客户端。