学习git使用(一)

创建版本库、时光穿梭机

Posted by 周自横 on February 27, 2020

创建版本库

  1. 在文件夹下使用命令git init,将会在文件夹下多出来一个.git的文件夹
  2. 在此文件夹下创建文件,例如自述文件readme.md
  3. 将文件添加到仓库git add readme.md
  4. 将文件提交到仓库git commit -m "提交说明"

时光穿梭机

版本退回

  1. 使用git log查看历史版本信息,可以得到从近到远的提交日志。

    太眼花缭乱的话可以在后面加上git log --pretty=oneline

    其中commit xxxxxxxxxxxx一串数字和字母是版本号

  2. git中,HEAD表示当前版本,由^个数表示上几个版本,HEAD^^表示上上个版本,过多的话使用HEAD~100表示上100个版本

  3. 使用命令git reset --hard HEAD^退回到上一个版本,也可以使用版本号进行退回,将HEAD^改为版本号的前面几位就可以,不固定位数,git会自己查

  4. 在退回之前版本之后,重新检查版本信息就没了你退到此版本之后的版本信息了

  5. 若是之前版本号还有的话,可以直接使用版本号回去,若是没有版本号,使用git reflog可以查询历史每一次命令,就可以见到命令位置前面的版本号了,表示的是此命令得到结果的版本号

git log命令可以查到对版本库的历史信息,但是若是你退回到了之前的版本之后,该命令不会再显示之后版本库信息。

git reflog则是会查询所有的历史命令,并在每一行之前标注此行所在的版本库id,通过此版本号,可以重新找回丢失的版本信息

工作区与暂存区

工作区是指当前这个目录,我们能看到的文件夹,版本库是指.git隐藏文件,不属于工作区,是git的版本库,其中最重要的是stage或者是index的暂存区,还有git为我们创建的第一个分支master,以及指向master的一个指针叫做HEAD

  1. 对之前文件进行修改,并创建一个新的文件之后。使用git status查看状态,显示情况为:

    提示对于提交的文件没有暂存的修改,可以使用add提交到暂存,也可以使用checkout放弃,红字是文件名。未跟踪的文件,有LICENSE

  2. 使用git add提交两个文件,是将文件修改添加到暂存区,,重新使用git status查看状态

    显示更改没有被提交

  3. git commit是将暂存区的文件提交到当前分支。再次查看状态,显示

    暂存区没有任何内容了

管理修改

git的管理修改是指,只对使用add提交在暂存区的修改就行管理。若是修改完之后提交到了暂存区,然后再次对文件进行修改之后,没有提交暂存,而是直接提交到了分支,查看当前状态会告诉你当前又修改没有提交到暂存区。使用git diff HEAD -- readme.md此命令是查看工作区与暂存区的区别,会发现显示

image-20200228113151836

若是将修改的也提交暂存再提交到分支,重新查询之后显示

撤销修改

  1. 对文件修改过了,未提交到了暂存区。此时想删除修改,使用git checkout -- readme.md将修改的文件内容去掉,工作区修改的内容就没有了,此命令将工作区的内容,撤销到最近一次的git commit或者git add

  2. 若是对文件进行了修改,提交到了暂存区,还未提交到分支。

    使用git reset HEAD readme.md,把暂存区的修改撤回到工作区,此时工作区有修改,暂存区是干净的。

删除文件

  1. 对工作区的文件进行了直接的删除或是在git中使用rm <file>删除了文件,查看git状态,可显示

    显示test.txt文件已经被删除了,但是版本库中还保存的有

  2. 若是想在版本库中也进行删除,使用git rm <file>,此步表示你将工作区的删除提交到了暂存区中,此时这个命令与git add的作用相同,并且提交到分支的版本库中git commit,显示为

    可以看到在提交版本库之后,是不能再指定恢复单个文件的,但是仍然可以通过回复版本库的形式完成对文件的恢复。

  3. 若是想完成对文件的恢复,可以使用git checkout -- <file>使用版本库里的指定文件版本替换工作区的版本。可以恢复单个文件

    若是只有删除文件,也可以查询版本号,通过退回到指定的版本库,实现版本库对工作区的更改。git reset --hard xxxx注意恢复的是指定的某个版本库

若是将文件提交到版本库中,你不需要担心误删,能将文件恢复到最新的版本库版本,也就是说,这样你会丢失,最新提交之后到删除之间,进行修改的内容

远程仓库

添加远程仓库

  1. 在电脑用户目录里有.ssh文件夹,先cd到达该文件夹,否则会在当前目录直接创建

  2. 创建密钥对。$ ssh-keygen -t rsa -C "aaa",其中aaa是名称??常见使用的 是自己的邮箱。

    Enter file in which to save the key需要你为密钥对创建一个名字,若是直接回车创建的默认名字为id_rsa,接着会让输入两次密码,然后生成私钥(不可泄漏)和公钥.pub

  3. 登录GitHub,在账户设置里找到SSH,将公钥的内容添加进去就可以了

从远程仓库克隆

git clone git@XXXXXXclone之后的是需要克隆仓库的SSH协议地址

分支管理

分支的作用是保持当前的内容不变,在此基础上创建分支进行操作,此时主分支的提交点并没有改变,达到一定效果将分支与主分支进行合并。

创建分支与合并分支

在git中,主分支为master分支(习惯把它作为主分支,也可以把其他的作为)。HEAD严格来说并不是指向提交而是指向mastermaster才是指向提交,HEAD指向的就是当前分支

  1. 创建并切换分支。git checkout -b xxx=git branch xxx创建分支git checkout xxx切换分支。因为git checkout -- <file>命令是撤销文件可能会引起歧义,所以使用git switch -c xxx表示创建并切换分支=git branch xxx创建分支git switch xxx切换分支

  2. 使用git branch不加分支名称,表示的是查看所有分支,当前分支会在名称前加上一个*

    git merge xxxxxx为需要合并的分支,将它合并到主分支上

    然后删除dev分支,使用git branch -d xxx完成

解决冲突

如果对同一段内容在不同的分支上进行了不同的修改,提交到分支版本之后然后进行合并,会显示

提示内容为:自动合并文件,冲突(内容)为在文件中合并冲突了,自动合并失败请修改冲突再提交

查看当前状态会显示

image-20200229115356292

在主分支上,有未合并的路径,(修复冲突并运行“git Commit”)(使用“git Merge–Abort”中止合并),取消合并路径:(使用“git add<file>.” 标记解决方案)

查看当前文件内容cat <file>

其中标记处了不同分支的内容,(但是)

修改之后重新进行提交,合并成功

使用log查看历史版本信息,加上参数--graph可显示图谱,分支合并的情况,加上参数--abbrev-commit可将版本号只显示前几位,加上参数--pretty=oneline可以只显示简略历史版本信息。

分支管理策略

通常合并使用的是Fast forward模式,但是这种模式下,删除分支之后会丢失分支消息。如第一条历史记录所示,该条是在dev分支提交之后,然后合并的,已经看不到分叉的显示。

如果要强制禁用此模式,git就会在合并时生成一个新的提交(commit),这样就可以看出分支信息。git merge --no-ff -m "xxxxx" dev,因为生成新的commit,所以需要-m xxxx给出提交的信息,此时可以看到在历史记录的第三条显示着在其他分支提交之后,然后再一次的合并到主分支上了,并且将这一次的合并作为一个提交记录下来。

Bug分支

每个bug通过新的临时分支来修复,修复之后合并分支,再将临时分支删除。