git(一) 基础


       git是开源的分布式文件管理系统,具有最优的存储能力、非凡的性能、开源的、很容易做备份、支持离线操作、很容易定制工作流程等优点。在Git的基础上衍生出GitHub和GitLab这两个非常流行的代码托管平台,很多公司包括阿里云、去哪儿、携程等都在GitLab平台的基础上做自己的二次开发。
中文文档地址为https://git-scm.com/book/zh/v2,内容非常好,包含介绍、安装等。

1. 初始配置

在这里插入图片描述

1.1 安装配置

git --version
git config --global user.name yushengjun
git config --global user.email xxx@163.com
git config --global list 查看global下git的所有配置

建Git仓库:

  1. 把已有的项目代码纳入Git管理
    进入项目代码所在的文件夹,git init
  2. 新建的项目直接用Git管理
    git init your_project 会在当前路径下创建和项目名称同名的文件夹

1.2 基本命令

Git命令 描述
git add readme.txt 从工作区添加到暂存区
git commit readme.txt -m ‘add readme.txt’ 将暂存区的改变提交到本地仓库
git mv readme.txt readme.md 重命名文件,然后提交即可
git rm readme.txt readme.md 从工作区和暂存区删除文件,然后提交即可
git status 查看本地文件的状态(是否纳入管理,是否提交,是否修改等)
git log 查看本地提交历史
git log --oneline --all -n4 --graph oneline简略显示提交历史,all查看所有分支 ,n4最近4次的提交历史 graph 图形化查看
gitk --all 打开图形化工具
git checkout -b temp 732b217 从732b217 创建temp分支
git branch -d test 删除test分支,注意要在别的分支下去删除test ;如果报错且确定可删除改为 -D(会忽略test分支某些更改还没merge到其他分支的情况)
git branch -av 查看所有分支详细情况 带有*的表示是当前所在分支

1.3 Git对象间的关系

在这里插入图片描述
       每次提交,会生成一个commit对象指向一个tree对象(我理解tree是提交时所有文件的一个快照);tree按文件夹的结构来排列,每个文件夹又是一个tree,每个文件指向一个blob对象;注意blob对象和文件并不完全等价,Git认为即使文件名不同只要文件内容相同就是同一个blob,这样节省了存储空间。

2. 常用操作

2.1 HEAD

会指向当前的分支 或者最新的提交
分离头指针 指的是操作没有关联任何一个commit。

2.2 修改提交信息

git commit --amend 修改最近一次提交的message 会打开一个文档让你修改

那么如何修改之前某次提交的message呢?
git commit -i 77de453e 修改77de453e 之后的修改信息。把要修改的某次的提交的pick改为r保存,然后在弹出的对话框中修改提交message即可。

```
pick 08c4cfa add index and
pick 988098e update readme
pick 8dc72e1 mv readme.md
pick 3f79e47 delete

# Rebase dde6fb8..f3482f6 onto dde6fb8 (5 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
```

如何将多次提交合并为一次提交呢?
同样的git commit -i 77de453e 使用s(use commit, but meld into previous commit)。注意要使用想要合并的提交的上一次提交。
可以合并连续的commit,也可以合并不连续的commit

2.3 比较工作区、暂存区、本地仓库之间的差异

git diff --cached 比较暂存区和本地仓库之间的差异(因此文件必须先加到暂存区)
git diff 是比较工作区和暂存区之间的差异,亦可以要比较的指定文件
git diff temp master -- 1.txt 比较1.txt这个文件temp分支和master分支最新一次提交之间的差异。其实这里分支也指向提交,所以我们也可以比较不同commit之间的差异(换成commit的唯一标识值即可)。
git diff HEAD HEAD~2 -- 1.txt 比较1.txt和前两次提交时的不同

2.4 如何恢复暂存区和工作区的改变,甚至已经commit的内容?

  • 我们有时把文件加到暂存区后又想取消这次变更,怎么办呢?
    git reset head -- 2.txt 1.txt 把2.txt和1.txt恢复成head,也可以不指定文件即复原所有文件

  • 同样的如果我们想恢复工作区的内容和暂存区一样,怎么操作呢?
    git checkout 3.txt 恢复3.txt的内容和暂存区一样

简单总结就是:恢复暂存区使用reset命令,恢复工作区内容使用checkout(注意这个命令比较危险,会丢失你在工作区做的变更!!)。而 git reset --hard HEAD 则就是将暂存区和工作区都恢复成最新一次提交的内容,这个比较常用

  • 如果进一步想消除最近的几次提交,即恢复本地仓库的内容到之前的某个版本该怎么办呢?
    git reset --hard 44f921d 恢复到44f921d 提交时的内容,此时head指针就会指向此次commit,44f921d 提交之后的提交都会消失,并且暂存区和工作区的内容都会复原。因此此命令是相当危险的!

2.5 临时加塞紧急任务怎么办

我们正在开发中,突然来了bug要修复,但是当前的变更又不想丢弃,这时可以先保存起来。
git stash : stash会将变更添加到一个栈里,可以使用git stash list来查看。

如果临时任务提交完又要回头来开发怎么办?
这时可以使用git stash pop 或者git stash apply。这两个的区别就是pop 是会弹出并删除栈中的保存记录,apply只会取出保存的记录而不会删除。

2.6 如何指定git忽略文件

在.gitignore 文件中
doc 指的是忽略doc文件或者doc文件夹下的内容
doc/ 指的是忽略doc文件夹下的内容 ,而不忽略doc文件

在window下需要先创建一个文件如1.txt,然后 ren 1.txt .ignore 来生成.ignore 文件。

2.7 如何备份仓库

从本地仓库,github,gitlab上复制仓库的方法为:
git clone /user/git_learning 使用哑协议,传输速度不可见,且相较于智能协议更慢。
git clone file:///user/git_learning 使用智能协议 传输速度可见,更快。

http、https、ssh都是使用的智能协议。

原文地址:https://www.cnblogs.com/seasail/p/12179359.html