timelessover/blog

Git总结

Opened this issue · 0 comments

集中式与分布式

Git 属于分布式版本控制系统,而 SVN 属于集中式。

集中式:

central-repo

分布式:

distributed-repo

优缺点:

  • 集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。

  • 集中式版本控制有安全性问题,当中心服务器挂了所有人都没办法工作了。

  • 集中式版本控制需要连网才能工作,如果网速过慢,那么提交一个文件会慢的无法让人忍受。而分布式版本控制不需要连网就能工作。

  • 分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。

中心服务器

中心服务器用来交换每个用户的修改,没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。

工作流

新建一个仓库之后,当前目录就成为了工作区,工作区下有一个隐藏目录 .git,它属于 Git 的版本库。

Git 的版本库有一个称为 Stage 的暂存区以及最后的 History 版本库,History 存储所有分支信息,使用一个 HEAD 指针指向当前分支。

img

  • git add files 把文件的修改添加到暂存区
  • git commit 把暂存区的修改提交到当前分支,提交之后暂存区就被清空了
  • git reset -- files 使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files
  • git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改

img

可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。

  • git commit -a 直接把所有文件的修改添加到暂存区然后执行提交
  • git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作

img

冲突

当两个分支都对同一个文件的同一行进行了修改,在分支合并时就会产生冲突。

Git 会使用 <<<<<<< ,======= ,>>>>>>> 标记出不同分支的内容,只需要把不同分支中冲突部分修改成一样就能解决冲突。

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Fast forward

"快进式合并"(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。

可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。

$ git merge --no-ff -m "merge with no-ff" dev

分支管理策略

master 分支应该是非常稳定的,只用来发布新版本;

日常开发在开发分支 dev 上进行。

SSH 实现远程登陆

Git 仓库和 Github 中心仓库之间的传输是通过 SSH 加密。

如果工作区下没有 .ssh 目录,或者该目录下没有 id_rsa 和 id_rsa.pub 这两个文件,可以通过以下命令来创建 SSH Key:

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

然后把公钥 id_rsa.pub 的内容复制到 Github "Account settings" 的 SSH Keys 中。

.gitignore 文件

忽略以下文件:

  • node_modules文件夹
  • 不需要上传到服务器的本地测试文件
  • 自己的敏感信息,比如存放口令的配置文件

不需要全部自己编写,可以到 https://github.com/github/gitignore 中进行查询。

git常用命令总结

三板斧

# 添加缓存区
git add . 
# 从缓存区加入本地当前分支
git commit -m "xxxx"
# 加入远程当前分支
git push

初始化及状态查询

# 初始化一个git项目
git init
# 查看状态
git status
git status -sb
# 查看修改
git diff
# 查看提交信息
git log

撤销指定 add

# 撤销指定文件的add
git rm --cached [file-name]
git reset HEAD  [file-name]
# 撤销全部add
git reset HEAD .

修改 commit 描述

# 修改commit描述
git commit -m --amend

版本回退

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 commitid可以通过git log查看
git reset --hard [commitid]

远程合并

# 从远程库获取最新代码
git fetch 
# 与当前本地代码进行合拼
git merge
# 前两者的合拼操作,出现冲突使用前两者比较多
git pull

分支操作

# 创建分支
git branch b
# 切换分支
git checkout b
# 切换到主分支
git checkout master