Git简介

 git是目前流行的分布式版本管理系统。它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行,所以在断网的情况下仍然可以提交代码,切换分支。git又使用了SHA-1哈希算法确保了在文件传输时变得不完整、磁盘损坏导致数据丢失时能立即察觉到。

git的基本工作流程:

git_status

三种状态:

Git 有三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。                                                                                 已提交表示数据已经安全的保存在版本库中。                                                                                                                               已修改表示修改了文件,但还没保存到版本库中。                                                                                                                         已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

三个工作区域:

工作区(work directory)一般就是我们项目的根目录。我们在为项目添加本地库之后,会在工作区生成一个隐藏目录 ".git",这个不算工作区,这个.git目录即为当前工作区的本地版本库。

版本库(repository)是 Git 用来保存项目的元数据和对象数据库的地方。运行 git commit 命令后文件保存的区域,记录了某次提交的完整状态和内容,文件将永久版保存到版本库中。在创建版本库的时候默认都会有一个主分支(Master)以及指向Master的一个指针叫HEAD。文件的提交的最终存储位置是分支(Branch)。

暂存区域(stage)是一个文件,保存了下次将提交的文件列表信息,运行 git add 命令后文件保存的区域。 有时候也被称作‘索引’,不过一般说法还是叫暂存区域。

Git 工作流程:

  1. 在工作区中修改文件。
  2. 暂存文件,将文件的快照放入暂存区。
  3. 提交更新,找到暂存区的文件,将快照永久性存储到 Git 版本库。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础一章,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。
 

基础操作

1.创建 Git 版本库

在本地创建 Git 版本库,需要使用 git init 命令。

首先,你需要新建一个存放版本库的目录,然后进入到该目录所在路径,然后执行:

git init

 

或者也可以直接在要上传的文件所在目录,鼠标右键,选择 Git Bash Here。

然后查看目录结构中的隐藏文件,就可以看到包含有 .git 子目录,这就说明创建版本库成功了。

2.将文件纳入到版本库

要将一个文件纳入到版本库管理,首先要将其添加到暂存区,然后才能提交到版本库中。

1. 使用 git add 命令将文件添加到暂存区

git add readme.txt   # 添加单个文件到暂存区
git add .          # 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外

 

注意:空文件夹是不会被添加到暂存区中的。

2. 显示工作目录和暂存区的状态

git status
git status -s 
# git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出

 

 当暂存区没有任何文件时:

执行 git add readme.txt 后:

修改 readme.txt 后再查看状态:

如果想要保存这次修改,再次将其添加到暂存区即可:

如果想要放弃这次修改,可以使用 git checkout -- readme.txt 命令,文件将回退到暂存区中的版本。

3. 移除暂存区中的文件

git rm readme.txt --cached  # 仅仅删除暂存区里的文件
git rm -f readme.txt    # 删除暂存区和工作区的文件
git rm -r classes --cached # 删除classes文件夹 --cached不会把本地的classes 删除

 

4. 将暂存区中的文件,提交到版本库中

git commit    # 如果暂存区有文件,则将其中的所有文件提交到仓库
git commit -m 'your comments'    # 带评论提交,用于说明提交内容、变更、作用等

 

当把文件提交到版本库中后,用 git status 命令查看:

 

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

 如果我们再次对文件做修改,然后执行 git statsu 命令查看:

Git列出了有改动的文件,并建议将其添加到暂存区。

 可以使用 git diff 命令查看具体修改了哪些内容。

 

5. 查看仓库中的具体修改

git diff     # 查看版本库中所有的改动
git diff readme.txt    # 查看具体文件的改动
git diff HEAD -- readme.txt    # 查看工作区和版本库里面最新版本的区别

 

6. 查看提交历史记录

git log     # 显示所有提交的历史记录
git log --pretty=oneline    # 单行显示提交历史记录的内容

 

在 git log 的输出内容中,可以看到每次提交的 commit_id,是一个 40 位的字符串。

 

7. 版本回退

