Git笔记整理

GitHub的创始人是Linus,使用C语言编写,也是最初的Linux开发发起人。

集中式和分布式的版本控制不同

    集中式:版本库是放在中央服务器中的,工作的时候要从服务器取得最新版本之后才开始工作,工作完之后,在提交的中央服务器。必须要有网络。

    分布式: 没有中央控制系统,每个人的电脑都有完整的版本库,中央服务器只有来大家交换修改的文件,

    git在不同系统上的安装,自行百度。(我现在觉得Kali 系统做的越来越好了,之前在物理机上安装的时候兼容性不是很好) 

   git - config 命令的 --config 参数,表示这台机器上的所有的仓库都使用这个配置,当然也可以对某个仓库指定不同的用户名和Email

  创建一个空的仓库 我实在 opt目录下创建了一个叫做learnGit的仓库   (pwd是用来显示当前的目录) 注:创建完后当前目录下生成一个 .git文件   通过命令:ls -ah 可以查看隐藏文件

注:Git只能跟踪文本文件的控制,没有办法控制图像视频文件。另外一点 Word文件时Microsoft的一种二进制文件,因此没有办法跟踪Word上的改动文件。这里也不推荐使用记事本来写代码,最好使用notepad++(默认编码设置是UTF-8.)

将新建的文本添加到仓库中:  使用 git add 提交文件  ,使用  git commit -m "备注“”  提交的跟踪信息  

git  status 命令可以帮助我们时刻掌握仓库当前的状态, 下载我们先将readme文件修改 ,然后使用该命令  git status (这个命令跟 linux 下 service status  类似)

上面的显示 readme文件修改了但是没有提交  ,如果我们不知道修改了什么地方 可以使用git diff 来查看修改的地方

可以看我们之前添加了一行,知道修改了之后我们就就将它提交一遍(为了放心,我们在 git commit之前再次  git status一下)

最后提交 备注一下

可以使用  git log 命令查看版本的历史记录

 

现在来看斑斑的回退  使用命令  git reset   -- hard  参数   (在 Git 很重 HEAD 表示当前的版本, 上一个版本是 HEAD^  ,上上一个版本是 HEAD^^ ,如果回退的较多可以写成这样  HEAD ~100 表示第一百个版本)

使用 git log 看看,发现之前的一个记录没有了,

 如果想撤销之前的操作,不要关闭窗口,继续 git reset --hard 加上前面的 一串记录数据

git 提供了一个记录每次使用命令 命令 :   git reflog

总结   使用 git 回退版本  使用命令  :   git reset --hard commit_id

git的目录理解:

   工作区: 就是我们刚才建立的一个文件 leanGit。在之前我们创建仓库的时候就产生了一个  .git 文件, 他是git的版本控制文件, git版本仓库中有很多东西,其中最重要的是称为stage的暂存区,还有git创建的第一个master,以及master的一个指针 HEAD,(这里我使用廖老师的图)

在前面回顾一下  : 把文件添加到仓库分成了两步:第一步第 使用 git  add 把文件添加进去I(实际上是将文件修改添加到暂存区)--------第二步git commit  将暂存区的所有文件添加到当前分支,因为我们在git版本库的时候创建了唯一的一个master分支,所以 git commit就是往 master分支上提交更改。具体的提交变换工程图解

git管理的是修改,而不是文件 ,为了说明这个做一个实验:

首先对readme问价添加一行 ,然后将他添加到仓库暂存区 ,查看

可以看到gitcommit 只负责对暂存区的修改,

 所以再次提交之后才会看到结果,更新

 

如何撤销修改:在文件提交的的时候发现,文件出现错误,为了及时修改,git提示使用 git checkout -- file 可以丢弃修改工作区的修改。

   廖雪峰说 一种是 readme自自改之后还没有放到暂存取,现在撤销修改就回到和版本库一模一样的状态,一种是readme已经次该添加到暂存区后,又做了修改,撤销修改就回到添加暂存区后的状态,总之就是让这个文件回到最近一次  gitcommit或者 git add的状态 。

下面的 使用 git commit 之后使用 git checkout  但是发现一旦使用 该命令 就不能撤销,只能使用 git reset -- hard HEAD参数来进行版本的回退

root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
 git is free software
   tianyaming
    add a new line
        add a new line "  my boss is stupid"
root@kali:/opt/learnGit# git commit -m "have use the git checkout"

[master 26aa3fd] have use the git checkout
 1 file changed, 1 insertion(+)
root@kali:/opt/learnGit#
root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
 git is free software
   tianyaming
    add a new line
        add a new line "  my boss is stupid"
root@kali:/opt/learnGit# git checkout -- readme.txt
root@kali:/opt/learnGit# cat readme.txt
readme here
learn github git is a version control system
 git is free software
   tianyaming
    add a new line
        add a new line "  my boss is stupid"
root@kali:/opt/learnGit#
如果使用了git add提交了暂存区,庆幸的是你么有使用commit提交  ,可以使用 git reset HEAD 《file》来回退  之后在使用 git checkout清除工作区

