分布式版本控制工具
-
基本使用
-
安装
Git 官网直接下载安装程序,右键菜单中有
Git Bash
选项,点击弹出命令行窗口即安装成功 -
初始配置
$ git config --global user.name "Your Name" $ git config --global user.email "Your email"
-
初始化仓库
git init
设置当前目录为 Git 可以管理的仓库 -
查看当前目录文件
ls -ah
-ah
参数展示所有文件,包括隐藏文件,如果这个仓库为Git 管理的仓库,就可以看到一个被隐藏的文件.git
-
工作区,暂存区,版本库
-
git add file
将工作区
file
的修改添加到暂存区git add file1 file2
可以添加多个文件 -
git reset
git reset HEAD file
将暂存区文件的修改放回工作区git reset --hard HEAD^
工作区回退到上一版本git reset --hard id
回退到 id 指定版本(就是用git log
中的id,只用写前几位即可) -
git commit
将暂存区的修改全部提交到版本库
-
git commit -m 'add new file'
-m
参数,给提交添加说明
-
-
git checkout -- file
丢弃工作区该文件的修改(实际就是用版本库里的版本代替工作区版本)
-
删除文件
rm file
-
-
调试命令
-
git diff
查看工作区和版本库里面最新版本的区别
git diff HEAD --file
指定文件 -
git status
查看仓库当前状态
-
git log
git log --graph --pretty=oneline --abbrev-commit
显示在一条直线上查看日志
如果日志很长,则按 q 退出
-
git reflog
记录每一次命令
-
-
-
远程仓库
找一台电脑充当服务器角色,每天24小时开机,其他每个人从这个"服务器"仓库克隆一份到自己电脑上,并各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交
-
GitHub
GitHub 就是 Git 的一个远程仓库
-
关联 GitHub 远程仓库
本地仓库与 GitHub 仓库之间的传输是通过 SSH 加密的(将自己的公钥给 github , github 就能对你的每次提交进行身份认证)
-
创建
SSH Key
用户目录看是否有
.ssh
文件夹,如果有,看目录下有没有id_rsa
和id_rsa_pu
,如果有则已经创建过了SSH Key
,如果没有,打开 Git Bash,创建SSH key
ssh-keygen -t rsa -C "邮箱"
--> 一路回车 -
添加远程库
git remote add origin git@github.com:buxiaoxing/learngit.git
origin 就是 远程库的名字
-
删除远程库
git remote rm origin
-
向远程库推送
git push -u origin master
第一次推送
git push origin master
以后推送
注:第一次推送报错
connection timedout
时,在密钥文件夹里创建 config 文件 -
查看远程仓库信息
git remote -v
-
从远程库克隆
git clone 仓库地址
仓库地址有 https 和 git 地址,但 https 较慢
-
-
-
Gitee
国内的 Git 托管服务,速度比 Github 快很多
同样也是通过 SSH 密钥进行身份认证
-
本地仓库可以添加多个远程仓库(名称要唯一)
$ git remote -v gitee git@gitee.com:buxiaoxing/learn-git.git (fetch) gitee git@gitee.com:buxiaoxing/learn-git.git (push) origin git@github.com:buxiaoxing/learngit.git (fetch) origin git@github.com:buxiaoxing/learngit.git (push)
-
-
搭建自己的 Git 服务器
需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian
使用
gitblit
帮助建立 Git 服务器
-
-
分支
创建一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,你在自己的分支上干活。想提交就提交,知道开发完毕后,再一次性合并到原来的分支上,既安全又不影响别人工作
-
Git 上分支的实现
-
master
--> 指向最新的提交 -
HEAD
--> 指向当前分支一开始的时候,
master
分支是一条线,Git 用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点创建一个分支
dev
git branch dev
切换到分支
git checkout/switch dev
创建并切换(等于前面两个命令)
git checkout -b dev
或者git checkout -c dev
查看当前分支
git branch
在
dev
上进行一次新的提交后,dev
指针往前移动一步,而master
指针不变dev
上的工作完成了,就可以把dev
合并到master
上,直接将master
指向dev
的提交就完成合并了合并分支
git merge dev
合并指定分支到当前分支合并完成后,还可以将
dev
分支删除,就是将dev
指针删除,我们就只剩下一条master
分支删除分支
git branch -d dev
-
-
冲突
-
如果两个分支对同一文件的同一地方都进行了修改,这个时候合并两个分支就会产生冲突
这个时候就需要手动解决冲突
-
修改后再提交,分支变化如图
-
最后再将分支删除
-
复制一个特定提交到当前分支
git chery-pick <提交的id-->可以通过 git log 查看>
-
-
禁止使用快速合并分支
Fast forward
使用
Fast forward
模式,这种模式下,删除分支后,会丢掉分支信息,如果要强制禁用Fast forward
模式,Git 就会在merge
时生成一个新的 commit ,从历史信息就可以看出分支信息git merge --no-ff -m 'merge with no-ff' dev
因为本次合并要创建一个新的 commit ,所以加上 -m 参数,把 commit 的描述写进去
注:
Fast forward
合并就只是将 master 的指针指向 dev,并没有提交操作,而禁用Fast forward
就相当于 master 在自己分支上做了一次与 dev 上相同的提交 -
工作现场'储藏'
有时候我们在 dev 上的工作还没有完成,我们需要去其他分支工作,此时就可以将 dev 的工作现场 '储藏'起来
-
git stash
当前工作现场'储藏起来',以后可以恢复现场继续工作(不能追踪到没有 add 过的文件,所以在我们储藏工作现场时确保所有文件都是 add 过的)
-
git stash list
查看工作现场储藏位置 -
git stash apply
恢复stash
中的内容,但stash
中的内容不删除git stash apply stash@{0}
恢复指定stash
-
git stash pop
恢复的同时删除stash
的内容
-
-
多人协作(远程仓库分支管理)
-
git remote -v
显示远程仓库详细信息
$ git remote -v origin git@github.com:buxiaoxing/learngit.git (fetch) origin git@github.com:buxiaoxing/learngit.git (push)
fetch
:抓取仓库push
:推送仓库 -
推送冲突
-
git pull
拉取远程仓库最新修改
如果提示
no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/dev dev
-
最新修改与本地修改有冲突,则手动修改
-
没有冲突或解决冲突后,再用
git push origin dev
推送
-
-
-
Rebase
挪动本地提交位置,把分叉的提交历史“整理”成一条直线,看上去更直观
git rebase
-
-
标签
发布一个版本时,我们通常现在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本,通过 commit 号也可以唯一标识,但 commit 号不便于记忆
-
git tag <tagname>
git tag v1.0
默认标签是打到最新提交的 commit 上的
-
git tag <tagname> <commit id>
将标签打到指定 commit 上
git tag -a v0.1 -m 'version 0.1 released' 1094adb
-a
参数指定标签名-m
参数指定说明文字 -
git tag
查看所有标签
-
git show <tagname>
查看标签具体信息
-
git tag -d <tagname>
删除一个标签
-
git push origin <tagname>
创建的标签都只会存储到本地,不会自动推送到远程,所以打错的标签可以在本地安全删除
将标签推送到远程
git push origin --tags
一次性推送全部尚未推送到远程的本地标签
-
删除远程标签
git tag -a v0.9
先删除本地的标签git push origin :refs/tags/v0.9
删除远程标签
-
-
自定义 Git
-
忽略特殊文件
有些时候必须把某些文件放在 Git 工作目录中,但又不能提交他们,比如保存了数据库密码的配置文件,但每次
git status
都会显示Untracked file ……
,看起来不舒服可以在Git工作区的根目录下创建一个特殊的
.gitignore
文件,然后把要忽略的文件名填进去# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
最后再将
.gitignore
文件提交到 Git -
配置别名
给命令配置别名
buxiaoxing@buxiaoxing-PC MINGW64 /f/工具/git/git repository (master) $ git config --global alias.st status buxiaoxing@buxiaoxing-PC MINGW64 /f/工具/git/git repository (master) $ git st On branch master Your branch is up to date with 'gitee/master'. nothing to commit, working tree clean
-
配置文件
-
配置Git的时候,加上
--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。 -
配置文件放哪了?每个仓库的Git配置文件都放在
.git/config
文件中:
-
-