下载地址:Git 、Git客户端
返回目录
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 中的配置变量。
返回目录
#查看配置
git config --list
#查看所有的配置以及其所在的文件
git config --list --show-origin
返回目录
#设置全局用户信息
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]
返回目录
#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
返回目录
#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>
返回目录
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>
#建议创建一个新的分支
返回目录
#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>
返回目录
#远程分支以 / 命名
#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>
返回目录
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 条提交 | 显示最近的两条提交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 | 隐藏合并提交 |
返回目录
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文件列表
git config --system --unset credential.helper
返回目录
返回目录
用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文件里,一行一个。
ssh-keygen -t rsa
cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
[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,大家可以看一下。
初始化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是仓库路径。好了,到这里服务器的搭建到这里就完成了,下面我们来安装一下客户端。