Git 有关网站
托管: Github、Bitbucket、码云、Coding
使用教程: 廖雪峰 Git 教程
常用命令
常用命令
git log --pretty=online --abbrev-commit 查看历史提交的commit id
ssh-keygen -t rsa -C "邮箱地址" 生成秘钥,并绑定自己的邮箱
git diff HEAD -- 文件名 查看工作区与版本库最新版本的区别
git init 将目录变成版本库
git config user.name 设置Git用户名
git config user.email 设置Git邮箱
ls -ah 查看隐藏文件
vi / touch 新建文件
git add 文件名 将文件添加到暂存区
git add -f a.class 强制添加文件到暂存区
git commit -m '提示语' 将文件提交到版本库
git status 查看仓库状态
git diff 文件名 查看具体修改内容
git reset --hard HEAD^ 返回以前版本,有几个^就返回几个版本
git reset --hard HEAD~数字 返回以前指定几个版本
git reset --hard 版本号 返回指定版本
git reflog 记录每一次命令
版本库
(origin默认为远程版本库名称,master为分支名)
git checkout -- 文件名 丢弃对工作区的修改或将删除的文件恢复
git reset HEAD 文件名 把暂存区的修改退回到工作区
rm 文件名 删除工作区中的文件
git rm 文件名 删除版本库中的文件
git pull origin master 将远程版本库拉到本地自动合并
git fetch origin 分支名 将远程版本库拉到本地不合并
git push -u origin master 将本地版本库提交到远程版本库
git remote rm origin 将版本库删除
git clone [email protected]:wwc/fight.git 将远程版本库克隆到本地
分支
git branch 查看分支
git branch -a 查看分支包括远程分支
git branch dev(分支名称) 创建分支
git checkout dev 切换分支
git branch -b dev(分支名称) 创建并切换分支
git branch --set-upstream 分支名称 origin/分支名称 指定本地分支与远程分支的链接(pull失败时使用)
git checkout -b dev(分支名称) origin/dev 创建远程origin的dev分支到本地
git merge 分支名称 合并分支
git branch -d 分支名称 删除分支
git branch -D 分支名称 强行删除分支
git merge --nn--ff '提示信息'dev(分支名称) 强制关闭Fast forward使用方式
git stash 将当前分支工作区"保存"起来
git stash list 查看保存的分支信息
git stash apply (stash号) 恢复保存的分支(不删除stash信息)
git stash pop (stash号) 恢复保存的分支(删除stash信息)
远程库
git remote 查看远程库信息
git remote -v 查看远程库详细信息
标签
git tag 查看标签
git show 标签名 查看标签信息
git tag 标签名 创建标签
git tag 标签名 commit id 对某个提交创建标签
git tag -a 标签名 -m '说明' commit id 对标签进行说明
git tag -s 标签名 -m'说明' commit id 通过-s用密钥来创建一个标签
git tag -d 标签名 删除一个标签
git push origin 标签名 将标签推送到远程
git push origin --tags 一次性将本地所有标签推送到远程
git push origin :refs/tags/标签名 删除一个远程标签(最好先将本地删除)
git check -ignore -v 文件名 检查.gitignore文件中,该文件类型的忽略信息
git show 查看当前提交的版本信息
git show [version] 查看指定快照的版本信息
git show (tag) 查看指定tag的版本信息
git remote show 查看远程仓库信息
git remote show [alias] 查看某个远程仓库的信息,[alias]为远程仓库的别名
git log 查看从近到远提交日志
git log -p 展开每次提交内容差异
git log --graph (try it)
git log --pretty 以各种格式显示log
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset--abbrev-commit 每个版本文件清单,指定日期,作者等(想得到的基本都能做到)
git remote 罗列、添加和删除远端仓库别名
例:git remote 列出远端分支
origin
git remote -v
origin git@localhost:test.git (fetch)
origin git@localhost:test.git (push)
git remote add 为你的项目添加一个新的远端仓库
git remote add origin git@localhost:test.git
git remote rm 删除现有的某个别名
git remote rm origin
Git 安装及配置
- 安装
Windows 安装
下载并安装 GitBash 下载
下载并安装 TortoiseGit,先安装语言包,再安装软件包 下载
CentOs 安装
yum -y install git
- 配置
- 输入命令
pwd
,先查看用户目录- 输入命令 (会在 ~ 目录中生成 .ssh 目录)
ssh-keygen -t rsa -C "邮箱地址"`
Enter file in which to save the key (/Users/wangweichen/.ssh/id_rsa): 按回车 Enter passphrase (empty for no passphrase): 输入密码 完成后,生成 ~/.ssh 目录,得到 id_rsa与id_rsa.pub文件,id_rsa为密钥,id_rsa.pub为公钥
- 配置用户信息
设置用户名、Email和在GitHub中创建访问令牌(API token)
git config --global user.name 'zhangsan'
git config --global user.email '[email protected]'
- 生成SSH密钥,以及在GitHub上绑定用户密钥
因为GitHub需要识别出是你推送的,所以GitHub知道你的公钥才可以推送。
打开github官网(Github),注册 -> 创建自己的账户(wwc) -> 登录,点击头像 -> settings -> SSH and GPG keys -> New SSH key -> Title起个名 -> key 的内容,将 id_rsa.pub 文件中的公钥复制添加到这里
- 测试连接
测试连接是否成功,输入
ssh -T [email protected]
如果提示 Hi 用户名称 You’ve successfully authenticated,but GitHub does not provide shell access. 说明连接成功’
克隆
将本地文件添加到远程
1.创建版本库
一、添加远程仓库
回首页->newrepository->输入Repository name(yjg)->Create repository
二、在本地新建仓库
a. 选择合适目录
mkdir test
cd test
b. 使用 `git init` 命令将这个目录变成可管理的仓库,会生成一个隐藏文件夹(.git),使用ls -ah可查看隐藏文件
成功创建Git版本库(git init)后,Git会自动创建第一个分支(master)以及指向master的HEAD指针
c. 创建一个read.txt文件 vi read.txt 或 touch read.txt touch会创建一个不存在的文件
d. 在read.txt中添加内容 vi read.txt
e. 将文件添加到缓存 git add read.txt
f. 将文件提交到仓库 git commit -m '1提交read.txt'
g. git remote add origin [email protected]:wwc/yjg.git 连接远程yjg仓库
git push -u origin master 提交本地版本库到远程版本库 (在GitHub上成功看到自己提交的readme.txt文件)
可能出现的错误:
1:在执行 git remote add origin [email protected]:wwc/yjg.git
错误提示:fatal: remote origin already exists.
解决方法:git remote rm origin
2:在执行 git push -u origin master
错误提示:error:failed to push som refs to..........
解决方法:git pull origin master //先把远程版本库拉下来合并,再提交,如果合并冲突,解决冲突后提交
从远程克隆
一、添加远程版本库
回首页->newrepository->输入Repository name(fight)->勾选Initialize ... README(自动创建README.md文件)->Create
二、克隆远程版本库到本地
git clone [email protected]:版本库地址
版本管理
版本回退
1. git log 命令显示从近到远的提交日志 参数:--pretty=oneline
2. 退回以前版本 `git reset --hard HEAD^` 或者 `git reset --hard HEAD~` 数字
说明:HEAD 表示当前版本,HEAD^ 表示上一版本, HEAD^^ 表示上上版本,以此类推
注意:当退回以前版本时,用 git log 查看,会发现最新版本会消失,如果想恢复到最新版本,只要命令窗口未关闭,并且用git log查看过,就可以通过 git reset --hard 版本号追回,版本号可以用前几位,GIT会自动去找,如果已经关闭命令窗口,没关系,GIT 提供 `git reflog` 来记录你的每一次命令,就可以看到版本号了
撤销修改
分四种情况
(1) 还未添加到暂存区
丢弃(撤销)对工作区的修改: git checkout -- 文件名
(2) 已添加到暂存区,未提交到版本库
把暂存区的修改退回到工作区 git reset HEAD 文件名
(3) 已提交到版本库,未推送到生产版本库
使用3.版本管理->二、版本回退 退回上一版本
(4) 已推送到生产版本库
已写好'辞职申请'
删除文件
分两种情况
(1) 在工作区中删除
使用 rm 文件名
恢复:git checkout --文件名 其实就是将版本库中的版本替换工作区中的版本
(2) 在暂存区删除
git rm 文件名
分支
一、查看分支
git branch 查看分支
git branch -a 查看分支包括远程分支
二、创建、合并和删除分支
git branch dev(分支名称) 创建分支
git checkout dev 切换分支
或者直接使用 git checkbou -b dev(分支名称) 自动创建并切换到dev分支
git merge 分支名称 合并分支
git branch -d 分支名称 删除分支
git branch -D 分支名称 强行删除分支
在新建分支后对文件进行修改,但是不想合并,在删除分支时会提示未合并,可以使用强行删除分支
如果你新建了一个分支dev,并在该分支中修改了文件,切换到master分支中是看不到在dev分支修改的内容的,所以要合并
三、解决冲突
如何产生:
例:你在dev分支下对1.php文件做了修改,并提交到本地版本库,又切换到master分支对1.php做了修改,将这两个分支合并
时会发生错误
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts andthen commit the result.
打开1.php文件会发现多了
<<<<<<<<<HEAD
Creating a new....
=========和
Creating a new....
>>>>>>>>>dev
将这些删掉保存再提交,就可以了
四、分支管理
合并时,Git会使用 Fast forward模式,在这种模式下,删除分支时会丢掉分支信息,如果在合并时,强制关闭该模式,Git在提
交时会生成一个新的commit,就可以看到分支信息,以及合并内容
git merge --nn--ff '提示信息'dev(分支名称) 强制关闭Fast forward使用方式
一般在开发过程中是不在master分支上进行开发,每个成员都会有新建一个分支,当对文件进行修改后,再合并到master分支
上,如果出现冲突,使用强制关闭Fast forward模式,方便以后查看合并信息
五、Bug分支
使用场景:当在开发过程中,接到一个需要修复的bug,但是在当前分支上(dev)的工作还没有提交,但是当前工作还未完成
这时就需要将当前工作"保存"起来,修复完bug后再回来工作
git stash 将当前分支工作区"保存"起来
先要确定在哪个分支上修复bug,比如在master分支上修复,就从master分支上创建临时分支(我认为就是新建一个分支)
git checkout master
git checkout -b new-bug1(分支名称)
修复完后,与master合并(强制关闭Fast forward模式)->提交->删除new-bug1分支
这时就需要回到dev分支进行开发,但是"保存"在哪里了,
git stash list 查看保存的分支信息
stash@{0}: WIP on dev: 6224937 add merge
git stash apply (stash号) 恢复保存的分支(不删除stash信息)
git stash pop (stash号) 恢复保存的分支(删除stash信息)
可以多次git stash,在恢复时,用git stash list 查看,恢复指定的stash
六、多人协作
从远程库clone到本地时,只能看到master分支,但是要在dev分支上开发,这时就要从远程将dev分支拉下来创建本地dev分支
git checkout -b dev origin/dev 从远程将dev分支拉下来创建本地dev分支
,在将文件修改push到远程后,另外一名伙伴的最近提交与你的推送有冲突,这时就需要解决冲突,先用git pull 拉下来,在本地合并,再push
但pull也可能失败,因为没有指定本地dev分支与远程dev分支的链接,根据提示,指定链接
git branch --set -upstream dev origin/dev 指定本地dev分支与远程dev分支的链接
标签管理
git tag 查看标签
git show 标签名 查看标签信息
git tag 标签名 创建标签
git tag 标签名 commit id 对某个提交创建标签
git tag -a 标签名 -m '说明' commit id 对标签进行说明
git tag -s 标签名 -m'说明' commit id 通过-s用密钥来创建一个标签
用密钥创建,签名采用PGP签名,因此,必须安装gpg(GnuPG),如果没有打到gpg或没有gpg密钥对,就会报错。如报错,借助GnuPG文档配置Key.
git tag -d 标签名 删除一个标签
git push origin 标签名 将标签推送到远程
git push origin --tags 一次性将本地所有标签推送到远程
git push origin :refs/tags/标签名 删除一个远程标签(最好先将本地删除)
自定义Git
一、忽略特殊文件
比如数据库配置信息不提交,这时需要在Git根目录下创建一个特殊的.gitignore文件,将要忽略提交的文件名填进去,Git就会自动忽略这些文件
忽略特殊文件原则:
(1)忽略操作系统自动生成的文件,比如缩略图等;
(2)忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如
Java编译产生的.class文件;
(3)忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
.gitignore文件也要推送到版本库
例:比如你要添加 a.class 文件到版本库,但是发现添加不了,因为.class文件被忽略了,这时你可以使用 git add -f a.class 强制添加文件到缓存
也可能是.gitignore文件写的有问题,需要知道哪个规则写错了,使用 git check -ignore -v 文件名 检查.gitignore文件中,该文件类型的忽略信息
二、配置别名
就是将git命令起个别名,便于使用和记忆
git config --global alias.st status 将status起别名为st
git config --global alias.co check
git config --global alias.ci commit
git config --global alias.br branch
三、搭建Git服务器
需要一台Linux(Unix)服务器。推荐使用Ubuntu或Debian,通过apt命令就可以安装
a. 安装Git
sudo apt-get install git
b. 创建Git用户,用来运行Git服务
sudo adduser git(用户名)
c. 加入用户密钥
拿到用户的id_rsa.pub文件中公钥内容,将所有公钥导入/home/git/.ssh/authorized_keys文件中,一行一个
d. 初始化Git仓库
新建或选择一个目录为远程仓库,假设为/srv/test.git 进入/srv目录输入 sudo git init --bare test.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且
服务器上的Git仓库通常都以.git结尾。然后,把owner改为git: sudo chown -R git:git test.git
e. 禁止Shell登录
编辑 /etc/passwd 文件 vi /etc/passwd
找到 git:x:1001:1001:,,,:/home/git:/bin/bash 改为 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
f. 克隆远程库
git clone git@用户名:/srv/test.git