简介
Git 是一个分布式版本控制系统。而CVS,SVN是集中式版本控制系统。
集中式,就是有一个中央服务器,大家都从中央服务器中下载最新版本进行修改。即相当于只有一个版本。
分布式,每个人电脑中都是完整的版本,相互提交时,可以看到对方修改的地方,可以选择合并哪些修改部分。
注:所有版本控制系统只能跟踪文本文件的改动。而图片、视频这些二进制文件,只能跟踪大小的改变,具体改变 了什么内容,系统无法得知。
千万不要使用Windows自带的记事本编辑任何文本文件。有时候会造成各种奇怪问题。
安装配置 Git、以及 Git 在本地的使用
下载,设置名字
Windows 下,直接上 Git 官网下载安装。
然后找到 Git -> Git bash,输入如下命令:设定用户名,邮箱;此命令同样可用于修改,读取
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
把文件夹初始化为可管理的仓库
在任意地方创建一个新文件夹,在文件夹空白处,点击鼠标右键,Git bash Here 打开 Git 命令窗口,(后面所有要输命令都是同理)用 git init
命令把此文件夹变成可以管理的仓库,这时候文件夹中就多了一个隐藏的文件夹 .git
,这个文件夹用于记录仓库版本数据的。
git init
新建文件,并对文件版本进行管理
在仓库中创建一个新文件,例如:read.txt,接着用 git add
命令告诉 Git,把文件添加到仓库
git add read.txt
用 git commit
告诉 Git,把文件提交到仓库:-m 后面的内容是本次提交说明。
git add
每次添加一个文件,git commit
则会把文件夹内所有 add 的内容提交
git commit -m "submit a read file"
查看仓库状态,记录,版本之间切换
git status
查看目前仓库的状态(是否有文件修改过,修改的内容是否 add 了),如果要查看具体的修改内容用 git diff
git log
命令查看,从最近到最远的提交日志。git log --pretty=oneline
则可以让显示的信息更简洁。前面显示的一长串数字是版本号。
git reset
命令,把文件退回到想要的版本。HEAD
表示当前版本。HEAD^
表示上一个版本,HEAD^^
表示上上一个版本。当然也可以直接用数字 HEAD~2
表示。
git reset --hard HEAD^
回到过去后,还能回到未来吗?只要命令窗口没关闭就可以。通过版本号去到目标版本。版本号可以只写前几位即可,git 会自动找到。(每个人的版本号不一样,找自己对应的)
git reset --hard c69c48ee
当然,有时候,命令窗口关掉了,过了几天又想改回去,也是有办法的。
git reflog
命令可以找到每一次的操作的 id 及提交说明。然后使用 git reset
命令就可以恢复到对应的版本了。
版本库
git add
,实际上就是把文件修改添加到暂存区;
git commit
,实际上就是把暂存区的所有内容提交到当前分支,创建 Git 版本库时,会自动创建唯一 master 分支;
注:同一个文件,多次修改,要记录这多次修改,以便以后返回,就每次修改都要git add
再,git commit
,删除文件时,也要这样提交,用git rm
命令把该文件从版本库中删除,再提交。
git checkout -- file
可以丢弃工作区的修改,即,你某次修改,感觉改乱了,又不想用git reset
提交到记录中,又想让文件退回到最近一次的 git commit
或 git add
的状态。删错文件也可以恢复。
--
很重要,没有了--
就变成了“切换到另一个分支”的命令。
Git 远程库的使用 GitHub
SSH key
Git 远程库,可以自己在服务器上搭建,或者使用免费的 GitHub、码云,这里以GitHub为例。
首先注册 GitHub 帐号。然后
第一步:在电脑上创建 SSH Key。
ssh-keygen -t rsa -C "qq@qq.com"
然后一路回车即可,完成后,就会在 c:/users/your username/.ssh 目录下生成私钥 id_rsa 和公钥 id_rsa.pub
然后,就会在 c:/users/your username/.ssh
目录下生成私钥 id_rsa
和公钥 id_rsa.pub
打开公钥id_rsa.pub
文件,全选,复制。
然后登录到 GitHub ,点击头像,打开setting,点击 SSH & GPG keys ,点击 New SSH key ;
title 中随意填,Key 中把刚刚复制的公钥粘贴进去。
每台电脑一个 ssh key,如果你要多个电脑提交 ,也可以在 github 上添加多个key
把本地内容推送到远程库,以及克隆远程库到本地
连接远程库:origin
为远程库的默认名称,可以自己定义,同一项目,多个远程库时,远程库名字不能一样。
git remote add origin git@github.com:oeeo/banner.git
oeeo 换成自己的帐户名。
然后把本地库的内容推送到远程库
git push -u origin master
注:第一次使用 git clone
or push
到这一步会有一个SSH警告。yes 即可。
由于远程库是空的,我们第一次推送 master
分支时,加上了 -u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的 master
分支和远程的 master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push origin master
讲完推送,再讲克隆git clone
,例如在 github 创建了一个Baidu_ife 仓库。要克隆到本地
git clone git@github.com:oeeo/Baidu_ife.git
创建与合并分支
一开始的时候,master
分支是一条线,Git 用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点。
而我们要创建分支,就是将HEAD
指向分支,master 则还是指向 master 主分支下的最新提交。
例如:要创建一个命为wang
的分支,用git branch
命令创建分支,git checkout
切换分支:
git branch wang
git checkout wang
这两条命令也可以简化为:
git checkout -b wang
这样,你就切换到了wang
分支,在命令的结尾可以看到,你当前所在分支
git branch
也可以查看所有分支,标有 *
的是当前分支
git branch
创建分支后,在分支状态下,修改之前创建的文件 read.txt
的内容,提交。
git add read.txt
git commit -m "wang分支下的修改"
接着切换回 master 分支,这时候,wang
分支下有提交的修改内容
master 分支下可以用git merge
命令合并 wang
分支提交的修改
git checkout master
git merge wang
合并之后就可以放心删除分支了
git branch -d wang
合并冲突
通常,一个项目有一个主分支,多个子分支。当子分支有提交,主分支也有提交,而且修改的内容有冲突的时候,合并就会发生冲突。无法快速合并。这时候用git merge
命令,会把所有分支的内容都填写到你的文件中,Git 用«««<,======,»»»>来标记不同的分支内容,如果是 markdown 文件,要点开字符模式查看。
修改后用 git add
添加修改后的文件,git commit
提交。最后删除分支。
即,当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
查看分支合并图:
git log --graph
git log --graph --pretty=oneline --abbrev-commit
##分支策略
实际开发环境中 master
分去应该是非常稳定的,也就是仅来发布新版本,平时不能在上面干活。
干活都在 dev 的分支上。即 master » dev » branchs
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
效果是一样的,区别就在于是否能在 log 中查看到合并记录。
git merge --no-ff -m "merge with no-ff" wang
一些常用操作技巧
保存工作现场
git stash
、git stash pop
修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除;
当手头工作没有完成时,需要马上切换到其它分支去修复 BUG,这时你又不想把未完成的内容提交;
就可以用git stash
命令把工作现场保存下来,然后切换分支去修复bug;
修复后,再 切回分支,用git stash pop
,回到工作现场。
如果多次 git stash
时,用如下命令,回到某一个 stash
git stach list
git apply stash@{0}
强行删除分支:当分支未合并,但又不想要了,要强行删除分支时-d
变成 -D
git branch -D <name>
标签管理
标签就是管理版本号的。跟commit 的id类似,只不过标签比较好记,v1.0 这样
打标签:切换到要打标签的分支=> git tag v1.0
就可以打上标签了。
git tag
命令也可以查看所有标签,标签按字母顺序列出。
如果要对之前的 commit 打标签,则加上id号
还可以创建带有说明的标签,-m
git tag -s <tagname> -m "blablabla..."
可以用PGP签名标签;
git branch master
git tag v1.0
git tag
git tag v1.0 commit id
$ git tag -a v0.1 -m "version 0.1 released" 3628164
删除标签
git tag -d v1.0
将标签推送到远程
git push origin v1.0
或者一次惟性推送所有未推送的标签
git push origin --tags
删除远程标签,先删本地,再删远程
git tag -d v1.0
git push origin :refs/tags/v1.0
忽略特殊文件
在看 github 的项目时,经常看到 .gitignore
文件,这个文件就是记录让Git 不要追踪的文件名的。
有些时候,你必须把某些文件放到 Git 仓库中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等
每次 git status
都会显示 Untracked files ...
,又会非常的烦,且不方便。
在 Git 工作区的根目录下创建一个特殊的 .gitignore
文件,然后把要忽略的文件名,文件夹名填进去,Git就会自动忽略这些文件。
不需要从头写 .gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
当你想提交某个文件,发现该文件被忽略时,还要以用以下命令查看,是 .gitignore
文件中的哪段代码把该文件忽略了,再云把它删除
git check-ignore read.txt
配置别名
即把命令设置简写,类似快捷键。让你更骚地操作 git 。
git config --global alias.st status
用 st
代替 status
如果配置错了,或者想修改。在用户主目录下的一个隐藏文件 .gitconfig
中
以下是常用的替代:co = checkout,ci = commit,br = branch,st = status,unstage = git reset HEAD
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'git reset HEAD'
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 config --global user.name "Your Name"
设定邮箱:git config --global user.email "email@example.com"
把文件添加到暂存区:git add
把暂存区中的文件提交到当前分支:git commit -m "说明"
查看当前仓库状态(是否有文件修改,是否有文件 add ,但没 commit):git status
查看具体的修改内容:git diff
查看提交日志:git log
查看每一次修改的id:git reflog
恢复到某一个版本:git reset
放弃工作区的修改:git checkout -- file
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
在电脑上生成 ssh key :ssh-keygen -t rsa -C "qq@qq.com"
连接远程库:git remote add origin git@github.com:oeeo/banner.git
查看远程库信息,使用:git remote -v
推送到远程库(origin是远程库的名字):git push origin branch-name
提交冲突时,抓取远程库的内容:git pull
在本地创建和远程分支对应的分支:git checkout -b branch-name origin/branch-name
建立本地分支和远程分支的关联:git branch --set-upstream branch-name origin/branch-name
克隆远程库到本地:git clone git@github.com:oeeo/Baidu_ife.git
保存工作现场:git stash
恢复工作现场:git stash pop
标签管理:git tag
忽略特殊文件:配置 .gitignore
文件
创建命令快捷键:git config --global alias.st status