Dean Front-end Dev Engineer

Git 入门教程

2018-02-12
Git

简介

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 commitgit 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 stashgit 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

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

当你想提交某个文件,发现该文件被忽略时,还要以用以下命令查看,是 .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


下一篇 Liunx常用命令

Comments

Content