简介

Git 的作用

Git 是一个分布式版本管理系统,是 Linux 内核的创始人 Liunus Torvas 为了更好地管理 Linux 内核开发而开发的。

Git可以在任何时间点,把文档的状态作为更新记录保存起来。因此可以把编辑过的文档复原到以前的状态,也可以显示编辑前后的内容差异。

而且,编辑旧文件后,试图覆盖较新的文件的时候(即上传文件到服务器时),系统会发出警告,因此可以避免在无意中覆盖了他人的编辑内容。

基本概念

在 Git 系统中,对文件进行修改后,需要提交修改,执行提交后,Git 会记录上次提交的状态与当前状态的差异记录,并给当前版本分配一个 Hash 值作为唯一的命名。

凭借该提交和最新的文件状态,就可以知道过去的修改记录以及内容。 指定这个命名,就可以在代码库中找到对应的提交。

Git 的代码库分为远程代码库和本地代码库的两种。

  • 远程代码库: 配有专用的服务器,为了多人共享而建立的代码库。
  • 本地代码库: 为了方便用户个人使用,在自己的机器上配置的代码库。

本地仓库由三部分组成。第一个是你的工作区,它持有实际文件;第二个是暂存区,它像个缓存区域,临时保存你的改动;最后是仓库区

创建仓库

创建

  • 初始化仓库

    git init

    此命令将创建一个空白的仓库,仓库的配置信息以及未来仓库的更改记录将被存储在生成 .git 文件夹中。注意:在类 Unix 系统中,以 . 开头的文件名代表该文件为隐藏文件,默认不可见,使用 ls -a 命令可以显示隐藏文件夹。

  • 编辑 Git 配置文件 Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置) 使用以下命令来设置修改人的名称及邮箱地址,其中 --global 表示该设置作用在所有的仓库。

    git config [--global] user.name "your name"

    git config [--global] user.email "your email address"

    git config [--global] user.name "your name"
    git config [--global] user.email "your email address"
    
  • 添加修改到暂存区

    创建一个空白文本文件 readme.txt,使用 ls 命令,可以发现此文件,但是如果使用 git ls-files 则无法发现此文件,这是因为该文件还未被添加进入暂存区,git 不会追踪该文件,运行以下命令

    git add readme.txt

    我们将该文件添加进入暂存区。如果想要停止追踪该文件,我们使用 git rm readme.txt 命令,此时该文件被移出暂存区,但是该文件仍然存在工作区,不会被物理删除。

  • 提交暂存区的修改到仓库

    git commit -m "message"

    其中 -m 表示添加修改说明,该修改说明可以帮助找到区别不同版本。注意:每次提交修改到仓库,必须添加修改说明,否则无法成功。

中文乱码

使用 git ls-files 时,中文文件名可能会出现乱码现象,解决方案是运行

git config --global core.quotepath false。

Mac 系统下如果同时使用了 oh-my-zsh,则需要打开

  1. 打开oh-my-zsh配置文件 ~/.zshrc 。

  2. 在文件最后面添加如下代码:

    export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8

  3. 重启下终端(terminal)或输入 source ~/.zshrc

版本管理

版本回溯

  • 查看当前分支的版本历史

    git log

  • 版本回溯

    git reset --hard version-digest

    此时工作区和暂存区的文件全部被恢复为某版本,如果省去 --hard,则只有暂存区的文件被恢复。

查看差异

  • 显示暂存区和工作区的差异

    git status

  • 显示暂存区和工作区的差异

    git diff

  • 显示工作区与当前分支最新commit之间的差异

    git diff HEAD

撤销修改

git checkout -- 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

  • 恢复暂存区的指定文件到工作区

    git checkout [file]

  • 恢复暂存区的所有文件到工作区

    git checkout .

  • 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

    git reset [file]

  • 重置暂存区与工作区,与上一次commit保持一致

    git reset --hard

保存现场

  • 保存现场

    git stash

  • 恢复现场

    git stash pop

分支管理

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

创建分支

git branch [branch-name]

git checkout -b [branch] 新建一个分支,并切换到该分支

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的

切换分支

git checkout [branch-name] 切换到指定分支,并更新工作区

合并分支

git merge [branch] # 选择一个commit,合并进当前分支

删除分支

git branch -d [branch-name] # 删除分支

git cherry-pick [commit] # 选择一个commit,合并进当前分支 $ git cherry-pick [commit]

远程仓库

申请 GitHub 账号

创建远程仓库

连接远程仓库

git remote add origin https://github.com/username/repository_name git push -u origin master

将修改提交到远程仓库

git push -u origin master

下载远程仓库的所有变动

git fetch [remote]

  • 取回远程仓库的变化,并与本地分支合并, 相当于获取(fetch) 并合并(merge) 远端的改动

    git pull [remote] [branch]

  • 上传本地指定分支到远程仓库

    git push [remote] [branch]

    使用关键字 --force,强行推送当前分支到远程仓库,即使有冲突