有了git log 命令来查看提交的历史记录,我们就可以回退到我们需要的特定版本。

git reset --hard HEAD^        # 回退到上一个提交版本
git reset --hard HEAD^^        # 回退到上上一个提交版本
git reset --soft 'commit_id'    # 仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --mixed 'commit_id'    # 仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --hard 'commit_id'    # 彻底将工作区、暂存区和版本库记录恢复到指定的版本库

 

8. 回到未来的某个提交

当退回到某个提交的版本以后,再通过 git log 是无法显示在这之后的提交信息的。但是,通过 git reflog 可以获取到操作命令的历史。

因此,想要回到未来的某个提交,先通过 git reflog 从历史命令中找到想要回到的提交版本的 ID,然后通过 git reset --hard 来切换。

git reflog
git reset --hard 'commit_id'

 

9. 删除文件 

直接在文件管理器中把没用的文件删了,或者用rm命令删了。

rm readme.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

使用 git commit 命令确认从版本库中删除该文件:

 现在,文件就从版本库中被删除了。

如果是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- readme.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

 

分支管理

Git 分支

  • 主分支
    • master分支:存放随时可供生产环境中的部署的代码
    • develop分支:存放当前最新开发成果的分支,当代码足够稳定时可以合并到master分支上去。
  • 辅助分支
    • feature分支:开发新功能使用,最终合并到develop分支或抛弃掉
    • release分支:做小的缺陷修正、准备发布版本所需的各项说明信息
    • hotfix分支:代码的紧急修复工作

 

1.查看分支

注意:在 git branch 的输出内容中,有一个分支,前面带有 * 号,这标识我们当前所在的分支。

git branch        # 查看本地分支信息
git branch -v      # 查看相对详细的本地分支信息
git branch -av      # 查看包括远程仓库在内的分支信息

 

2.创建分支

当我们要修复一个 Bug,或者开发一个新特性,甚至是在初学的时候怕打乱原来的代码,都可以新建一个分支来避免对原来代码的影响。

git branch dev   # 新建一个名称为 dev 的分支

 

3.切换分支

当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。

git checkout dev   # 新建完 dev 分支以后,通过该命令切换到 dev 分支

 

4.创建并切换分支

git checkout -b dev   # 新建 dev 分支,并切换到该分支上

 

5.合并分支

当我们修复完成一个 Bug,或者开发完成一个新特性,我们就会把相关的 Bug 或者 特性的上修改合并回原来的主分支上,这时候就需要 git merge 来做分支的合并。

git checkout master        # 首先需要切换回最终要合并到的分支,例如 master 分支
git merge dev           # 将 dev 分钟中的修改合并回 master 分支

 

6.删除分支

当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。

git branch -d dev   # 删除 dev 分支

 

利用Git生成本机SSH Key并添加到GitHub中

本地仓库和github之间是通过SSH加密传输的,所以需要先到github中添加你本机的SSH Key 进行认证。

1.在桌面打开git命令窗口

2. 检查是否存在SSH Key

1、输入:cd ~/.ssh
2、再输入:ls 或者 ll
# 看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key

 在这里插入图片描述

3. 如果不存在则需要我们手动生成一个

ssh-keygen -t rsa -C "youremail@example.com"

输入id_rsa,再按回车。

紧接着需要做一些配置,嫌麻烦可按三次回车键,默认配置密码为空

成功后会生成如下图两个文件

 

 

 生成的公钥在id_rsa.pub里面。

 

4. 配置全局name 和email

git config --global user.name "your_account"

git config –-global user.email "youremail@example.com"

 

5. 获取SSH Key

cat id_rsa.pub
# 拷贝秘钥 ssh-rsa开头

 

或者也可以去C盘下,找到.ssh文件夹,复制里面id_rsa.pub文件中的内容

在这里插入图片描述

6. 测试是否成功配置SSH Key

ssh -T git@github.com
# 运行结果出现类似如下
Hi XXX! You've successfully authenticated, but GitHub does not provide shell access.

 