来一个总结  ,场景一:当你改乱了工作区的某哟个内容,想直接丢掉工作区使用   git checkout -- file    ,场景二:当你改乱了某一个文件的内容,还添加到了暂存区,想丢弃修改,第一步使用 git reset HEAD  file 回到场景一 ,之后在使用 git checkout --file 丢掉

git 中还有一种操作就是删除文件:

先添加一个新的文件   test.txt  之后使用 git add   、git  commit 提交 到版本控制库

之后使用rm 命令删除文件  test ,删除之后版本库中的并没有删除,所以使用  命令   git rm test 删除版本库 之后使用 git commit 提交版本库  (注:git checkout 的作用就是用版本库替换工作区版本)

远程仓库的操作

 首先就是在本地使用ssh创建密钥对,  才用户仓库目录下面看看,有没有 .ssh 目录  ,如果有在看下面有木有id_rsa和 id_rsa.pub两个文件,如果存在直接跳转下一步

 

使用 ssh 创建 邮箱GitHub账户的秘钥对  命令:  ssh-keygen -t rsa -C " 1214tian@sina.com"   之后会在用户占下面产生秘钥对,复制 公钥到GitHub上

现在我们需要将我们的本地仓库和GitHub上的仓库关联起来,首先登陆GitHub账户创建以个git仓库 learnGit

现在将本地仓库关联到GitHub上,使用命令:   git remote add origin git@github.com:SueKayTian/learnGit.git

关联之后将本地仓库的文件全部推送的远程GitHub上 使用命令  :   git push -u origin master

本地内容推送到远程,实际上是将当前分支master推送到远程, 由于远程是空的,我们第一次推送的master的时候,加上了参数 -u, 这样GIt 不但会将本地的master分支内容推送到远程master分支,还会将本地的master和远程的master关联起来,在以后的推送和拉取中简化命令

第一次关联后推送的时候会弹出SSH警告 ,在这之后只要本地做了提交就可以使用  git  push origin master 来推送

  分支管理:

  创建一个分支使用命令:   git checkout -b (分支名字)

git checkout 命令后面加上-b 参数表示创建并切换,相当于下面的命令  :

 git branch dev

git checkout dev

之后使用git branch命令查看列出所有分支,当前的分支结构后面会显示一个 * 

那么如何将 dev 的工作合并到master上面, 下面使用命令 将 dev 合并到master 分支上面,  git merge命令用于价格制定分支合并到当前分支下面,  合并之后就可以放心的删除之前的 Dev 分支

小结:

   查看分支 使用命令:  git  branch

  创建分支:  git branch <name>

  切换分支:  git  checkout <name>

 创建加上切换分支 : git checkout -b <nmae>

  合并分支  : git merge <name>

  删除分支 : git branch -d <name>

解决冲突问题: 其实很多时候在合并的时候会出现冲突,该如何解决了  ?

首先我们创建一个分支并迁移到当前分支之下, 

git  自动提示我们当前master分支比远程的master分支超前一个提交。这时我们在当前master分支下修改 readme文件 ,现在 master和 featurel上都有了自己的型的提交。

这种情况下git无法进行快速的会合并,只能视图将各自的修改合并,但是会出现冲突

 当git无法自动合并分支的时候 ,就必须首先解决冲突问题,提提交在合并。结局冲突的办法就是使用手动编辑的方法合并成我们想要的内容,再次提交  可以使用  命令 git log --graph 查看分支合并图

 通常合并分支时,会丢掉分支信息,如果可能Git 使用 fast forward模式,但是在这种模式下,删除分支之后,要强制禁止使用Fast foward模式, Git就会在merge时生成一个新的commit,,这样 从分支历史上就可以看出分支信息

 下面使用 --no-ff 方式的git merge 测试

首先创建并切换到 Dev分支下面:   使用命令 : git checkout -b dev 

之后修改 readme文件 并提交到当前分支下,

合并的时候命令:   git merge --no-ff -m "merge with no-ff "dev   

之后使用日志记录来查看修改的历史 : 使用吗命令: git log --graph --pretty=oneline --abbrev-commit

在实际的开发中,我们应该按照几个基本的原则进行分支管理,首先master是非常稳健的分支,仅仅能用来发布新的版本,平时干活的时候不能再上面干活。干活都是在类似Dev的分支上开发,之后再将Dev版本合并发哦master分支上面。每个人都有自己的分支,时不时合并到Dev分支上面。

 bug 如何修复,

当你接到一个代号为010的bug任务的时候,很自然的你会想创建一个issue-010来修复,但是如果当前正在Dev上进行的工作还没有提交,这个时候可以利用 stash功能,可以将当前的工作线程隐藏起来,等到以后恢复现场后继续工作。

使用 命令 : git stash 

Feature功能
在软件开的过程中总有很多功能会不断地被添加进来 ,添加一个新的功能的时候因为不希望一些实验性质的代码,把主分支搞乱了,所以,每添加一个新的 功能,最好新建有个feature分支,在上面开发,完成后,再进行合并,最后删除feature分支,

原文地址:https://www.cnblogs.com/xinxianquan/p/10989828.html