第一次可能会出现 The authenticity of host 'github.com (xxx.xx.xxx.x)' can't be established 的报错信息 ,输入 yes 即可。

7. 最后在 Github 上点击增加新的ssh key,粘贴进去即可搞定。

 

Github 远程仓库

1. 新建远程仓库

2. 从远程仓库克隆

如果你本地没有仓库,希望从已有的远程仓库上复制一份代码,那么你需要 git clone。

git clone FuYingju@github.com/git/git.git     # 通过 ssh 协议,克隆 Github 上 git 仓库的源码
git clone https://github.com/git/git.git     # 通过 https 协议,克隆 Github 上 git 仓库的源码

 

3. 关联远程仓库

如果你已经有了一个本地仓库,如之前创建的 git-guide,然后你打算将它发布到远程,供其他人协作。

git remote add origin git@github.com:yourName/yourRepo.git   # 为本地仓库添加远程仓库

如果报错:

fatal: remote origin already exists.(报错远程起源已经存在。)

 解决办法:

1、先输入 git remote rm origin
2、再输入 git remote add origin git@github.com:yourName/yourRepo.git

 

4. 推送本地的内容到远程仓库

当本地仓库中,代码完成提交,就需要将代码等推送到远程仓库,这样其他协作人员可以从远程仓库同步内容。

git push -u origin master // 第一次推送时使用,可以简化后面的推送或者拉取命令使用
git push origin master    // 将本地 master 分支推送到 origin 远程分支

 

注意:git push -u origin master,第一次使用时,带上 -u 参数,在将本地的 master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。

如果报错:

! [rejected] master -> master (non-fast-forward)

 

 解决办法: 

1、git pull origin master --allow-unrelated-histories  # 把远程仓库和本地同步,消除差异
2、重新add和commit相应文件
3、git push origin master

 

5. 从远程仓库获取最新内容

在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。

git fetch origin master    
git pull origin master

 

git fetch和 git pull之间的区别:

  • git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。
  • git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge。

注意:建议多使用 git fetch。

6. 查看远程仓库信息

git remote -v // 显示远程仓库信息

 

7. 建立本地分支和远程分支的关联

在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。

有的时候,我们会需要指定本地分支与远程分支的关联。

git branch --set-upstream 'local_branch' origin/remote_branch

 

8. 修改本地仓库对应的远程仓库地址

当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在工程迁移过程中。

git remote set-url origin url

 

标签管理

在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。

1. 创建标签

git tag -a 'tagname' -m 'comment' 'commit_id'

-a 参数指定标签名, -m 添加备注信息, 'commit_id' 指定打标签的提交。

 

2. 查看所有标签

git tag   # 查看本地仓库中的所有标签

 

3. 查看具体标签信息

git show tagname

 

4. 删除本地标签

如果打的标签出错,或者不在需要某个标签,则可以删除它。

git tag -d tagname

 

5. 删除远程标签

git push origin :refs/tags/tagname

git push origin --delete tagname

git push origin :tagname

 

6. 推送标签到远程仓库

打完标签以后,有需要推送到远程仓库。

①推送单个标签到远程仓库。

git push origin tagname

②一次性推送所有标签到远程仓库。

git push origin --tags

 

进阶操作

1. 临时保存修改

在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。如git pull, git merge等等,如果有未提交的修改,这些将无法操作。

但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到git stash。

①临时保存修改,这样仓库就可以回到 clean 状态

git stash   # 保存本地仓库中的临时修改。

注意:可以多次的 git stash 来保存不同的临时修改

 

2.查看临时保存

git stash list   # 显示所有临时修改

 

3.恢复临时保存的修改

git stash apply        # 恢复所有保存的临时修改
git stash pop        # 恢复最近一次保存的临时修改

 

4.丢弃所有保存的临时修改

git stash clear   # 丢弃所有保存的临时修改

 

posted on 2019-07-16 17:38  FuYingju  阅读(74)  评论(0编辑  收藏  举报